millis() nach 49 Tagen als Stunden oder Tage beibehalten

Hallo zusammen,
irgendwo bin ich schon mal auf dieses Thema gestoßen, konnte aber den Code nicht "eindeutschen".
Folgendes Problem:
Nach 49,7 Tagen kommt es bei millis() zu einem overflow. Wie kann ich die Laufzeit meines ESP weiterhin bis über 100 Tage oder sogar Jahre berechnen.

Gruß
Fred

Eine Funktion dazu habe ich mir ausgedacht.

Möchtest du die für deine geheimen Sketche haben?

Gruß Fips

ge-nut-st :slight_smile:

zum Nachlesen:

im loop:

  // Collect everything for uptime
  unsigned long millisecs = millis();
  unsigned long days = (millisecs / 86400000) % 10;
  
  char uptime[20];
  sprintf(uptime, "%d %s %02d:%02d:%02d", days, days == 1 ? "day" : "days", (millisecs / 3600000) % 24, (millisecs / 60000) % 60, (millisecs / 1000) % 60);

So erzeuge ich die Laufzeit und komme dann z.B. auf 8 days 20:05:17 angezeigt.
Aber was mache ich nach 4294967296 millis?

freddy64:
Aber was mache ich nach 4294967296 millis?

Notieren das uint32_t am Ende angekommen ist.
Und von vorn mit Zählen beginnen.

Hi

Alternativ zählst Du eine weitere long Variable um 1 hoch, Beide zusammen zu einer 64bit-Variable zusammen geschoben umrechnen - bis Dir bei 64bit der Überlauf Sorgen bereitet, wird’s wohl ‘etwas’ dauern.
Muß ggf. atomar ausgelesen werden, da millis() theoretisch in diesem Moment überlaufen könnte und Du somit 42,x Tage Differenz bekommst (nur eine ms lang - für einen töffte Fehler aber komplett ausreichend).

MfG

PS: combie hatte Mal ein template(?) vorgestellt, wo man 64bit Zahlen mit ausgeben konnte - der Arduino kann Das nur bis 32bit von Haus aus.
Wenn Du aber mit den 64bit rechnest, sollte sich Das aber egalisieren.

Hab jetzt mal die Funktion (aus NodeMCU im Dauerbetrieb) wie oben beschrieben eingebunden.
Funktioniert bisher auch wie gewünscht. Jetzt heißt es waaarten.
Oder kann man millis im setup bereits so setzen, dass der Überlauf in den nächsten Stunden passiert?

meiner läuft erst die 3te Woche seit dem Update :wink: