Blinken ohne "delay()"
Benötigt:
- Arduino
- Falls nicht die LED L an Pin 13 verwendet wird, braucht es eine Standard-LED beliebiger Farbe und den entsprechenden Vorwiderstand.
Manchmal muss man während man eine LED blinken lässt (oder andere Dinge bei denen man eine bestimmte Zeit warten muss) zur gleichen Zeit etwas anderes tun (wie einen Taster abfragen). In diesem Fall kann "delay()" nicht verwendet werden, da es das gesamte Programm anhalten würde. Dieses Beispiel zeigt wie man eine LED ohne "delay()" blinken lassen kann. Das Programm "merkt" sich wann es die LED das letzte Mal ein- oder ausgeschaltet hat. Jedes mal wenn "loop()" durchläuft kontrolliert es ob eine bestimmte Zeit vergangen ist, wenn dies der Fall ist wird die LED umgeschaltet. Es wird die Funktion millis() verwendet, welche direkt beim Starten des AVR anfängt in Millisekunden hochzuzaehlen. Diese Zahl faengt nach ca. 49,6 Tagen wieder von Null an zu zählen. Dieser Überlauf wird bei richtiger Kontrolle der vergangenen Zeit abgefangen und führt zu keiner falschen Wartezeit. Die Schaltung ist die gleiche wie bei "Hallo Welt!".
Code:
/* Blinken ohne "delay()"
*
* Schaltet eine LED, welche an einem digitalen Pin liegt ein- und aus
* ohne die "delay()" Funktion zu verwenden. Das heisst anderer Code
* kann zur gleichen Zeit ausgeführt werden ohne blockiert zu werden.
*
* https://playground.arduino.cc/Learning/BlinkWithoutDelay_de
*/
byte ledPin = 13; // LED liegt am (digitalen) Pin 13
boolean value = LOW; // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 1000; // Interval zwischen zwei Änderungen
void setup()
{
pinMode(ledPin, OUTPUT); // Setzt den ledPin (Pin 13) als Ausgang
}
void loop()
{
// Code der immer laufen soll kommt hier hin.
/* es wird kontrolliert, ob die Zeit für das Blink-Intervall schon abgelaufen ist
* Wenn die Zeitdifferenz zwischen dem Letzten Abspeichern und der aktuellen Zeit größer
* als das Intervall ist, so wird die nachfolgende Funktion ausgeführt.
*/
if (millis() - previousMillis > interval) {
previousMillis = millis(); // aktuelle Zeit abspeichern
// LED Zustand wecheln.
value = !value;
// Wert auf den Ausgang schreiben
digitalWrite(ledPin, value);
}
}