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 (ISR = 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 Interruptroutinen Routine) verwendet wird, als volatile (flüchtig) definiert werden.
Variable werden im ➨SRAM und temporär in internen Registern des Prozessors gespeichert, bearbeitet oder verändert. Der Zugriff auf den SRAM ist aber relativ langsam, daher kann es vorkommen, dass der Wert der Variablen im SRAM durch eine neue Wertzuweisung für kurze Zeit nicht stimmt, da der letzte Wert zunächst nur in den 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.

➨Weitere Informationen zur Speicherverwaltung
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().
Im Beispielprogramm ist die rote LED beim Start ausgeschaltet.
Jeder Druck auf den Taster löst den Interrupt aus und solange der Taster gedrückt wird leuchtet die LED.
Beachte die Kommentare.
# define ROT 5
# 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);
}
Letzte Aktualisierung: