Tas­ter entprellen

Lese­zeit: 3 Minu­ten

Wird der Tas­ter über eine län­ge­re Zeit gedrückt gehal­ten, wech­selt das aus­ge­sen­de­te Signal immer wie­der zwi­schen HIGH und LOW. Dies führt zu uner­wünsch­ten Effekten.

Im Bei­spiel wird die LED ein- und wie­der aus­ge­schal­tet solan­ge der Tas­ter gedrückt wird. Eigent­lich soll­te der Tas­ter die LED ein­schal­ten und beim erneu­ten Drü­cken wie­der aus­schal­ten. Das delay(200) führt nicht immer zum gewünsch­ten Ergebnis.

int LED = 6;
int TASTER = 7;
int TasterLesen;

/*
   setzt den Status
   Status true -> LED an
   Status false -> LED aus
   beim Start soll die LED ausgeschaltet sein
*/
bool Status = false;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(TASTER, INPUT_PULLUP);
}
void loop()
{
  TasterLesen = digitalRead(TASTER);
  if (TasterLesen == LOW)
  {
    delay(200);

    // LED ist aus → Status == false
    if (Status == false)
    {
      digitalWrite(LED, HIGH);
      // Status auf true (an) setzen
      Status = true;
    }

    // LED ist an → Status == true
    else if (Status == true)
    {
      digitalWrite(LED, LOW);

      // Status auf false (aus) setzen
      Status = false;
    }
  }
}

Der Schalt­plan:

Lösung mit millis

// Variablen für die mit millis() ermittelte Zeit
// damit nur jeweils ein Tasterdruck erkannt wird
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

int LED = 6;
int TASTER = 7;

// Zustand der LED: ein- oder ausgeschaltet
bool ZustandLED = false;

void setup() 
{
  pinMode(LED, OUTPUT);
  pinMode(TASTER, INPUT_PULLUP);
}

void loop() 
{
  int Tasterdruck = digitalRead(TASTER);

  // Taster wurde gedrückt
  if (Tasterdruck == 1) 
  {
    // aktuelle Zeit sichern
    Startzeit = millis();

    /*
      bei mehr als 50 Millisekunden Differenz
      zwischen der aktuellen und der gesicherten Zeit
      kann der Taster als gedrückt betrachtet werden
      -> ZustandLED umdrehen
      aus false wird true LED einschalten
      aus true wird false -> LED ausschalten
    */
    if (Startzeit - GesicherteStartZeit > 50) 
    {
      ZustandLED = !ZustandLED;
    }

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
    digitalWrite(LED, ZustandLED);
  }
}

Lösung mit der Biblio­thek Bounce2

Sketch -> Biblio­thek ein­bin­den -> Biblio­the­ken verwalten


// Bibliothek Bounce einbinden
# include <Bounce2.h>

// Bounce starten
// Namen des Objekts Bounce (TasterGedrueckt) festlegen
Bounce TasterGedrueckt = Bounce();

int LED = 6;
int TASTER = 7;

// Zustand der LED: ein- oder ausgeschaltet
bool ZustandLED = false;

void setup() 
{
  pinMode(LED, OUTPUT);

  /*
    Namen des Objekts Bounce (TasterGedrueckt) dem Taster zuordnen (attach)
    Zeitintervall einstellen
    INPUT_PULLUP -> Vorwiderstand einschalten
  */
  TasterGedrueckt.attach(TASTER, INPUT_PULLUP);
  TasterGedrueckt.interval(20);
}

void loop() 
{
  // Tasterstatus abfragen
  if (TasterGedrueckt.update()) 
  {
    // Taster wurde gedrückt, das Signal ist gefallen
    if (TasterGedrueckt.fell())
    {
      // LED ist aus → ZustandLED == false
      if (ZustandLED == false) 
      {
        digitalWrite(LED, HIGH);

        // Status auf true (an) setzen
        ZustandLED = true;
      }

      // LED ist an → Status == true
      else if (ZustandLED == true) 
      {
        digitalWrite(LED, LOW);

        // Status auf false (aus) setzen
        ZustandLED = false;
      }
    }
  }
}

Letzte Aktualisierung: 25. Jul 2023 @ 8:53