BlinkWithoutDelay ist der mitgelieferte Arduino-Beispielsketch von David A. Mellis, der eine LED blinken lässt, indem er millis()-Zeitstempel vergleicht, statt delay() aufzurufen. Er steht für nicht blockierendes Timing in einer Superloop: Jede Aufgabe hat eigenen Zeitstempel und eigenes Intervall, prüft bei jedem Durchlauf die verstrichene Zeit per überlaufsicherer Subtraktion, und nichts wartet je.
BlinkWithoutDelay
Details
- Vollständiger Name
-
BlinkWithoutDelay, der mitgelieferte Arduino-Beispielsketch (File > Examples > 02.Digital > BlinkWithoutDelay), der eine LED blinken lässt, indem er
millis()-Zeitstempel vergleicht, stattdelay()aufzurufen. Sein Kopf lautet „created 2005 by David A. Mellis“, spätere Änderungen stammen von Paul Stoffregen, Scott Fitzgerald und Arturo Guadalupi; dokumentiert unter docs.arduino.cc. - Auch bekannt als
-
Blink without Delay; das
millis()-Muster; nicht blockierendes Timing in einer Superloop
Kernkonzepte:
- Die Schleife nie blockieren
-
delay()hält das ganze Programm an, auch das Lesen von Tastern, serielle Eingaben und jede andere Aufgabe. Der Sketch lässtloop()frei laufen und entscheidet bei jedem Durchlauf, ob etwas fällig ist. - Zeitstempel plus Intervall
-
Merken, wann etwas zuletzt passiert ist, und bei jedem Durchlauf prüfen, ob das Intervall verstrichen ist:
if (currentMillis - previousMillis >= interval). Wenn ja, handeln und den Zeitstempel aktualisieren. Was zwischen den Durchläufen überleben muss — der Zeitstempel, der LED-Pegel --, liegt in globalen oderstatic-Variablen. - Überlaufsichere Subtraktion
-
millis()liefert einenunsigned long, der nach etwa 49,7 Tagen auf null zurückspringt. Zieht man den alten Zeitstempel vom neuen ab, stimmt die verstrichene Zeit auch über den Überlauf hinweg, weil vorzeichenlose Arithmetik modular rechnet. Der Vergleichmillis() >= previousMillis + intervalbricht beim Überlauf. - Ein Timer pro Aufgabe
-
Jede unabhängige Aufgabe — blinken, einen Taster entprellen, einen Sensor abfragen — bekommt eigenen Zeitstempel und eigenes Intervall. Mehrere davon laufen nebeneinander in einem
loop(): kooperatives Multitasking ohne Betriebssystem. - Der Schritt zum Zustandsautomaten
-
Sobald eine Aufgabe mehr kennt als „an“ und „aus“, treibt die Zeitprüfung eine
finite-state-machine: Jeder Zustand wartet auf sein Intervall oder Ereignis und geht dann weiter. BlinkWithoutDelay ist der kleinste Fall dieser Struktur. - Plattform-Idiom, allgemeine Idee
-
Der Name gehört Arduino, die Technik nicht. Dasselbe Muster findet sich in jeder Bare-Metal-Superloop mit einem Tick-Zähler; deshalb wirkt der Name als Anker weit über die blinkende LED hinaus.
Wann zu verwenden:
-
Arduino- und andere Mikrocontroller-Programme, die auf Eingaben reagieren müssen, während etwas anderes getaktet läuft
-
Einen Sketch mit
delay()umschreiben, bevor eine zweite Aufgabe dazukommt -
Den Schritt von der blockierenden Schleife zu kooperativem Multitasking und Zustandsautomaten lehren
-
Ein Modell steuern: „füge den Taster hinzu, im BlinkWithoutDelay-Stil“ entfernt jedes
delay()und hält die Eingabe reaktionsfähig, während „füge den Taster hinzu“ diedelay()-Aufrufe meist stehen lässt
Häufige Missverständnisse:
-
❌ „Bei BlinkWithoutDelay geht es ums LED-Blinken“ — die LED ist die Vorführung; das Thema ist, die Schleife nicht zu blockieren
-
❌ „
millis() >= previousMillis + intervalist gleichwertig“ — das bricht, wennmillis()überläuft; erst subtrahieren, dann vergleichen -
❌ „Das ist ein interruptgesteuerter Timer“ — es ist Polling in der Hauptschleife; Interrupts und Hardware-Timer sind eine andere Technik
-
❌ „Es ersetzt ein RTOS“ — es trägt kooperative Aufgaben, die schnell fertig sind; lange oder präemptive Arbeit braucht mehr
-
✓ „Jede Aufgabe prüft bei jedem Durchlauf ihre eigene verstrichene Zeit, und nichts wartet je“