Wird der Taster über eine längere Zeit gedrückt gehalten, wechselt das ausgesendete Signal immer wieder zwischen HIGH und LOW. Dies führt zu unerwünschten Effekten.
Im Beispiel wird die LED ein- und wieder ausgeschaltet solange der Taster gedrückt wird. Eigentlich sollte der Taster die LED einschalten und beim erneuten Drücken wieder ausschalten. Das delay(200) führt nicht immer zum gewünschten Ergebnis.
Der Schaltplan:
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 Bibliothek Bounce2
Sketch -> Bibliothek einbinden -> Bibliotheken 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: