RTC DS1307

Volevo segnalare ai frequentatori di questo Forum un'anomalia (che da inesperto mi ha fatto parecchio tribolare) nella quale sono incorso a causa dell'RTC.
Ho realizzato un progettino dove ho utilizzato quattro DS18B20 per la rilevazione di quattro diverse temperature nell'impianto Caldaia Gas - Termocamino Legna della mia abitazione. Uno di questi l'ho installato fuori l'abitazione per rilevare la temperatura esterna e determinarne a quale ora della giornata si è verificato il valore minimo. Ho perciò utilizzato un RTC tipo DS1307 e memoria RAM non volatile.
Per l'utilizzo dell'RTC ho fatto riferimento ad esempi di codice trovati sull'web. Tutti indicano di fare così:

void setup(void){
rtc.begin();
if(! rtc.isrunning()){
rtc.adjust(DateTime(F(DATE), F(TIME)));
}
.......

Ma così facendo va tutto bene fino a quando Arduino è alimentato per la programmazione.
Ma se lo si disalimenta, ad es. per il trasferimento in altro luogo dove ci sono i sensori e poi lo si rialimenta, ci si ritrova che la Data e Ora non è più aggiornata. L'RTC rimane "indietro".
Perchè tutto funzioni correttamente ho spostato "rtc.begin();" a valle dell'if, dove ho messo i ...... e tutto ha ripreso a funzionare correttamente.
Un saluto a tutti.

Il problema è in questa riga di codice:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Quando riavvii Arduino e cadi dentro l'if che dice che l'RTC non è in funzione (non chiedermi perché cada li dentro perché è strano) lo programmi con la data e ora di COMPILAZIONE.
Quindi succede che tu compili e invi il programma e l'ora è quella attuale e tutto ok. Dopo un po' togli l'alimentazione e lo accendi di nuovo senza inviare una nuva programmazione l'RTC viene reimpostata con la data/ora dell'ultima compilazione.
Quella riga va messa in un programma a parte che serve ad inizializzare l'RTC e non nel programma definitivo.
Se la batteria dell'RTC è carica anche senza alimentazione questo terrà la data/ora aggiornata in autonomia, altrimenti che RTC sarebbe :slight_smile:
In ogni caso dovresti prevedere un sistema per riallineare l'ora (o via web o manualmente da bottoni+display) perché ti servirà, pensa solo all'ora legare/solare, ma anche perché quell'RTC è veramente spreciso e perderai secondi a vagonate, io fossi in te passerei comunque al modello 3231 che è molto più preciso

... questo perché tu hai fatto semplicemente dei copia/incolla senza chiederti COSA stavi copiando/incollando ! ::slight_smile:

Questa riga: rtc.adjust(DateTime(F(DATE), F(TIME))); inizializza il RTC alla data/ora in cui è ... stato compilato il programma e serve solo per la prima inizializzazione !!!

Un avolta che l'RTC è stato inizializzato (e quella NON è sicuramente la via migiore), quella riga non serve più o, ogni volta che lo riavvi, lo reinizializzi sempre alla stessa data/ora ... quella in cui hai compilato il programma !

Mettere il rtc:begin() dopo NON è la cosa corretta ... dato che tu comunque vai a richiamare una funzione della libreria prima di aver fatto il begin(). La cosa giusta è inizializzare data ed ora e poi NON fare più la rtc.adjust() ... salvo non si debba rimettere la data/ora (ma, in tal caso, NON certo alla data/ora di compilazione).

Guglielmo

Edit: fabpolli mi ha preceduto :smiley:

Prendo atto delle vostre osservazioni e constato che mettendo “rtc.begin();” a valle dell’if, il programma lo testa subito trovando vera la relativa condizione. In quel momento , infatti, l’RTC non è in funzione. Poi , saltando alla riga successiva, il programma imposta Data e Ora, uguale a quella del PC.
Finalmente trova “rtc.begin();” e lo avvia. Una volta avviato la batteria lo tiene attivo con i dati appena impostati. Se si toglie e ridà alimentazione (ad Arduinio, ovviamente) il programma va di nuovo a testare l’if. Ma questa volta lo trova falso perchè l’RTC è attivo sin da prima. Così tira dritto e va a far dell’altro.
Mettendo “rtc.begin();” a valle è un pò come avvitare una lampadina nel suo portalampada prima di dar corrente.
Io l’ho capita così. E vedo che funziona. Infatti, con Arduino appena programmato, ho provato per alcune ore a tenerlo disalimentato. Ridata alimentazione, sul display LCD è comparsa l’ora perfettamente aggiornata. Cosa che prima non succedeva.

picluigi:
imposta Data e Ora, uguale a quella del PC.

In realtà quella di compilazione.

Ricorda che al passaggio all'ora estiva l'orario sarà indietro di un'ora.