RTC DS1307 non calcola l'ora esatta e non si allinea

Ciao a tutti,
sto avendo un piccolo problema con il modulo RTC pre-assemblato.

Tale modulo è collegato al mio ArduinoMega e serve per azionare alcuni relè nel determinato orario.

Nel dettaglio, non si sincronizza al pc dopo aver compilato lo sketch e purtroppo ho dovuto fare un "mageggio" per renderlo effettivo.

Utilizzo la libreria "RTClib.h" ed è collegato tramite I2C.

Nel Setup ho impostato il seguente codice:

  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

Mentre nel loop

 if ( RTC.isrunning()) {
    Serial.begin(9600);
    Serial.println("####################");
    DateTime now = RTC.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
    int _hour   = now.hour();
    int _minute = now.minute();

Purtroppo anche se ho fatto mille prove di compilazione per allineare l'orario al pc, dal monitoring noto che mi restituisce il seguente orario:

2019/10/22 9:6:49 mentre l'orario corretto era 2019/10/25 23:06:35

Pertanto per aggiornarlo al vero orario ho dovuto fare questo giochetto:

        if ( _hour > 9 ) {
        hourminute = ((_hour*100)+(_minute - 1000));
        Serial.print("ORE-MINUTI MAGGIORE DELLE 9 - 10:");
        Serial.println(hourminute);
        } else {
        hourminute = ((_hour*100)+(_minute + 1400));  
        Serial.print("ORE-MINUTI MAGGIORE DELLE 9 + 14:");
        Serial.println(hourminute);
        }

con il seguente log nel monitoring.

####################
2019/10/22 9:6:49
ORE-MINUTI MAGGIORE DELLE 9 + 14:2306

Ora la mia domanda anche se ovvia, Come lo risolvo tale problema, visto che leggendo i post non riesco a trovare una soluzione.

Vi chiedo aiuto.

Non lo risolvi visto che quelle sono due MACRO che impostano semplicemente la data/ora della "compilazione" del programma ... quindi, tra quando compili e quando esegui ... passa più o meno tempo e l'orario non è certo quello giusto ... ::slight_smile:

Devi scrivere un pezzo di codice che accetta, ad esempio da monitor seriale, la data e l'ora e nel momento in cui tu la trasmetti premendio invio, la memorizza nel RTC rimettendolo alla data/ora esatta voluta.

Guglielmo

__DATE e __TIME non sono l'ora del PC ma la data/ora di compilazione, quindi non è che quando avii Arduino collegato via USB lui prende l'ora del PC. L'ora poi è "sfalsata" perché rappresentata con l'ora UTC. La Data di tre giorni prima probabilmente corrisponde a quando effettivamente hai compilato il programma per caricarlo su Arduino.
Se il tuo obiettivo è quello di prelevare l'ora dal pc ad ogni accensione con questo modo non sei sulla strada corretta.
Mi confermi che hai necessità di sincronizzare l'ora dell'RTC ad ogni avvio di Arduino con quella del PC? Perché se è così (ovvero Arduino collegato al PC) allora l'RTC forse è pure superfluo, altrimenti non hai la necessità di reimpostare l'ora ad ogni avvio, anche se il modello di RTC scelto pecca in quanto a precisione. Aspetto notizie :slight_smile:
EDIT: In comtemporanea con gpb01

Buon pomeriggio Guglielmo,

prima di tutto grazie della risposta e mi scuso in anticipo se non capisco correttamente quello che mi vuoi spiegare,ma volevo solo esprimere la mia poca conoscenza sulla questione.

gpb01:
Non lo risolvi visto che quelle sono due MACRO che impostano semplicemente la data/ora della "compilazione" del programma ... quindi, tra quando compili e quando esegui ... passa più o meno tempo e l'orario non è certo quello giusto ... ::slight_smile:

Nel precedente post, volevo indicare che ho eseguito tante compilazioni (anche intervallate di pochi minuti), in quanto ho inserito nuove funzioni all'interno del codice, pertanto non mi lamento del disallineamento di pochi minuti/secondi (tempo tra la compilazione al caricamento). ma della differenza di circa 12 ore.

gpb01:
Devi scrivere un pezzo di codice che accetta, ad esempio da monitor seriale, la data e l'ora e nel momento in cui tu la trasmetti premendio invio, la memorizza nel RTC rimettendolo alla data/ora esatta voluta.

Guglielmo

Verifico come impostarlo, ma non credo sia la soluzione necessaria in quanto il pc non è sempre collegato.

Inoltre spesso (a causa di una programmazione o cablaggio errato dei Relè) sono costretto ad eseguire una volta a settimana un reset del singolo arduino attraverso il tasto presente sulla scheda.

Quindi mai collegato al PC.

claudiocre:
Purtroppo anche se ho fatto mille prove di compilazione per allineare l'orario al pc, dal monitoring noto che mi restituisce il seguente orario:
2019/10/22 9:6:49 mentre l'orario corretto era 2019/10/25 23:06:35

Scusa, anche gli altri ti hanno scritto qualche risposta ma comunque non mi è proprio chiaro. Che intendi esattamente con "allineare l'orario al pc"?
Ardino non si allinea affatto col PC, neanche se ha la USB connessa. L'RTC ha un suo clock interno che viene settato con RTC.adjust(), punto. Chi/quando si chiama la RTC.adjust() dipende dal programma che hai caricato su Arduino.

Come ti hanno già scritto gpb01 e fabpolli, __DATE e __TIME sono solamente data ed ora di compilazione, e quindi se non ricompili il programma avranno sempre lo STESSO valore. Per superare questo problema, basta compilare il programma e caricarlo una prima volta, al che la adjust() porterà nell'RTC il valore corretto (a meno della differenza di qualche secondo tra la compilazione ed il termine del caricamento, per bilanciare questo potresti impostare 10-15 secondi in avanti). Poi COMMENTA la adjust(), ricompila e carica nuovamente: il programma ora avrà l'ora giusta (sempre a meno di quella differenza di cui sopra).

Altrimenti se Arduino ha una connessione di rete (Ethernet o WiFi) allora puoi usare addirittura i server NTP su internet (tramite apposita libreria) per avere l'ora sicuramente esatta.

Se invece nonostante DATE e TIME siano differenti perché hai ricompilato ma la now() ti dà sempre lo stesso valore iniziale, mi suona come si possa trattare di un problema di quell'RTC (la batteria c'è? E' carica?) in tal caso proverei con un altro RTC (se non ce l'hai, al posto tuo ne prenderei un altro comunque...).

