Lektion 12 – Der Taster und if-Abfrage
Das Programm soll die LED einschalten, wenn der Taster gedrückt wird und abschalten, wenn der Taster nicht mehr gedrückt wird. Ich schlage vor, wir starten mit unserem Blink-Beispiel.
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); }
Das Programm kennst du ja bereits (siehe auch Lektion 7). Wir werden es jetzt einfach umbauen.
Ich schlage vor, dass wir die Pin-Nummer, an welche der Taster angeschlossen ist, wieder in einer Variable speichern.
int tasterPin = 11;
Dann müssen wir dem Arduino-Board sagen, dass wir den Pin als Eingabe verwenden wollen. Der Befehl dafür lautet:
pinMode(tasterPin,INPUT);
Du hast es schon gemerkt, oder? Der Befehl ist der gleiche wie der für die LED. Wir sagen einfach nur, dass wir jetzt keinen OUTPUT, sondern einen INPUT verwenden wollen.
Um herauszufinden, ob der Taster gedrückt (HIGH) oder nicht gedrückt (LOW) ist, können wir den folgenden Befehl verwenden:
digitalRead(tasterPin);
Bisher haben wir nur Befehle verwendet, die keine Ergebnisse liefern. Dieser hier sagt aber HIGH oder LOW, wenn wir ihn verwenden. Das nennt man den Rückgabewert.
Schwer? Na gut. Stell dir vor, es würde eine Methode geben, die summe (a,b) heißt. Die Parameter a und b wären zwei Zahlen, die wir zusammen rechnen wollen. Das Ergebnis wird von der Methode als Rückgabewert übertragen. Um nun herauszufinden, wie das Ergebnis ist, müssen wir das Ergebnis auslesen. Das geht so: c = summe (a,b); Jetzt ist das Ergebnis in der Variable c gespeichert.
Der Befehl digitalRead(tasterPin); liefert entweder HIGH oder LOW zurück. Aber wie finden wir denn nun heraus, ob das Ergebnis HIGH oder LOW ist? Dafür gibt es eine der Wichtigsten Konstruktionen in der Programmierung: die if-Abfrage.
Die if-Abfrage
Mit dieser Abfrage können wir testen, ob eine Aussage wahr oder falsch ist. Nehmen wir an, du hast rote und blaue Bausteine vermischt und du willst sie in zwei Boxen sortieren. Wie würdest du das machen?

Vielleicht so:
- nimm einen Baustein
- prüfe, ob der Baustein rot ist
- wenn er rot ist, packe den Stein in Box A
Genau so benutzt man die if-Abfrage. Es ist also eigentlich ganz einfach. So wird sie geschrieben. Achte auf die zwei Gleichheitszeichen hintereinander. Das ist bei einer if-Abfrage sehr wichtig.
if (Baustein==rot) { packe Stein in Box A }
So, jetzt könnten wir alle roten Bausteine in Box A packen, würden aber alle blauen Steine nach der Überprüfung einfach liegen lassen. Wie kommen die jetzt in Box B? Ein Vorschlag:
- nimm einen Baustein
- prüfe, ob der Baustein rot ist
- wenn er rot ist, packe den Stein in Box A
- sonst packe ihn in Box B
Gut, oder? Und so könnten wir das programmieren:
if (Baustein==rot) { packe den Stein in Box A } else { packe den Stein in Box B }
Wir benutzen also das Wort else. Das trifft sich gut, denn else heißt auf Deutsch sonst.

Hast du den grünen Stein gesehen? Der wandert auch in Box B, denn wir fragen ja nicht, ob der Baustein blau ist, sondern nur: Ist er rot oder ist er nicht-rot? 😉
Nun aber zurück zu unserem Programm. Das sieht bisher so aus und muss verändert werden:
int ledPin = 9; int tasterPin = 11; void setup(){ pinMode(ledPin,OUTPUT); pinMode(tasterPin,INPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); }
Die if-Abfrage für den Button fragt, ob der Button HIGH ist:
if (digitalRead(tasterPin)==HIGH){ }
Wenn der Button HIGH ist, soll die LED eingeschalten werden:
if (digitalRead(tasterPin)==HIGH){ digitalWrite(ledPin, HIGH); }
Ansonsten (else) soll sie ausgeschaltet werden:
if (digitalRead(tasterPin)==HIGH){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); }
Hier noch mal das ganze Programm:
int ledPin = 9; int tasterPin = 11; void setup(){ pinMode(ledPin,OUTPUT); pinMode(tasterPin,INPUT); } void loop(){ if (digitalRead(tasterPin)==HIGH){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
Funktioniert es? Super. Jetzt versuche das Programm so umzuschreiben, dass die LED aus geht, wenn der Taster gedrückt ist. Die Lösung findest du hier:
Es gibt viele Lösungen. Hier zwei Vorschläge:
int ledPin = 9; int tasterPin = 11; void setup(){ pinMode(ledPin,OUTPUT); pinMode(tasterPin,INPUT); } void loop(){ if (digitalRead(tasterPin)==LOW){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
Oder:
int ledPin = 9; int tasterPin = 11; void setup(){ pinMode(ledPin,OUTPUT); pinMode(tasterPin,INPUT); } void loop(){ if (digitalRead(tasterPin)==HIGH){ digitalWrite(ledPin, LOW); } else { digitalWrite(ledPin, HIGH); } }
Das war jetzt aber gar nicht so einfach. Schön, dass du es trotzdem geschafft hast. Jetzt kennst Du schon die wichtigsten Dinge beim Programmieren: Variablen, Schleifen und if-Abfragen. Weiter so! Von jetzt an wird alles viel einfacher. Versprochen.
Axel Sturmeit 7. Dezember 2014
Hallo,
in der Lektion 12 ist m. E. ein Fehler. Warum wird nicht die deklarierte Variable tasterPin in der loop-Methode benutzt, sondern (die nicht deklarierte Variable) buttonPin? Ich vermute mal, dass hier einfach eingedeutscht wurde! Nur halt leider nicht überall.
Für Anfänger ist so etwas natürlich schon ein kleine Hürde.
int ledPin = 9;
int tasterPin = 11;
void setup(){
pinMode(ledPin,OUTPUT);
pinMode(tasterPin,INPUT);
}
void loop(){
if (digitalRead(buttonPin)==LOW){
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
Stefan Hermann 7. Dezember 2014
Oh ja, vielen Dank für die Info. Das war wirklich noch nicht übersetzt.
Andreas Lodyga 28. Januar 2015
Hallo,
ich bin etwas verwirrt über die Aufgabenstellung für die Übung in Lektion 12:
„Jetzt versuche das Programm so umzuschreiben, dass die LED an geht, wenn der Taster gedrückt ist. Die Lösung findest du hier“
Das macht aber das vorhandene Programm doch schon, oder? Sollte es nicht heißen: Schreibe das Programm so um, dass die LED aus geht, wenn der Taster gedrückt wird? Zumindest wird nach meinem Verständnis genau das erreicht, indem man das Programm wie in der Lösung ändert.
Stefan Hermann 28. Januar 2015
Hallo Andreas,
stimmt. Vielen Dank. Das werde ich gleich abändern.
Liebe Grüße
Stefan“
Alois 26. April 2015
Zur weiteren Erhöhung der präzisen Darlegungen schlage ich vor:
Den Absatz über den grünen Baustein (Lektion 12) abändern zu:
„Hast du den grünen Stein gesehen? Der wandert auch in Box B, denn wir fragen ja nicht, ob der Baustein blau ist, sondern nur:
Ist er rot oder nicht-rot?“
Als Anlehnung an „wahr oder nicht-wahr“.
FG an Alle
Stefan Hermann 27. April 2015
Sehr gute Idee. Schon geändert
Christian 4. Mai 2015
Ich komme nicht weiter an diesem Punkt. Ich habe jetzt mehrmals das Breadboard und meinen Code kontrolliert, kann aber einfach keinen Fehler entdecken. Trotzdem wird beim Versuch zu verifizieren eine lange Reihe an Fehlermeldungen angezeigt:
Arduino: 1.6.3 (Mac OS X), Platine: „Arduino Uno“
sketch_may04a.ino: In function ‚void loop()‘:
sketch_may04a.ino:11:25: error: too few arguments to function ‚void digitalWrite(uint8_t, uint8_t)‘
In file included from sketch_may04a.ino:1:0:
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:126:6: note: declared here
void digitalWrite(uint8_t, uint8_t);
^
sketch_may04a.ino:11:32: error: expected ‚;‘ before ‚)‘ token
sketch_may04a.ino:13:25: error: too few arguments to function ‚void digitalWrite(uint8_t, uint8_t)‘
In file included from sketch_may04a.ino:1:0:
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:126:6: note: declared here
void digitalWrite(uint8_t, uint8_t);
^
sketch_may04a.ino:13:31: error: expected ‚;‘ before ‚)‘ token
Fehler beim Kompilieren.
Ich bin heiß darauf, weiterzumachen und würde mich sehr über Hilfe freuen
Stefan Hermann 5. Mai 2015
Hallo Christian,
klar, da helfe ich gerne. Es sieht so aus, als ob Du ein Semikolon vergessen hast. Wenn Du es nicht findest, poste doch mal den Code hier, dann gucke ich mal drüber.
Liebe Grüße
Stefan
Christian 5. Mai 2015
Ja das hatte ich aus dem Zusammenhang geschlossen. 😉 Aber bisher konnte ich kein fehlendes Semikolon finden. Hier der Code:
int ledPin = 9;
int tasterPin = 11;
void setup() {
pinMode(ledPin,OUTPUT);
pinMode(tasterPin,INPUT);
}
void loop() {
if (digitalRead(tasterPin)==HIGH){
digitalWrite(ledPin), HIGH);
} else {
digitalWrite(ledPin), LOW);
}
}
Stefan Hermann 5. Mai 2015
Hallo Christian,
super! Ich glaube, wir kommen dem Problem näher.
Du hast einfach zweimal eine Klammer zuviel:
digitalWrite(ledPin), HIGH);
und
digitalWrite(ledPin), LOW);
Der Befehl digitalWrite(Pin, Zustand); bekommt die zwei Parameter. Da kommen die Klammern außen rum.
Bei digitalRead(pin) gibt es nur ein Parameter, vielleicht hat Dich das abgelenkt.
Liebe Grüße
Stefan
Christian 6. Mai 2015
Vielen Dank, die beiden Klammern waren es.
Pius 4. März 2016
Hallo,
bei mir will es nicht klappen, da es irgendein problem mit meinem „else“ gibt. dieses wird, obwohl ich nach langem rätseln sogar den code kopiert habe nicht rot.
Stefan Hermann 5. März 2016
Hast Du es trotzdem mal versucht, das Programm auf das Arduino zu übertragen?
Pius 5. März 2016
Ja es hat dann schon geklappt.. Es hat am Anfang nicht funktioniert und deswegen dachte ich das mit dem Code irgendwas nicht stimmt, aber es hatt sich dann herausgestellt das die ganzen taster aus dem Starterkit defekt sind…. Ich hatte noch einen anderen rumliegen mit welchem das dann geklappt hat 😉 *yay
Vielen Dank für für die Hilfe
Lg
Pius