Antwort auf: Zu Aufgabe von Tag 6: UDP Button Erweiterung

Foren Adventskalender Zu Aufgabe von Tag 6: UDP Button Erweiterung Antwort auf: Zu Aufgabe von Tag 6: UDP Button Erweiterung

#791
Raabinator
Mitglied

Hallo Stefanie,

Du wolltest also die LED mit dem Taster bei Druck Ein-/Ausschalten. Hab ich wohl falsch verstanden.
Eine Variable „toggeln“ geht auch einfacher: led_an = !led_an;
Das späte Speichern des Schalterzustandes birgt die Gefahr, dass sich der Zustand gerade zwischen deiner Abfrage und dem Speichern ändert. Dann bekommst du einen Tastendruck nicht mit.
Das delay() am Ende in der Hauptschleife verzögert das gesamte Programm. Solange es nichts anderes machen soll ist das OK.
Besser ist es, sich nach der Tastenänderung die aktuelle Zeit zu merken (millis()) und vor erneuter Taster-Prüfung nachzusehen, ob bereits genug Zeit vergangen ist.

Beispiel:

unsigned long lastTime = 0L;  // merkt sich die Zeit der letzten Änderung
int buttonZuletzt = 0;  // letzter Zustand des Tasters
int led_an = 0;  // Zustand der LED
#define VERZOEGERUNG 30L

loop()
{
  // ... Mein übriges Programm, das gerne nicht verzögert wäre ...
  if((millis() - lastTime) >= VERZOEGERUNG)  // Genügend Zeit seit der letzten Änderung vergangen?
  {
    // ... ja, Taste auf Änderung prüfen und reagieren
    int buttonJetzt = digitalRead(schalter);  // einmal merken, ist sicherer
    if(buttonJetzt != buttonZuletzt)
    {
      // Zustand geändert
      buttonZuletzt = buttonJetzt;  // neuen Zustand merken
      lastTime = millis();  // Zeit der Änderung merken
      // ... Reaktion auf die Änderung
      if(!buttonJetzt)
      {
        // Gedrückt!
        led_an = !led_an;  // toggeln
        digitalWrite(led,led_an); // setze led entsprechend
      }
    }
  }
  // ... noch mehr Programm, das gerne nicht verzögert wäre ...
}
  • Diese Antwort wurde geändert vor 8 Jahren, 5 Monaten von Raabinator.