← Kapitel 2: Ausgänge | ↑ Übersicht | Kapitel 4: Ampelsteuerung →

Kapitel 3: Blinklicht

Nun wollen wir einen Schritt weiter gehen und die LED ein- und ausschalten.

So ein Blinklicht ist ja ein schönes, ersten Projekt. Ein klassisches Beispiel dafür ist die blinkende LED im Auto, die eine Wegfahrsperre andeutet und so potentielle Einbrecher abschrecken soll.

kapitel03_led-blink1.ino
void setup()
{
  pinMode(13, OUTPUT);  // Pin13 als Ausgang definieren
}
 
void loop() 
{
  digitalWrite(13, HIGH); // Pin13 "einschalten"
  digitalWrite(13, LOW);  // Pin13 "ausschalten"
}

setup() wird beim Start des Controllers einmalig ausgeführt. Alles was in loop() steht wird in einer Schleife ausgeführt. Das bedeutet: Wenn alle Zeilen abgearbeitet sind, fängt der Controller wieder bei der ersten Zeile in loop() an.

Das bringt uns also zu folgendem Ergebnis:

  • LED wird eingeschaltet
  • LED wird ausgeschaltet
  • Controller fängt wieder in der ersten Zeile an: LED wird eingeschaltet
  • LED wird ausgeschaltet
  • usw.

Wir kopieren den Code in die Oberfläche und laden diesen auf den Controller.

Nun passiert folgendes: Nichts.

Die LED blinkt nicht. Wenn wir genau hinsehen, können wir aber erkennen, dass die LED ein wenig dunkler geworden ist. Sie blinkt also doch, allerdings tut sie das so schnell, dass wir das nicht mit unseren Augen sehen können.

Wir haben dem Controller ja auch nicht mitgeteilt, wie lange die LED an und ausbleiben soll. Durch das direkte hintereinanderschreiben der Befehle digitalWrite() führt er beide Befehle mit maximaler Geschwindigkeit aus.

Wollen wir nun ein vernünftiges Ergebnis, können wir auf folgenden Befehl zurückgreifen:

delay(WARTEZEIT);

Die Wartezeit wird in diesem Befehl in ms (Millisekunden) angegeben. Wollen wir also, dass die LED eine halbe Sekunde leuchtet, müssen wir den Wert 500 einsetzen (1s = 1000ms).

Wir fügen also die Zeile dem Code hinzu:

kapitel03_led-blink2.ino
void setup()
{
  pinMode(13, OUTPUT);  // Pin13 als Ausgang definieren
}
 
void loop() 
{
  digitalWrite(13, HIGH); // Pin13 "einschalten"
  delay(500);  // 500ms lang warten
  digitalWrite(13, LOW);  // Pin13 "ausschalten"
}

Nun sieht der Ablauf wie folgt aus:

  • LED wird eingeschaltet
  • Controller wartet 500ms
  • LED wird ausgeschaltet
  • Controller fängt wieder in der ersten Zeile an: LED wird eingeschaltet
  • Controller wartet 500ms
  • usw.

Anhand des Ablaufs können wir sofort einen Fehler erkennen: zwischen LED wird ausgeschaltet und LED wird eingeschaltet ist keine Verzögerung, das heißt, die LED wird also sofort wieder eingeschaltet. Wir müssen den Code also um eine weitere Zeile erweitern:

kapitel03_led-blink3.ino
void setup()
{
  pinMode(13, OUTPUT);  // Pin13 als Ausgang definieren
}
 
void loop() 
{
  digitalWrite(13, HIGH); // Pin13 "einschalten"
  delay(500);  // 500ms lang warten
  digitalWrite(13, LOW);  // Pin13 "ausschalten"
  delay(500);  // 500ms lang warten
}

Jetzt erhalten wir das richtige Ergebnis:

  • LED wird eingeschaltet
  • Controller wartet 500ms
  • LED wird ausgeschaltet
  • Controller wartet 500ms
  • Controller fängt wieder in der ersten Zeile an: LED wird eingeschaltet
  • Controller wartet 500ms
  • usw.

Wenn wir jetzt den Code wieder auf den Controller laden, erhalten wir das gewünschte Ergebnis: die LED blinkt im Sekundentakt.

Um die Thematik Ausgänge und Timing zu vertiefen, gibt es im nächsten Kapitel eine Übungsaufgabe:

Kapitel 4: Ampelsteuerung