case 2:
tm.Hour = tmpHours; //set the tm structure to 23h31m30s on 13Feb2009
tm.Minute = tmpMinutes;
tm.Second = 0;
/*
tm.Day = 18;
tm.Month = 5;
tm.Year = 2018 - 1970;
*/
qui tu imposti sulla tua struttura
ore
minuti
secondi
la data è commentata per cui non viene toccata quindi i valori che ci sono scritti.... nessuno li sa
questo:
SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
dove scrive i dati che recupera?
e questo
RTC.write(tm); //set the RTC from the tm structure
tm.Hour = tmpHours; //set the tm structure to 23h31m30s on 13Feb2009
tm.Minute = tmpMinutes;
tm.Second = 0;
/*
tm.Day = 18;
tm.Month = 5;
tm.Year = 2018 - 1970;
*/
qui tu imposti sulla tua struttura
ore
minuti
secondi
la data è commentata per cui non viene toccata quindi i valori che ci sono scritti.... nessuno li sa
questo:
SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
dove scrive i dati che recupera?
e questo
RTC.write(tm); //set the RTC from the tm structure
scrive ore , minuti e secondi sull'rtc
e.... la data?
E' questo l'assurdo! (Scusa il punto interrogativo). Io non dico da nessuna parte di scrivere la data.
E' per questo non capisco il motivo per cui mi restituisce quelle date a caso (... per non dire altro... :D)
Se invece decido al momento del caricamento dello sketch di aggiornarla con
setTime(8, 29, 58, 19, 5, 18); Serial.println("Orario impostato manualmente"); //set time to Saturday 8:29:59am May 19 2018
Percaso dopo che l'anno doventa 2065 succede che poi rimane sempre quello?
Perché io sospetto un problema con l'alimentazione e la batteria di backup. Oppure al chip arriva un reset?
Se hai il modulo cinese ha un errore noto, c'è una sorta di circuito di ricarica della batteria tampone solo che la batteria tampone è non ricaricabile.
Su Internet ci sono delle foto della modifica da fare . Se non ricordo male, una di queste consiste nel dissaldare l'unico diodo presente.
se la scrittura sull'rtc prevede che vengano passate
ora
minuti
secondi
giorno della settimana
giorno
mese
anno
se tu le ultime 4 non glie le dai le prenderà a caso no?
zoomx:
Voglio dire, se stampi la data in periodi successivi non si schioda da 2065? Giusto per capire se non si tratti di un problema di comunicazione.
Credo proprio di si.
Ho provato con
setTime(23, 59, 58, 31, 12, 68); Serial.println("Orario impostato manualmente"); // set time to Saturday 8:29:59am May 19 2018
RTC.write(tm);
SyncRTC();
e l'output è stato
Orario sincronizzato con RTC
0:00:00 Gio, 31/12/2065
tm.Hour = tmpHours; //set the tm structure to 23h31m30s on 13Feb2009
tm.Minute = tmpMinutes;
tm.Second = 0;
tm.Day = day();
tm.Month = month();
tm.Year = year();
//SyncRTC(); // Sincronizzo il RTC per recuperare la data corretta
RTC.write(tm); //set the RTC from the tm structure
Serial.println("MEMORIZZO ED ESCO");
SyncRTC(); // Sincronizzo il RTC per aggiornare ora e data sul display
che valore dovrebe avere year()? Inoltre, perchè da qualche parte ho letto che facevano tm.Year = ANNO CORRENTE - 1970 ?
Patrick_M:
a prescindere che fino ad ora non ho visto uno sketch completo quindi anche per la libreria devo andare a naso....
se tu fai tm=rtc.getTime() o tm=rtc.get() o qualche cosa del genere a seconda della libreria
ti carica tutti i dati nella tua struttura e poi li modifichei come vuoi
Patrick_M:
a prescindere che fino ad ora non ho visto uno sketch completo quindi anche per la libreria devo andare a naso....
se tu fai tm=rtc.getTime() o tm=rtc.get() o qualche cosa del genere a seconda della libreria
ti carica tutti i dati nella tua struttura e poi li modifichei come vuoi
Tranquillo, non ho nessun problema a postare lo sketch completo, anzi... Il problema è solo che lo sto continuamente aggiornando implementando nel frattempo le funzioni che mi sono prefissato di fargli fare e quindi, in alcuni punti potrebbe essere poco comprensibile o incompleto.
Speravo che postando solo i "pezzi" interessati avrei potuto risolvere il problema.
Allego subito tutto il progetto (diviso per comodità in diverse schede) sperando che riesca ad aiutarmi
Ne ero sicuro, per questo ho evitato di postare tutto fin'ora
Se vuoi un consiglio cocentrati sulle librerie DS3232RTC e TimeLib e lascia stare tutto il resto (sintassi ecc ecc.)
La libreria LCDMenuLib è davvero bella e copleta ma necessita di un'attimo di concentrazione per capirne i meccanismi d'utilizzo prima di poterla usare e capire cosa succede durante il run dello sketch
in arduAcquario c'è il setup
e li lanci la SyncRTC()
che dovrebbe aggiornare i valori di arduino con quelli dell'RTC
e scriverteli sulla seriale per cui apri la seriale e controlla che data ti da
se è sbagliata devi correggerla
purtroppo in LCDML_FUNC_DISP non hai la possibilità di variare la data
tm.Day = 0;//day();
tm.Month = 0;// month();
tm.Year = 0;//year();// - 1970;
i tre campi vengono messi a 0 in automatico
per cui per scrivere in modo corretto la data sull'RTC devi procedere con un nuovo programmino che scriverai a parte ( negli esempi del ds3231 mi pare che ci sia) per settare ora e data corrente.
una volta fatto ricarichi questo programma e controlli
in arduAcquario c'è il setup
e li lanci la SyncRTC()
che dovrebbe aggiornare i valori di arduino con quelli dell'RTC
e scriverteli sulla seriale per cui apri la seriale e controlla che data ti da
se è sbagliata devi correggerla
purtroppo
in LCDML_FUNC_DISP non hai la possibilità di variare la data
i tre campi vengono messi a 0 in automatico
per cui per scrivere in modo corretto la data sull'RTC devi procedere con un nuovo programmino che scriverai a parte ( negli esempi del ds3231 mi pare che ci sia) per settare ora e data corrente.
una volta fatto ricarichi questo programma e controlli ;)
Uffy, sapevo che non era una buona idea allegare tutto il codice in formato work in progress...
Allora, quando dici:
in LCDML_FUNC_DISP non hai la possibilità di variare la data
questo è in parte vero perchè nella realtà se rileggi i miei post precedenti il case2 era scritto così:
case 2:
tm.Hour = tmpHours; //set the tm structure to 23h31m30s on 13Feb2009
tm.Minute = tmpMinutes;
tm.Second = 0;
/*
tm.Day = 18;
tm.Month = 5;
tm.Year = 2018 - 1970;
*/
e nel frattempo lo avevo modificato per fare le prove che mi avevi chiesto.
Quando invece dici
in arduAcquario c'è il setup
e li lanci la SyncRTC()
che dovrebbe aggiornare i valori di arduino con quelli dell'RTC
e scriverteli sulla seriale per cui apri la seriale e controlla che data ti da
se è sbagliata devi correggerla
ti avevo già chiesto come secondo te dovrei scrivere correttamente il tutto per far sì che la data venga impostata correttamete e, soprattutto, cosa secondo te significa quel 2018 - 1970 (ovvero anno corrente mento 1970) che ho trovato in alcuni esempi. Se infatti scrivo l'RTC con 2018 - 1970 riesco ad ottenere poi a display la data giusta.
tm.Second = 0;
/*
tm.Day = 18;
tm.Month = 5;
tm.Year = 2018 - 1970;
*/
ok ma se fai così va bene una sola volta
comunque l'importante è che tu riesca a settare la data correttamente...
dopodichè con l'istruzione subito successiva rtc.write() dovrebbe aggiornarti l'rtc
però qualche post indietro hai detto che l'rtc con quel calcolo li ti da 2065 come anno...
Allora con quel comando dovrei riuscire ad impostare la data corretta.
Per ora non ho previsto un submenù per aggiornare anche la data ma solo l'orario e, forse, dovrei farlo perchè nel caso dovesse rovinarsi la batteria tampone non vi sarà più possibiltà di aggiornare la data se non con IDE.
Detto questo, nasce poi il problema che ho sollevato all'inizio e cioè che non capisco il perchè, anche se non lavoro con le date ma solo con gli orari, ad ogni rtc.write() viene modificata anche la data con valori inesatti (anche se vado a risincronizzarli con SyncRTC() prima di eseguire l'rtc.write() ).
!!attento!!! SyncRTC non aggiorna i valori in tm.tuttiicampi
ma solo i valori di arduino (day(), month(), year())
dovrai copiarli tu su tm.qualchecosa
secondo me è proprio perchè nei campi tm.year, day e month non ci sono i valori corretti
il ciclo corretto per aggiornare l'ora (e anche ladata) è
chiamare SyncRTC()
aggiornare i valori di tm
tm.year=year()
tm.month= month()
tm.day= day()
poi regoli l'ora se necessario
e infine scrivi sull'rtc TUTTI i valori corretti
rtc.write()
infatti fa un giro contorto per caricarti i valori dell'orario su tm:
in LCDML_FUNC_DISP
questa funzione
void LCDML_DISP_setup(LCDML_FUNC_set_time)
carica su due variabili temporanee i valori ore e minuti
tmpHours = hour();
tmpMinutes = minute();
poi questa funzione
void LCDML_DISP_loop(LCDML_FUNC_set_time)
copia i valori temporanei (modificati o no) sulle cottispondenti tm
tm.Hour = tmpHours; //set the tm structure to 23h31m30s on 13Feb2009
tm.Minute = tmpMinutes;
tm.Second = 0;
nella prima funzione o qui nella seconda devi aggiungere appunto i valori che mancano