Schönen guten Tag!
Hier im Forum kursieren einige Methoden, wie man ein "blink without delay" hin bekommt, oder auch andere Wartezeiten.
Drei davon habe ich hier mal grafisch aufbereitet. Ok, das eigentliche malen, das macht der Serielle Plotter, der Arduino IDE.
Da das Problem mit uint32_t schlecht darstellbar ist, wg. der 49 Tage Wartezeit, habe ich es auf byte runtergebrochen. Darum auch die Casts, um wirklich in dem Zahlenbereich zu bleiben. Bei unsigned long sind die Casts nicht nötig.
Wie auch immer, ob uint8_t oder uint32_t, das Problembild ist im Grunde gleich.
Was sehen wir in den Diagrammen?
In der blauen Kurve sehen wir die langsam ansteigende Zeit. Beim Überlauf gehts wieder mit Null los.
Die rote Treppenstufe zeigt die gemerkte Zeit. An jeder Flanke beginnt ein neues Zeit Intervall.
Die kleine grüne Rechteckkurve(?) zeigt unseren Aktor. Z.B. eine blinkende LED oder die Anforderung für unsere 27KW Klimaanlage. Und genau diese fette Klimaanlage verträgt keine Hakler an der Stelle. Wir(nur ich?) wollen da ein sauberes, symmetrisches, von Überläufen unbeeindrucktes, Rechteck sehen.
Resultat der Geschichte:
Drei Verfahren getestet, nur eins davon kommt unbeeindruckt durch den Überlauf.
Die Modulo Methode:
if(not (jetztzeit % interval))
Die Methode mit Addition:
if(jetztzeit > byte(zeitmerker + interval))
Die einzig richtige Methode:
if(byte(jetztzeit - zeitmerker) >= interval)
Zu guter Letzt der Testcode:
#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout = Serial; // cout Emulation für "Arme"
byte jetztzeit = 0; // macht sich blaue Rampe
byte zeitmerker = 0; // macht sich rote Treppe
byte interval = 60; // Zeit zwischen grüne Flanken
bool signal = false; // macht sich grünes Rechteck
void setup()
{
Serial.begin(9600);
cout << F("jetztzeit,zeitmerker,signal") << endl;
}
void loop()
{
jetztzeit++;
// if(not (jetztzeit % interval)) // fehlverhalten beim Ueberlauf
// if(jetztzeit > byte(zeitmerker + interval))// fehlverhalten vor dem Ueberlauf
if(byte(jetztzeit - zeitmerker) >= interval) // der wahre Jakob
{
zeitmerker = jetztzeit;
signal = not signal;
}
cout << jetztzeit << "," << zeitmerker << "," << (signal * 20) << endl;
delay(1);
}
Viel Freude damit, ich euch wünsche.