← Kapitel 5: Eingänge | ↑ Übersicht | Kapitel 7: Fußgängerampel →

Kapitel 6: Treppenhauslicht

Eine sehr nützliche Funktion bei der Programmierung von Mikrocontrollern sind Schleifen.

Wir haben bereits eine Schleife kennen gelernt, diese ist in der Funktion loop() versteckt. Die Schleife läuft unendlich lang, in der Schleife befindet sich unser Code aus der Funktion loop().

Was macht nun so eine Schleife und wie sieht sie aus?

while(AUSDRUCK)
{
  #CODE#
}

Diese Schleife überprüft AUSDRUCK und führt den Code in den geschweiften Klammern so lange aus, wie AUSDRUCK dem Zustand „Wahr“ (Englisch = „true“) entspricht.

Wenn wir eine Schleife erstellen wollen, die unendlich lange läuft, geben wir „true“ einfach fix vor:

while(true)
{
  #CODE#
}

Alles was wir nun bei #CODE# hinschreiben wird von von oben bis unten ausgeführt und startet dann wieder von vorne, wie unsere loop()-Funktion.

Die Zustände „true“ und dessen Gegenteil „false“ können wir aber auch mit Bool'scher Algebra berechnen.

Die einfachste Funktion ist der Vergleich, dieser erfolgt durch folgende Zeichen: ==

Nur ein statt zwei Gleichheitszeichen zu machen ist ein typischer Anfängerfehler und führt gerne zu Fehlern!
Vergleich Ergebnis
1 == 1 true
1 == 0 false
42 == 42 true
x = 2 immer true (kein Vergleich)

Wir nutzen nun unser Wissen aus Kapitel 5 und vergleichen den Zustand der Taste in einer Schleife. In unserem Fall ist die Taste standardmäßig HIGH. Wenn wir nun darauf warten wollen, dass jemand die Taste drückt, können wir das in einer Schleife tun, die so lange läuft, wie der Zustand der Taste HIGH ist:

while(digitalRead(7) == HIGH)
{
}

Der Controller bleibt nun so lange in der Schleife hängen, bis die Taste einen anderen Zustand wie HIGH hat. Wenn Pin7 also LOW ist, wird die Schleife verlassen und der Code unterhalb ausgeführt.

Als praktisches Beispiel wollen wir nun ein Treppenhauslicht programmieren:

  • Standardmäßig ist das Licht aus
  • Wenn jemand die Taste drückt schaltet sich das Licht ein
  • Nach 3 Sekunden schaltet sich das Licht wieder aus

Für das Treppenhauslicht verwenden wir die rote LED.

Um den Code wieder besser lesbar zu machen erstellen wir ganz am Anfang wieder Definitionen.

kapitel06_treppenhaus.ino
#define LED_ROT 13
#define LED_GELB 12
#define LED_GRUEN 11
#define TASTE 7
 
void setup()
{
  pinMode(LED_ROT, OUTPUT);  // Pin als Ausgang definieren
  pinMode(TASTE, INPUT);     // Pin als Eingang definieren
  digitalWrite(TASTE, HIGH); // Pullup an Pin einschalten
}
 
void loop()
{
  digitalWrite(LED_ROT, LOW);        // Rote LED ausschalten
  while(digitalRead(TASTE) == HIGH)  // So lange in der Schleife bleiben, wie Tastenpin HIGH ist
  {
  }
  // Hier kommt man nur hin, wenn die Schleife verlassen wird, also TASTE == LOW ist
  digitalWrite(LED_ROT, HIGH);
  delay(3000);
}

Nachdem wir den Code auf den Controller geladen haben, erhalten wir das gewünschte Ergebnis: Nach Tastendruck leuchtet die rote LED für 3 Sekunden und erlischt danach.

Um dieses Wissen zu vertiefen starten wir in eine weiter Übungsaufgabe:

Kapitel 7: Übungsaufgabe Fußgängerampel