claudiocre:
... Verifico come impostarlo, ma non credo sia la soluzione necessaria in quanto il pc non è sempre collegato.

Come ti hanno già detto, NON devi essere sempre collegato al PC ... ti basta la prima volta per rimettere "l'orologio" del RTC ... sarà poi quest'ultimo, anche se Arduino è spento o non collegato, ad andare avanti e mantenere data/ora corretta, grazie alla sua batteria (che deve essere presente e carica).

Quindi ... puoi anche fare un banale programmino che usi UNA vola per rimettere l'RTC, poi carichi il tuo programma e lo trovi già con data/ora corretta ... altrimenti, se non è così, sempre come ti è già stato detto, è guasto l'RTC o non c'è la batteria.

Guglielmo

Ciao Guglielmo e DOC,

Come da voi suggerito, verificherò la batteria (anche se credo che non sia il problema, visto che lavora correttamente) e con un secondo RTC.

docdoc:
Se invece nonostante DATE e TIME siano differenti perché hai ricompilato ma la now() ti dà sempre lo stesso valore iniziale, mi suona come si possa trattare di un problema di quell'RTC (la batteria c'è? E' carica?) in tal caso proverei con un altro RTC (se non ce l'hai, al posto tuo ne prenderei un altro comunque...).

gpb01:
Come ti hanno già detto, NON devi essere sempre collegato al PC ... ti basta la prima volta per rimettere "l'orologio" del RTC ... sarà poi quest'ultimo, anche se Arduino è spento o non collegato, ad andare avanti e mantenere data/ora corretta, grazie alla sua batteria (che deve essere presente e carica).

Quindi ... puoi anche fare un banale programmino che usi UNA vola per rimettere l'RTC, poi carichi il tuo programma e lo trovi già con data/ora corretta ... altrimenti, se non è così, sempre come ti è già stato detto, è guasto l'RTC o non c'è la batteria.

Guglielmo

Vi terrò aggiornati. Grazie ancora