Time.h rollover după 49.7 zile [duplicat] (Arduino, C++, Cronometre, Millis)

BrunoAraujo a intrebat.

Dezvolt un sistem bazat pe arduino, care include un sistem de alarmă.

Căutând pe internet, am găsit aceste lybraries „Time.h” și „TimeAlarms.h”.

În cerințe, se spune: „Time nu necesită hardware special. La nivel intern, Time depinde de milis() de Arduino de la Arduin pentru a ține evidența timpului elastic.”

Având în vedere că funcția millis() a lui Arduino se prelungește după 49,7 zile, cum pot să mă asigur că aceste lybraries se ocupă bine de această prelungire?

Nu cred că a aștepta 49,7 zile pentru a testa este cea mai bună cale.

Comentarii

  • Consultați acest răspuns la o întrebare conexă. Mai exact, secțiunea intitulată Cum îmi testez schița împotriva rostogolirii millis. –  > Por Edgar Bonet.
  • V-ați gândit să folosiți un RTC? –  > Por Ignacio Vazquez-Abrams.
  • Deoarece aceasta este un duplicat al întrebării și răspunsului la care Edgar Bonet a făcut legătura, voi închide această întrebare. –  > Por Nick Gammon.
3 răspunsuri
Gerben

Atâta timp cât data este anterioară anului 2038, iar codul tău apelează una dintre funcțiile de timp cel puțin o dată la fiecare 49 de zile, rulajul nu te va afecta.

La nivel intern, biblioteca utilizează timpul epocii Unix. De fiecare dată când apelați o funcție, aceasta verifică dacă au trecut 1 sau mai multe secunde de la ultima dată când a fost apelată și apoi actualizează timpul epocii în consecință. Numai pentru această verificare se folosește millis(). Și verifică doar diferența dintre valoarea millis a ultimului apel și valoarea millis curentă, iar rularea nu are niciun efect asupra diferențelor de timp (atâta timp cât acestea sunt mai mici de 49 de zile).

utilizator27130

Ar trebui pur și simplu să cumpărați un ceas cu timp real, cum ar fi obișnuitul DS3231. Acestea funcționează bine și nu au probleme cu citirea datelor în repaus sau continuă. De asemenea, dictează și data!

Sper că v-am ajutat 🙂

Nick Gammon

Am o lungă perioadă de timp post despre acest lucru.

Pentru a evita să mergeți la link dacă nu doriți, răspunsul simplu este să scădeți atunci când calculați intervalele de timp, de ex.

unsigned long startTime = millis ();
unsigned long interval = 60000;

...

if (millis () - startTime >= interval)
  {
  // do something
  }

Acest funcționează întotdeauna! – chiar și după 49,7 zile – din cauza modului în care funcționează aritmetica fără semn.

Singurul moment în care ar da greș este dacă ar trebui să cronometrezi un interval de peste 49,7 zile – caz în care un ceas în timp real este un răspuns evident.

Un alt exemplu:

startedFeedingFish = millis ();

...

if (millis () - startedFeedingFish >= 20000)  // feed them for 20 seconds
  {
  // stop feeding the fish
  }