Hallo demateraliz,
das lässt sich realizizen. Dann musste aber konsequent auf die Verwendung von millis() umsteigen
und alle delays() weglassen.
Das ist doch immer das gleiche mit ziemlich komplexem Code mit der Tür ins Haus fallen anstatt mit einem Alltags-Analogon einzusteigen
Dieser Text ist im Original english. Den habe ich ganz auf die Schnelle in google-translate reingeklatscht
als ganztägiges Beispiel mit leicht zu verfolgenden Zahlen
delay () blockiert. Solange die Verzögerung "verzögert", kann nichts anderes des Codes ausgeführt werden.
Jetzt gibt es eine Technik zum nicht blockierenden Timing.
Das Grundprinzip des nicht blockierenden Timings unterscheidet sich grundlegend von der Verwendung von delay ()
Sie müssen zuerst den Unterschied verstehen und dann in den Code schauen.
Andernfalls könnten Sie versuchen, ein "Delay-Analog-Ding" im millis () - Code zu "sehen", was es wirklich nicht ist
Der Versuch, ein "Delay-Analog-Ding" in millis () zu sehen, macht es schwierig, millis () zu verstehen.
Wenn Sie das Grundprinzip des nicht blockierenden Timings auf der Basis von millis () verstanden haben, ist es leicht zu verstehen.
Stellen Sie sich vor, Sie backen eine gefrostete Pizza
Auf dem Deckel steht für die Zubereitung der Ofen auf 200 ° C aufheizen
dann Pizza hineinlegen.
Backzeit 10 Minuten
Sie schätzen, dass das Aufheizen 3 Minuten dauert
Sie werfen einen Blick auf Ihre Uhr, es ist 13:02 Uhr (Momentaufnahme der Zeit)
Sie lesen die Zeitung und schauen von Zeit zu Zeit auf Ihre Uhr
schau 13:02 noch nicht aufgeheizt
schau 13:03 noch nicht aufgeheizt
Uhr 13:04 noch nicht Zeit 13:04 - 13:02 = 2 Minuten sind weniger als 3 Minuten
Uhr 13:05 Wann habe ich 13:02 angefangen? OK 13:05 - 13:02 = 3 Minuten Zeit, um Pizza in den Ofen zu geben
Neue Basiszeit 13:05 (die Momentaufnahme der Zeit)
schau 13:06 noch nicht fertig
schau 13:07 noch nicht fertig
Uhr 13:08 noch keine Zeit (13:08 - 13:05 = 3 Minuten sind weniger als 10 Minuten
schau 13:09 noch nicht fertig
Uhr 13:10 noch nicht Zeit
Uhr 13:11 noch nicht Zeit
Uhr 13:12 noch nicht fertig
Uhr 13:13 noch keine Zeit
Uhr 13:14 noch keine Zeit (13:14 - 13:05 = 9 Minuten sind weniger als 10 Minuten
schau 13:15 wann habe ich angefangen 13:05 OK 13:15 - 13:05 = 10 Minuten Zeit um Pizza zu essen (yum yum)
Sie haben wiederholt verglichen, wie viel Zeit vergangen ist
Dies ist, was nicht blockierendes Timing tut
Im Code wird nach "Wie viel Zeit ist vergangen" gesucht
currentTime - startTime> = Backzeit
Die Backzeit beträgt 10 Minuten
13:06 - 13:05 = 1 Minute> = Backzeit ergibt false
13:07 - 13:05 = 2 Minuten> = Backzeit ergibt false
...
13:14 - 13:05 = 9 Minuten> = Backzeit ergibt false
13:15 - 13:05 = 10 Minuten> = Backzeit ergibt true Zeit für zeitgesteuerte Aktionen !!
if (currentTime - previousTime> = period) {
es muss genau so codiert werden, weil es auf diese Weise den Rollover von Max zurück auf Null verwaltet
der Funktion millis () automatisch
hier das original auf English
as an allday example with easy to follow numbers
delay() is blocking. As long as the delay is "delaying" nothing else of the code can be executed.
Now there is a technique of non-blocking timing.
The basic principle of non-blocking timing is fundamental different from using delay()
You have to understand the difference first and then look into the code.
otherwise you might try to "see" a "delay-analog-thing" in the millis()-code which it really isn't
Trying to see a "delay-analog-thing" in millis() makes it hard to understand millis()
Having understood the basic principle of non-blocking timing based on millis() makes it easy to understand.
imagine baking a frosted pizza
the cover says for preparation heat up oven to 200°C
then put pizza in.
Baking time 10 minutes
You are estimating heating up needs 3 minutes
You take a look onto your watch it is 13:02 (snapshot of time)
You start reading the newspaper and from time to time looking onto your watch
watch 13:02 not yet time
watch 13:03 not yet time
watch 13:04 not yet time 13:04 - 13:02 = 2 minutes is less than 3 minutes
watch 13:05 when did I start 13:02? OK 13:05 - 13:02 = 3 minutes time to put pizza into the oven
New basetime 13:05 (the snapshot of time)
watch 13:06 not yet time
watch 13:07 not yet time
watch 13:08 not yet time (13:08 - 13:05 = 3 minutes is less than 10 minutes
watch 13:09 not yet time
watch 13:10 not yet time
watch 13:11 not yet time
watch 13:12 not yet time
watch 13:13 not yet time
watch 13:14 not yet time (13:14 - 13:05 = 9 minutes is less than 10 minutes
watch 13:15 when did I start 13:05 OK 13:15 - 13:05 = 10 minutes time to eat pizza (yum yum)
You did a repeated comparing how much time has passed by
This is what non-blocking timing does
In the code looking at "How much time has passed by" is done
currentTime - startTime >= bakingTime
bakingTime is 10 minutes
13:06 - 13:05 = 1 minute >= bakingTime is false
13:07 - 13:05 = 2 minutes >= bakingTime is false
...
13:14 - 13:05 = 9 minutes >= bakingTime is false
13:15 - 13:05 = 10 minutes >= bakingTime is TRUE time for timed action!!
if (currentTime - previousTime >= period) {
it has to be coded exactly this way because in this way it manages the rollover from Max back to zero
of the function millis() automatically
vgs