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

#761
Raabinator
Mitglied

Hallo Stefanie.

Ich nehme an, du möchtest nur auf eine Zustandsänderung des Buttons reagieren. Momentan wird in jedem Durchlauf von loop() nur der aktuelle Zustand an die LED übertragen.
Um auf diese Schaltflanken zu reagieren, musst du dir den letzten Zustand des Button zwischenspeichern und dann diesen immer mit dem aktuellen Zustand des Button vergleichen.
Zunächst erzeugst zu dir über Setup() eine sogenannte globale Variable:
int buttonZuletzt;
Am Ende von setup() initialisierst du diese Variable mit dem Zustand des Button:
buttonZuletzt = digitalRead(schalter);
In loop() vergleichst du nun immer den Zustand mit dem in der Variablen. Hat er sich geändert, dann reagierst du darauf. Aber nicht vergessen, den dann neuen Zustand wieder merken.

loop()
{
  if(buttonZuletzt != digitalRead(schalter))
  {
    // Änderung hat stattgefunden
    if(buttonZuletzt)
    {
      // buttonZuletzt war <>0, also nicht gedrückt (low-aktiv)
      // muss dann jetzt gedrückt sein
      digitalWrite(led, 1);  // LED ein
      Serial.println("gedrückt");
      buttonZuletzt = 0;  // merken, dass jetzt gedrückt
    }
    else
    {
      // buttonZuletzt war =0, also gedrückt (low-aktiv)
      // muss dann jetzt nicht gedrückt sein
      digitalWrite(led, 0);  // LED aus
      Serial.println("losgelassen");
      buttonZuletzt = 1;  // merken, dass nicht mehr gedrückt
    }
    delay(30);  // zum entprelen verzögern (einfache Version)
  }
}

Das delay(30) am Ende benötigst du, um dem Button Zeit zu geben (30ms), seinen Kontakt vollständig zu öffnen oder zu schließen. Dein Controller ist nämlich so schnell, dass er ohne mehrere Zustandswechsel erkennen würde, obwohl der Button nur einmal betätigt wurde.

Ich hoffe, damit ist dir etwas geholfen.