RTC DS3231 impostare allarmi

andiamo per gradi...

 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

scrive ore , minuti e secondi sull'rtc

e.... la data?

Patrick_M:
andiamo per gradi...

 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



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

non ho nessun problema.

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.

zoomx:
Percaso dopo che l'anno doventa 2065 succede che poi rimane sempre quello?

Non saprei, come lo verifico?

L'alternativa, alla meno peggio, potrebbe essere leggere la data e riscriverla?

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.

ma scusate... so de coccio!

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

se la data parte dal 1997
devi mettere
setTime(23, 59, 58, 31, 12, 21)

Inizio a far confusione. :o :confused:

Se volessi ogni volta aggiornare la data con

 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 ?

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

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 :wink:

ArduAcquario_V3.0.ino (12.4 KB)

Function.ino (7.67 KB)

Function_Timers.ino (3.41 KB)

LCDML_CONTROL.ino (7.06 KB)

LCDML_DISP.ino (2.95 KB)

LCDML_FUNC_BACKEND.ino (1.12 KB)

LCDML_FUNC_DISP.ino (9.19 KB)

ecco ora mi sono perso :smiley:

Patrick_M:
ecco ora mi sono perso :smiley:

Ne ero sicuro, per questo ho evitato di postare tutto fin'ora :wink: :smiley: :smiley:

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 :wink:

ok cominciamo :slight_smile:

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 :slight_smile:
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 :wink:

Patrick_M:
ok cominciamo :slight_smile:

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 :slight_smile:
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 ;)

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

tm.Day = 0;//day();
    tm.Month = 0;// month();
    tm.Year = 0;//year();// - 1970;

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 :slight_smile:

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() ).

MISTERO!

!!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()

E' quello che ho provato a fare ma non capisco dove sbaglio.
Per cambiare la data, secondo lo schema che hai appena postato, come dovrei fare?

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