Überlauf millis() was passiert und wie kann man es nutzen

Hallo zusammen, ich möchte ein Hausautomationssystem machen wo die Befehle über die Serielle Schnittstelle eintreffen also welchen Pin an und ausschalten.Des weitern möchte ich auch einen Befehl einbauen der wenn er ausgeführt wird eine Ampel zum blinken bringt(über ein Relais natürlich) Da dieses System im besten Fall wenn kein Stromausfall eintritt mehere Jahre laufen soll, stellt sich für mich die Frage wie mache ich am besten die Blinkfunktion wenn ich kein delay verwenden kann da alle anderen Befehle ja noch ausgeführt werden müssen wenn die Ampel blinkt meines Wissens ist es ja so, dass die Funktion millis nach etwa 48 Tagen überläuft und wieder durch null geht. Das heißt ja eigentlich, dass millis nach etwa 24 Tagen von +2,1Milliarden auf -2,1Milliarden springt und ich nicht weiß wie ich dem Arduino sagen soll dass er bei dem Sprung sich nicht aufhängt oder zu blinken aufhört obwohl er sollte. Danke schonmal im vorraus

Am besten: Noch nicht einmal ignorieren.

nach etwa 48 Tagen überläuft und wieder durch null geht.

Das ist wahr.

Das heißt ja eigentlich, dass millis nach etwa 24 Tagen von +2,1Milliarden auf -2,1Milliarden springt

Das ist falsch.

Das, was du da zeigst, ist ein vorzeichenbehafteter Überlauf. Dieser ist laut C++ Referenz zu vermeiden, da er in ein undefiniertes Verhalten mündet.

Merke: Es ist mathematisch unmöglich, dass das erhöhen einer Zahl, einen Vorzeichenwechsel von plus nach minus auslöst.

Zudem kann die Sprache das "exotische" Verhalten gar nicht definieren, da es Maschinen gibt, die das Einerkomplement verwenden und welche die das Zweierkomplement verwenden.

Wenn Du immer rechnest

if (aktuelleMillis - letzteMillis >= Intervall)

wird der Überlauf richtig behandelt.

Gruß Tommy

Ok danke Tommy, dann werde ich die Zeile einbauen. Ich verstehe aber nicht was combie meint. Ich verstehe seine mathematische Erklärung schon. Aber der Arduino ist leider nicht immer mathematisch. Denn ich habe gerade folgende Skteche ausprobiert die meiner Überlegung zustimmen. Hier läuft eine Long Variable über

long variable;

void setup(){
  Serial.begin(57600);
}

void loop(){
  Serial.println (variable);
  variable = variable + 100000;
}

Und hier eine Integer Variable.

int variable;

void setup(){
  Serial.begin(57600);
}

void loop(){
  Serial.println (variable);
  variable++;
}

Man muss bei beiden etwas warten bis sie überlaufen es haben aber beide das gleiche Verhalten beim Überlaufen springen sie auf den gleichen Wert nur dass sie dann negativ sind und wieder in Richtung 0 zählen. Also ist meine Überlegung so, dass millis() das gleiche macht. Sollte ich mich da vertun bessert mich bitte aus ;)

allzeittechniker:
Hier läuft eine Long Variable über

long variable;

Die ist nicht unsigned.

Um das mit den millis() zu sehen, was passiert:

Der Überlauf von signed ist nicht definiert, der von unsigned ist klar definiert. In dem verlinkten Thread habe ich das mit Byte nachgestellt (da muss man nicht so lange warten).

Gruß Tommy

Also ist meine Überlegung so, dass millis() das gleiche macht. Sollte ich mich da vertun bessert mich bitte aus ;)

Punkt 1: Dein Test testet undefiniertes Verhalten, darum ist das Ergebnis deines Tests absoluter Müll, zumindest als solcher anzusehen. Tut mir auch leid, ist auch nicht auf meinem Mist gewachsen. Ich bin nur der Bote.

Punkt 2: Deine Rechnung trifft nicht die Realität. Denn in der Realität liefert dir millis() einen unsigned long und keinen long.

Tommy56: (da muss man nicht so lange warten).

17:58:02.391 -> 4294967040
...
17:58:02.656 -> 4294967294
17:58:02.656 -> 0

sind doch nur 265ms. :)

Achso jetzt verstehe ich alles. Danke für eure Antworten!! Mir war nicht klar, dass das long hier falsch ist. Und millis() sich anders verhält als ich gedacht habe.

Bei richtigem Vergleich im if des Zeitintervalls ist ein Überlauf nach 49,6 Tagen kein Problem. Zeitdifferenzen sind immer richtig. Was problematisch ist, ist wenn man Intervalle von mehr als 49,6 Tagen braucht. Dann ist millis() alleine nicht zu gebrauchen. Dann mußt Du mitzählen wievile Überläufe stattgefunden haben. Grüße Uwe