Die Verwechslung ist verständlich, weil beide Zeit in Millisekunden behandeln. Wer „warte eine Sekunde“ denkt, greift schnell zu delay(1000) – und wundert sich später über tote Tasten.
delay() ist ein Befehl, der das Programm an dieser Stelle pausiert. Die gesamte Hauptschleife, also die loop()-Funktion, steht dabei still. Ein delay(1000) bei einer blinkenden LED blockiert eine Taste für eine volle Sekunde; ein kurzer Druck bleibt meist unbemerkt. Auch Sensorwerte und Netzwerkereignisse werden während der Pause nicht bearbeitet.
millis() ist eine Funktion, die beim Aufruf die Millisekunden seit dem Programmstart als Zahl zurückgibt. Sie hält nichts an, sie liest nur die Uhr und kehrt sofort zurück. Ein typisches Beispiel: eine LED im Sekundentakt blinken lassen, die Taste aber in jedem Schleifendurchlauf lesen. Dazu notiert man die Startzeit in einer Variablen, prüft später, ob das Intervall verstrichen ist, und führt die Aktion aus. Die Startzeit speichert man im Typ unsigned long, einem vorzeichenlosen 32-Bit-Wert.
delay() verwaltet die Zeit, indem sie das Programm opfert. millis() verwaltet die Zeit, während das Programm weiterläuft. Bei mehreren Aufgaben mit unterschiedlichen Intervallen bekommt jede ihre eigene Zeitvariable.
Faustregel: Für kurze Pausen ohne Nebenläufigkeit genügt delay(). Sobald während der Wartezeit etwas anderes passieren soll, immer millis() mit Zeitvergleich nehmen.
Ein Zeitvergleich heißt jetzt minus Startzeit größer gleich Intervall, nicht jetzt größer gleich Zielzeit. Die Differenz bleibt auch beim Überlauf korrekt, den der Zähler nach rund 49,7 Tagen macht.
📌 millis() statt delay() · Differenz bilden · unsigned long
📚 IoT von Grund auf · Tag 4 von 30
#Arduino #Mikrocontroller #esp32 #iot