Ich habe jetzt einen Text den ich auf englisch geschrieben habe 1:1 durch google-translate durchgeschoben. Das heißt die Grammatik ist nicht so doll
aber ich denke es wird troztdem verständlich
wie nichtblockierendes Timing funktioniert
als alltägliches Beispiel mit leicht verständlichen Zahlen
delay() blockiert. Solange die Verzögerung "verzögert", kann nichts anderes vom Code ausgeführt werden.
Jetzt gibt es eine Technik des nicht-blockierenden Timings.
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, im millis()-Code ein "delay-analog-thing" zu "sehen", was es wirklich nicht ist
Der Versuch, in millis() ein "Verzögerungs-Analog-Ding" zu sehen, macht es schwer, millis() zu verstehen
Wenn man das Grundprinzip des blockierungsfreien Timings basierend auf millis() verstanden hat, ist es leicht zu verstehen.
Stellen Sie sich vor, Sie backen eine gefrostete Pizza
auf dem Deckel steht für die Zubereitung Backofen auf 200°C vorheizen
dann Pizza einlegen.
Backzeit 10 Minuten
Sie schätzen den Aufheizbedarf von 3 Minuten
Du schaust auf deine Uhr, es ist 13:02 (Zeitmoment)
Du fängst an, die Zeitung zu lesen und schaust ab und zu auf deine Uhr
Uhr zeigt 13:02. 13:02 - 13:02 = 0 Minuten verstrichen noch keine Zeit
Uhr zeigt 13:03. 13:03 - 13:02 = 1 Minute ist noch nicht vorbei
Uhr zeigt 13:04. 13:04 - 13:02 = 2 Minuten verstrichen noch keine Zeit
Sendungen ansehen 13:05 Wann habe ich um 13:02 angefangen? OK 13:05 - 13:02 = 3 Minuten Zeit um die Pizza in den Ofen zu schieben
Neue Basiszeit 13:05 (die Momentaufnahme der Zeit)
Uhr 13:06 noch keine Zeit
Uhr 13:07 noch keine Zeit
13:08 Uhr noch keine Uhrzeit ansehen (13:08 - 13:05 Uhr = 3 Minuten sind weniger als 10 Minuten
Uhr 13:09 noch keine Zeit
13:10 Uhr noch nicht Zeit
Uhr 13:11 noch nicht Zeit
Uhr 13:12 noch nicht Zeit
Uhr 13:13 noch nicht Zeit
13:14 Uhr noch keine Uhrzeit ansehen (13:14 - 13:05 Uhr = 9 Minuten sind weniger als 10 Minuten
Uhr 13:15 wann habe ich angefangen 13:05 OK 13:15 - 13:05 = 10 Minuten Zeit um Pizza zu essen (lecker lecker)
Du hast wiederholt verglichen, wie viel Zeit vergangen ist
Dies ist, was nicht blockierendes Timing bewirkt
Im Code ist der Blick auf "Wie viel Zeit vergangen ist" erledigt
currentTime - startTime >= Backzeit
Backzeit beträgt 10 Minuten
13:06 - 13:05 = 1 Minute >= Backzeit ist falsch
13:07 - 13:05 = 2 Minuten >= Backzeit ist falsch
...
13:14 - 13:05 = 9 Minuten >= Backzeit ist falsch
13:15 - 13:05 = 10 Minuten >= Backzeit ist TRUE Zeit für zeitgesteuerte Aktion!!
Also tut Ihre Schleife ()
Leere Schleife ()
// alle möglichen Sachen machen, wie zum Beispiel die Zeitung lesen
if (currentTime - previousTime >= period) {
vorherigeZeit = aktuelleZeit; // Das erste, was Sie tun müssen, ist die Momentaufnahme der Zeit zu aktualisieren
// Zeit für zeitgesteuerte Aktion
}
es muss genau so codiert werden, weil es auf diese Weise den Rollover von Max zurück auf Null verwaltet
der Funktion millis() automatisch
baldengineer.com hat auch ein sehr gutes Tutorial zum Timing mit der Funktion millis() .
Es gibt einen Absatz, der den Unterschied zwischen den Funktionen delay() und millis() auf den Punkt bringt:
Die Funktion millis() ist eine der mächtigsten Funktionen der Arduino-Bibliothek. Diese Funktion gibt die Anzahl der Millisekunden zurück, die der aktuelle Sketch seit dem letzten Zurücksetzen ausgeführt wurde. Zuerst denkst du vielleicht, das ist nicht alles sinnvoll! Aber bedenken Sie, wie Sie die Uhrzeit tagsüber angeben. Effektiv sehen Sie sich an, wie viele Minuten seit Mitternacht vergangen sind. Das ist die Idee hinter millis()!
Anstatt wie bei delay() „eine bestimmte Zeit zu warten“, können Sie millis() verwenden, um zu fragen, „wie viel Zeit vergangen ist“?