[TUTORIAL] Orologio/Cronometro con RTC e collegamento ad Internet (Parte 2 di 2)

ciao a tutti...
scusate per l'attesa ma è stata dura mettere insieme tutti i pezzi e farli funzionare tutti correttamente..
durante le varie prove sono incappatto in diversi problemi:
1: nella funzione cronometro

....
   secc = (millis() - startmillis) / 1000;
    hrsc = (secc / 3600);
    secc = secc - (hrsc * 3600);
    minc =  (secc / 60);
    secc = secc - (minc * 60);....

dopo 9 ore 6 minuti e 7 secondi iniziavano i problemi,
piuttosto che incrementare sempre i secondi iniziava una sorta di countdown.
questo "fenomeno" è dovuto a un overflow per via della differenza tra due unsigned long (4.294.967.295) dentro una variabile
int (32.767), dato che la differenza tra l'ora di avvio e l'ora attuale è tutto espresso in millis, dopo circa 9 ore
cresce oltre al limite massimo che un int può contenere..

SOLUZIONE:
si usa un operatore di cast.

...
secc = (millis() - startmillis) / 1000;
    hrsc = secc / 3600;
    secc = secc - ((unsigned long) hrsc * 3600UL);
    minc = secc / 60;
    secc = secc - (minc * 60);
...

facciamo un esempio, sono trascorsi 10 ore 59 minuti e 59 secondi
quindi andiamo a sostituire questo valore al valore secc
secc= 39599

hrsc = (int) (secc / 3600); hrsc = (int) (39599/3600) = 10 ore

secc= secc- ((unsigned long)hrsc3600); secc= 39500 - ((unsigned long)103600); =3599 (come potete notare il numero tra parentesi è un numero piu grande di un int, ma è stato trasformato in un unsigned long)

minc= (int) (secc/60); minc=(int) (3599/60); = 59 minuti

2:nel progetto iniziale c'era anche il prelievo giornaliero da NTP, ahime
ma la mermoria scarseggiava e quindi l'ho dovuto eliminare.
a questo piccolo problema sinceramente non ho trovato soluzione..
in futuro si vedrà...:slight_smile:
spero tutto cio possa essere di aiuto ad altre persone..

PS: secc è stato dichiarato come unsigned long

un ringraziamento speciale va a Guglielmo e tutti quelli che mi hanno sopportato in questo thread.
grazie e alla prossima.

bloccorologio_2.0.ino (14 KB)