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 Methode (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 die Variable, die eine Statusänderung anzeigt, als volatile definiert werden.
Variable werden im RAM und temporär im SRAM gespeichert, bearbeitet oder verändert. Es kann vorkommen, dass der Zustand der Variablen im ➨Flashspeicher und im ➨SRAM durch eine neue Wertzuweisung für kurze Zeit nicht übereinstimmen.
Das Schlüsselwort volatile weist das Programm an, die Variable immer aus dem Flashspeicher und nicht vom SRAM zu laden. Damit wird garantiert, dass der jeweils aktuelle Wert geladen wird.

➨Weitere Informationen zur Speicherverwaltung
Außerdem sind bei der Programmierung einer Interrupt-Methode 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);
// Vorwiderstand einschalten
pinMode(TASTER, INPUT_PULLUP);
/*
wenn der Taster gedrückt wird
→ Methode 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: