- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Mit Knopf LED einschalten und mit Timer ausschalten

  1. #1

    Mit Knopf LED einschalten und mit Timer ausschalten

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo liebe Gemeinschaft

    ich bin ziemlich neu im Bereich der Arduino programmierung, bitte vergebt mir daher das Unwissen.
    Folgendes Problem versuche ich zu lösen:

    Ich möchte eine LED über einen Schalter einschalten, diese sollte für eine vordefinierte Zeit leuchten und von alleine wieder aus gehen. Mit dem Delay Befehl habe ich es geschafft, allerdings möchte ich das ganze lieber mit dem millis() Befehl durchführen, um das komplette Programm nicht zu beeinflussen.
    Die LED soll über eine KSQ mithilfe von PWM hoch- und herunterdimmen.

    Hier ist der Code, den ich geschrieben habe. Leider leuchtet in diesem Fall die LED nur, wenn man den Taster drückt. Beim Loslassen geht sie direkt wieder aus.
    Kann mir jemand meinen Fehler zeigen?

    Code:
    int LED=9;
    int taster=8;
    int tasterstatus=0;
    unsigned long timer;
    
    void setup()
    {
      pinMode(LED, OUTPUT);
      pinMode(taster, INPUT);
    }
    
    void loop()
    {
      tasterstatus=digitalRead(taster);
        
      if(tasterstatus == HIGH)  
      { 
        timer = millis(), digitalWrite(LED, LOW);
      } 
      else
      {
        digitalWrite(LED, HIGH);
      }
        
      if (millis() - timer >=3000)
      {
        digitalWrite(LED, HIGH);
      }
    
    }
    Aufgrund der KSQ sind die HIGH und LOW Werte für die LED vertauscht.



    Und hier der Code, in der die LED dimmen kann, allerdings mit dem Delay Befehl den ich gern ersetzen würde

    Code:
    int LED=9;
    int taster=8;
    int tasterstatus=0;
    int faderschritte = 30;
    int faderschritte_down = 5;
    
    
    
    void setup()
    {
      pinMode(LED, OUTPUT);
      pinMode(taster, INPUT);
    }
    
    void loop()
    {
      tasterstatus=digitalRead(taster);
      if(tasterstatus == HIGH)
      {
        for (int helligkeit = 255; helligkeit >0;)
        {
          analogWrite(LED, helligkeit);
          helligkeit = helligkeit - faderschritte;
          delay(30);
        }
        
        delay (3000);
        
        for (int helligkeit = 0; helligkeit < 255;)
        {
          analogWrite(LED, helligkeit);
          helligkeit = helligkeit + faderschritte_down;
          delay(25);
        }
        
      }
      else
      {
        digitalWrite(LED, HIGH);
      }
    
    }
    Geändert von darksider (15.12.2014 um 19:37 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    Beim ersten Programm ist der Fall klar:
    Wenn gedrückt, einschalten-soweit richtig.
    Aber wenn nicht gedrückt: ausschalten?
    Klar geht sie sofort aus wenn du den Taster los lässt.
    Zumindest sollte der laufende Timer dort mit rein, ungefähr so:

    if(taster_losgelassen && timer_abgelaufen)
    {
    machsLichtAus;
    }
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Ich würds so lösen:
    Code:
    #define LED_PIN  9
    #define TASTER_PIN  8
    #define DELAYTIME  3000 // 3 sec
    unsigned long tasterMoment;
    
    void setup() 
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(TASTER_PIN, INPUT);
    }
    
    void loop() {
      if(digitalRead(TASTER_PIN)) 
      { 
        tasterMoment= millis();
        digitalWrite(LED_PIN, LOW);
      }   
      if (millis() - tasterMoment >= DELAYTIME) 
      {
        digitalWrite(LED_PIN, HIGH);
      }
    }

  4. #4
    Vielen Dank für eure Antworten.
    Das heißt, ich frage vor der Anweisung die aktuelle Zeit ab, speicher sie in einer Variablen und ziehe diese nachher wieder von der aktuellen Zeit ab... Okay, hab's soweit

    Können in dem Programm 2 alle Delay Funktionen ebenfalls durch millis() ersetzt werden? Müsste ich dann mehrere Timer laufen lassen?!

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Können in dem Programm 2 alle Delay Funktionen ebenfalls durch millis() ersetzt werden? Müsste ich dann mehrere Timer laufen lassen?!
    Versuch mal so:
    Code:
    #define TIMER_AUS  -1
    #define TIMER_AN    0
    #define LED_PIN     9
    #define TASTER_PIN  8
    #define TICTIME    30 // 30 ms
    #define TICCOUNTMAX 100
    
    void setup() {
      pinMode(LED_PIN, OUTPUT);
      pinMode(TASTER_PIN, INPUT);
    }
    
    void loop() {
     timer();
     // tue was anderes
    }
    
    void timer() {
      static unsigned long tic = millis();
      static int ticcount = TIMER_AUS;  
      if(millis() - tic > TICTIME && ticcount >= TIMER_AN) // 30 ms vergangen und Timer gestartet?
      {
        tic = millis();                // nächsten 30ms Zyklus starten
        ticcount++;
        if (ticcount > TICCOUNTMAX) {  // Timer fertig?
          ticcount = TIMER_AUS;
          digitalWrite(LED_PIN, HIGH);
        }
        else
          blinkfunction(ticcount);    // Timer läuft noch -> blinkfunction() 
      }
      if(digitalRead(TASTER_PIN))     // Taste betätigt? Timer startet (neu)
        ticcount = TIMER_AN;
    }
    
    void blinkfunction(int ticcount)  // in 30 ms Zeitabständen aufgerufen
    {                                 // ticcount wird jeden Aufruf um 1 erhöht
      digitalWrite(LED_PIN, LOW);  
    }
    Die Funktion blinkfunction(int ticcount) kannst du jetzt so umbauen, wie du willst. Also in Abhängigkeit von ticcount die Led dimmen. Z.B.
    if(ticcount < 32) analogWrite(ticcount*8-1);...
    Geändert von Sisor (15.12.2014 um 21:17 Uhr)

Ähnliche Themen

  1. LED per PWM einschalten und dimmen PROBLEM
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 14.02.2014, 16:35
  2. Lichtschranke/Sensor zum ein- und ausschalten von LED-Stipes
    Von Timoletto im Forum Sensoren / Sensorik
    Antworten: 11
    Letzter Beitrag: 15.12.2012, 19:50
  3. Lampen mit RN-controll an- und ausschalten
    Von cricri im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 18.01.2011, 09:22
  4. Led mit Taster ein- und ausschalten
    Von Nullinger im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 30.01.2009, 13:00
  5. PWM mit Timer 0 und 2 geht, aber nicht mit Timer 1 (mega64)
    Von popi im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.06.2006, 16:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen