02 | 02 Eine LED mit einem Taster steuern
Den Zustand eines Tasters über die serielle Schnittstelle darzustellen, ist zwar ganz nett, aber unspektakulär. Diesmal werden wir als Feedback anstatt der seriellen Schnittstelle unsere LED einsetzen. Hierzu kombinieren wir den LED-Sketch und den Taster-Sketch aus den vorhergegangenen Übungen. Außerdem werden wir das if-Konstrukt kennenlernen, mit deren Hilfe im Programmfluss Entscheidungen getroffen werden können.
Der Sketch
In diesem Sketch wird die rote LED durch das Drücken eines Tasters zum Leuchten gebracht.
//*
Taster Sketch
*/
int ledPin = 13; //Pin für die LED
int buttonPin = 2; //Pin für den Taster
void setup()
{
pinMode(ledPin, OUTPUT); //LED-Pin als Ausgang deklarieren
pinMode(buttonPin, INPUT); //Taster als Eingang deklarieren
}
void loop()
{
int buttonState = digitalRead(buttonPin); //Variable für Tasterzustand
//und Tasterzustand abfragen
if (buttonState == HIGH) //Prüfen, ob Taster gedrückt wurde
{
// Dieser Teil wird ausgeführt, wenn buttonState HIGH ist
digitalWrite(ledPin, HIGH); //LED einschalten
}
else
{
// Dieser Teil wird ausgeführt, wenn buttonState LOW ist
digitalWrite(ledPin, LOW); //LED ausschalten }
}
Der Aufbau
Bei komplexere Schaltungen fange ich persönlich meist mit einer Art von Kabeln an: Verbinde zuerst alle Masse-Kabel, dann alle 5V Verbindungen und am Schluss die Signal-Leitungen.
Der Sketch im Detail
Da du ja schon die meisten Befehle kennst, werde ich sie nur kurz kommentieren. Wir bestimmen zunächst eine Variable des Typs int mit dem Namen tasterPin und weisen ihm den Wert 2 zu. Diese Variable benutzen wir für unseren Taster. Für die LED machen wir genau das gleiche: Wir bestimmen eine Variable des Typs int mit dem Namens ledPin und weisen ihm den Wert 13 zu.
int ledPin = 13; //Pin für die LED
int buttonPin = 2; //Pin für den Taster
Im void setup() teilen wir dem Arduino mit dem Befehl pinMode() mit, dass die LED über den Pin 2 (ledPin) als OUTPUT verwendet wird und der Taster über den Pin 13 (tasterPin) als INPUT konfiguriert werden soll.
void setup()
{
pinMode(ledPin, OUTPUT); //LED-Pin als Ausgang deklarieren
pinMode(buttonPin, INPUT); //Taster als Eingang deklarieren
}
Im Folgendem initialisieren wir eine Variable namens buttonState um die Werte des Tasters zwischenzuspeichern. Mit digitalRead(buttonPin) wird die Variable buttonState direkt mit dem Arduino-Pin verbunden: Die eingelesenen Werte werden direkt an buttonState weitergeleitet.
int buttonState = digitalRead(buttonPin); //Variable für Tasterzustand
//und Tasterzustand abfragen
Und nun der interessanteste Teil des Sketches – die if-else-Abfrage. Es handelt sich dabei um eine wenn... dann... ansonsten.. Konstruktion.
Auf unser Beispiel angewendet bedeutet es:
> Wenn (if) der Taster gerückt wird (buttoState == HIGH)
> dann schalte die LED an: digitalWrite(ledPin, HIGH)
> ansonsten (else) schalte die LED aus: digitalWrite(ledPin, LOW)
if (buttonState == HIGH)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
Im Grunde ist eine if-Abfrage eine verschlossene Box mit einem verborgenem Inhalt, der nur geöffnet wird, wenn der richtige Schlüssel verwendet wird. Der Inhalt wird nur dann freigegeben, wenn die Kondition innerhalb der runden Klammer erfüllt ist buttonState == HIGH (der Schlüssel). Wird die Kondition nicht erfüllt, springt das Programm weiter und ignoriert alle Anweisungen im sogenannten Schleifenkörper.
if (buttonState == HIGH)
Falls die Kondition erfüllt ist und nur dann, wird in den Schleifenkörper gesprungen und alle enthaltenen Befehle abgearbeitet. In unserem Beispiel wird die LED eingeschaltet. Hier können viele Befehle enthalten sein, nicht nur eine Zeile Code.
digitalWrite(ledPin, HIGH);
Vorsicht mit = und ==
Eine wichtige Sache müssen wir hier beachten. Du hast bereits gelernt, dass in der Programmierung ein Gleichheitszeichen= eine Zuweisung ist. Mit = verändern wir den Wert einer Variablen. Aber in unserer If-Abfrage wollen wir keinen Wert ändern, sondern vergleichen. Hierzu gibt es den Gleichheitsoperator ==.
if(buttonState == HIGH); //richtige Verwendung
if(buttonState = HIGH); //falsche Verwendung
Der Gleichheitsoperator == vergleicht „nur“ die Variable buttonState mit dem Zustand HIGH: Hat buttonState den Zustand HIGH? Die Verwechslung von Gleichheitsoperator== und Zuweisungsoperator= ist ein häufiger Anfängerfehler. Beide haben völlig unterschiedliche Funktionen und werden oft vertauscht.
Zurück zum Sketch. Falls die if-Abfrage nicht erfüllt wird, also die Taste nicht gedrückt wird (buttonState = LOW), dann wird der Schleifenkörper ignoriert und das Programm springt weiter in die Zeile else.
Else (ansonsten) ist eine Alternativ-Lösung. Else besitzt keine runden Klammern, da hier nichts abgefragt wird (=keine Kondition). Wurde zuvor der Schleifenkörper übersprungen, dann wird jetzt der Inhalt von else abgearbeitet. Im Körper von else wird in unserem Sketch die LED mit digitalWrite(ledPin, LOW) ausgeschaltet.
else
{
digitalWrite(ledPin, LOW);
}
Übungen
1. Falsche Verwendung von = und ==
Wie oben schon erwähnt verhält sich der Gleichheitsoperator == und der Zuweisungsoperator = unterschiedlich. Was wird passieren, wenn wir in der if-Abfrage den Zuweisungsoperator = benutzen? Welche Art von Fehlermeldung bekommen wir? Probiers zuerst aus und lies dann weiter.
if(buttonState = HIGH); //falsche Verwendung
Es wird keine Fehlermeldung auftauchen. Die if-Abfrage möchte als Ergebnis ein Boolean: Wahr oder nicht wahr (HIGH oder LOW). Da wir mit if(buttonState = HIGH) der buttonState-Variablen direkt den Wert HIGH zuordnen, ist die Kondition immer wahr. Der Inhalt der if-Abfrage wird bei jedem Programmdurchlauf aufgerufen, völlig egal, ob die Taste gerückt wurde oder nicht.
Übrigens würde folgende Zeile dafür sorgen, dass die if-Abfrage niemals aufgerufen wird, da die Kondition mit LOW nie wahr werden wird.
if(buttonState = LOW); //falsche Verwendung
Eine Verwechslung der beiden Zeichen führt zu Fehlern im Programm. Eine Fehlermeldung wird nicht ausgegeben. Solch ein Fehler ist eine harte Nuss und es kostet viel Zeit diese ausfindig zu machen.
2. Benutze einen zweiten Taster
Benutze zwei Taster und erweitere den oberen Sketch so, dass beim Drücken des zweiten Tasters die grüne LED leuchtet und beim Loslassen erlischt. Schreibe für den neuen Taster eine zweite if-Abfrage.
3. Lass die LED blinken
Benutze den Aufbau aus der Aufgabe 2 mit den zwei Tastern. Schreibe den Sketch so um, dass die LED 3x blinkt, wenn du auf den zweiten Taster drückst.