Ein Taster löst mit Hilfe eines Interrupts ein Ereignis aus: die LED leuchtet, solange der Taster gedrückt wird.
Der loop-Teil jedes Programms wird schrittweise abgearbeitet. Es ist nicht möglich gleichzeitig einen anderen Befehl auszuführen.
Beispiel:
Jeder delay()-Befehl stoppt den Programmablauf für die angegebene Zeit. In dieser Zeit kann kein anderer Befehl ausgeführt werden.
Dennoch gibt es dafür eine Lösung:
Ein Taster kann einem Interrupt zugeordnet werden (attachInterrupt). Wenn der Taster betätigt wird, löst er den Interrupt aus. Der normale Programmablauf wird unterbrochen und die festgelegte Funktion (Interrupt-Service-Routine) wird ausgeführt. Anschließend wird das Programm normal fortgesetzt.
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE);
Der Taster löst den Interrupt aus, die Interrupt-Service-Routine LEDSchalten wird aufgerufen. Der Interrupt soll auf einen Wechsel des Tasterzustands (LOW oder HIGH) reagieren.
Es gibt verschiedene Ereignisse, die den Interrupt auslösen können:
RISING | FALLING | CHANGE |
---|---|---|
der Interrupt wird ausgelöst wenn sich der Status von LOW zu HIGH ändert | der Interrupt wird ausgelöst wenn sich der Status von HIGH zu LOW ändert | der Interrupt wird ausgelöst wenn sich der Status ändert |
Am Arduino UNO und bei der Arduino Nano-Familie muss der Taster zwingend am Pin 2 oder Pin 3 angeschlossen werden.
Der Arduino WiFi Rev 2 kann alle digitalen Pins benutzen, die Arduino MKR-Boards verfügen über die Pins 0, 1, 4, 5, 6, 7, 8, 9 als Interrupt-Pins.
Zusätzlich muss eine Variable, die im Hauptprogramm und in Interrupt-Funktionen verwendet wird, als volatile definiert werden.
Variable werden im RAM und temporär in internen Registern des Prozessors gespeichert, bearbeitet oder verändert. Es kann vorkommen, dass der Zustand der Variablen im ➨SRAM durch eine neue Wertzuweisung für kurze Zeit nicht stimmt, da der letzte Wert zunächst nur in Prozessorregistern liegt.
Das Schlüsselwort volatile weist das Programm an, die Variable immer aktuell im SRAM zu halten. Damit wird garantiert, dass der jeweils aktuelle Wert geladen wird.
Außerdem sind bei der Programmierung einer Interrupt-Funktion einige Regeln zu beachten:
- Der Programmteil muss so kurz wie möglich sein.
- Verwende kein delay().
- Benutze auch kein Serial.print().
Benötigte Bauteile:
- LED
- Widerstand 220 Ω
- Taster
- Leitungsdrähte
Beachte die ➨Vorwiderstände verschiedener LEDs
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Im Beispielprogramm ist die rote LED beim Start ausgeschaltet.
Jeder Druck auf den Taster löst den Interrupt aus und schaltet die LED solange ein.
Beachte die Kommentare.
# define ROT 5
// nur Port 2 und 3 können mit
// attachInterrupt angesprochen werden
# define TASTER 2
/*
je nach Zustand der Variable TasterStatus ist die LED ein-
oder ausgeschaltet
beim Start des Programms ist sie ausgeschaltet
*/
volatile bool TasterStatus = LOW;
void setup()
{
pinMode(ROT, OUTPUT);
// Eingangspegel auf HIGH setzen
pinMode(TASTER, INPUT_PULLUP);
/*
wenn der Taster gedrückt wird
→ Funktion LEDSchalten aufrufen
CHANGE → es ist eine Veränderung eingetreten,
der Taster wurde gedrückt
*/
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE);
}
void loop()
{
// nichts zu tun
// das Programm reagiert nur auf den Interrupt
}
void LEDSchalten()
{
// TasterStatus wird gelesen
TasterStatus = digitalRead(TASTER);
/*
TasterStatus muss "umgedreht" werden
weil TasterStatus bei gedrücktem Taster den Wert LOW hat
die LED aber leuchten soll
*/
digitalWrite(ROT, !TasterStatus);
}
Verwandte Anleitungen:
- Interrupt: Lauflicht
- Interrupt - Lauflicht mit Drehgeber
- Interrupt: Licht ein- und ausschalten
- Interrupt: Licht schalten mit Bewegungsmelder
- Interrupt: Farbenspiel mit einem NeoPixel-Ring
- Interrupt: Lauflicht mit Fernbedienung
Letzte Aktualisierung: