Arduino if Abfrage

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 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:


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


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?

Unsortierte Bausteine

Vielleicht so:

  1. nimm einen Baustein
  2. prüfe, ob der Baustein rot ist
  3. 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:

  1. nimm einen Baustein
  2. prüfe, ob der Baustein rot ist
  3. wenn er rot ist, packe den Stein in Box A
  4. 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.

Funktionsweise if-Abfrage

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 unten:

Hier zwei von vielen Vorschlägen:

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.

33 Gedanken zu „Lektion 12 – Der Taster und if-Abfrage“

  1. Hallo.
    Bin neu und Anfänger.
    Problem : Sketch mit IF abfrage und Taster
    Taster auf + oder auf GND
    LED immer auf HIGH
    Habe verschiedene Varianten ausprobiert…

  2. ich habe 7 leds und darunter eine grüne mit dem taster will ich abfragen ob die Grüne led leuchtet wenn sie leuchtet soll eine andere auf der rechten seite angehen bitte um hilfe

  3. Das einzige Problem ist, einen Taster anzuschliessen.
    Das ist nicht so trivial wie der Rest deines Beitrags, finde ich.

    pinMode(tasterPin, INPUT); // erfordert einen Pulldown-Widerstand.

    Was hältst du übrigens von
    void loop() {
    digitalWrite(ledPin, digitalRead(tasterPin)); // led zeigt taster Zustand an.
    }

  4. vielen Dank für die tollen Erklärungen. Ich habe zwei Arduino Anfänger Bücher und in keinem ist es so gut erklärt wie hier. Echt super!

  5. Sehr gute und witzige Anleitung. Schade, dass hier keine weiteren Kommentare stehen. Gerade die Eingabe und Ausgabebefehle sind Dinge, die man, wenn man lange nicht programmiert hat, hier gut erklärt wiederfindet. Danke für diese Seite und die Mühe zum Erstellen.

  6. Hi,
    habe beide Programme ausprobiert.
    Beim 1. Programm ist der Ablauf wie von Ihnen angegeben.
    Beim 2. Programm ist der Ablauf wie beim 1.Programm. Kein Unterschied. Wo könnte der Fehler sein.
    Habe das 2. Programm kopiert und in meiner Arduinodsoftware 1.6.12 eingefügt. Trotzdem keine Änderung. 2. Programm reagiert weiter wie 1. Programm.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.