Tas­ter entprellen

Lese­zeit: 4 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.

Der Schalt­plan:

int LED = 7;
int TASTER = 8;
int TasterDruck;
/*
   setzt den ZustandLED
   ZustandLED true -> LED an
   ZustandLED false -> LED aus
   beim Start soll die LED ausgeschaltet sein
*/
bool ZustandLED = false;

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

  // Pin 7 auf HIGH setzen
  pinMode(TASTER, INPUT_PULLUP);
}

void loop()
{
  TasterDruck = digitalRead(TASTER);

  // der Pin 7 wurde auf HIGH gesetzt -> gedrückt = LOW
  if (TasterDruck == LOW)
  {
    delay(200);

    // LED ist aus → ZustandLED == false
    if (ZustandLED == false)
    {
      digitalWrite(LED, HIGH);

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

    // LED ist an → ZustandLED == true
    else if (ZustandLED == true)
    {
      digitalWrite(LED, LOW);
      
      // ZustandLED auf false (aus) setzen
      ZustandLED = false;
    }
  }
}

Es geht auch kürzer:

int LED = 7;
int TASTER = 8;
int TasterDruck;

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

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

  // Pin 7 auf HIGH setzen
  pinMode(TASTER, INPUT_PULLUP);
}

void loop()
{
  TasterDruck = digitalRead(TASTER);

  // der Pin 7 wurde auf HIGH gesetzt -> gedrückt = LOW
  if (TasterDruck == LOW)
  {
    delay(200);

    /*
      ZustandLED umdrehen
      aus false wird true LED einschalten
      aus true wird false -> LED ausschalten
    */
    ZustandLED = !ZustandLED;

    // LED schalten: false = aus, true = an
    digitalWrite(LED, ZustandLED);
  }
}

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 = 7;
int TASTER = 8;

// 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 == LOW) 
  {
    // 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 = 7;
int TASTER = 8;

// 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())
    {
      /*
        ZustandLED umdrehen
        aus false wird true LED einschalten
        aus true wird false -> LED ausschalten
      */
      ZustandLED = !ZustandLED;

      // LED schalten: false = aus, true = an
      digitalWrite(LED, ZustandLED);
    }
  }
}

Letzte Aktualisierung: 29. Apr 2024 @ 10:43