Für dieses Projekt benötigst du
Aufgabe Nr. 25 : Das Leuchten einer LED durch einen Tastendruck unterbrechen
In dieser Aufgabe möchten wir das durchgehende Leuchten einer LED mit Hilfe eines Tasters unterbrechen.
Anschließend soll das Leuchten der LED fortgesetzt werden.
Der Schaltplan
Unser Taster wird an Pin 2 des Arduinos angeschlossen.
Unsere LED wird an Pin 7 des Arduinos angeschlossen.
Das Programm im Film
Erklärung des Programms
Bisher haben wir eine LED entweder ein- oder ausgeschaltet (zum Beispiel mit einem delay), doch nie eine bestehende Aktion unterbrochen. Dies gelingt uns nun mit dem sogenannten Interrupt-Befehl.
Es gibt verschiedene Ereignisse, die den Interrupt auslösen können:
Erklärung zum Befehl attachInterrupt
attachInterrupt(digitalPinToInterrupt(Taster), TasterUnterbricht, CHANGE);
Der Taster wird einem Interrupt zugeordnet (attachInterrupt).
Mit digitalPinToInterrupt wird der Pin des Tasters dem Interrupt zugewiesen.
Wenn der Taster betätigt wird, löst er den Interrupt aus. Als Bedingung wird CHANGE definiert, der Interrupt wird also ausgelöst, wenn der Zustand sich von HIGH zu LOW ändert.
Der normale Programmablauf wird unterbrochen und die festgelegte Funktion (Interrupt-Service-Routine) TasterUnterbricht wird ausgeführt. Anschließend wird das Programm normal fortgesetzt.
Der Taster muss zwingend am Pin 2 oder Pin 3 angeschlossen werden.
Zusätzlich muss eine Variable, die im Hauptprogramm und in Interruptroutinen verwendet wird, als volatile definiert werden.
Es kann vorkommen, dass der Wert einer Variablen im Speicher durch eine neue Wertzuweisung für kurze Zeit nicht stimmt.
Das Schlüsselwort volatile weist das Programm an, die Variable immer aktuell im Speicher zu halten. Damit wird garantiert, dass der jeweils aktuelle Wert verwendet wird.
Die Definition einer Variablen muss also mit dem Schlüsselwort volatile erweitert werden:
volatile int TasterStatus = 0;
Das Programm
// Der Taster wurde an Pin 2 angeschlossen
const int Taster = 2;
// Die LED wurde an Pin 7 angeschlossen
const int LED = 7;
// Variable die den Status des Taster ausliest
volatile int TasterStatus = 0;
void setup()
{
pinMode(LED, OUTPUT); // hier wird die LED als OUTPUT definiert
pinMode(Taster, INPUT_PULLUP); // hier wird der Taster als INPUT definiert
attachInterrupt(digitalPinToInterrupt(Taster), TasterUnterbricht, CHANGE);
}
void loop()
{
// bleibt leer
// das Programm reagiert nur auf den Interrupt TasterUnterbricht()
}
void TasterUnterbricht()
{
/*
sobald die Unterbrechung "TasterUnterbricht"
durch Drücken des Tasters aktiviert wird
ändert sich der Wert am Pin 2 des Taster von HIGH zu LOW
nun wird die LED an Pin 7 in den zuvor ermittelten Tasterstatus (LOW) versetzt
die LED wird ausgeschaltet
*/
TasterStatus = digitalRead(Taster);
digitalWrite(LED, TasterStatus);
}
Funduino - Dein Onlineshop für Mikroelektronik
-
Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
-
Mehr als 3.500 Artikel sofort verfügbar!
-
Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.