RTC con Arduino Mega

Buongiorno,
all'interno di un progetto più ampio (forse un po' ambizioso per il mio livello), voglio inserire un orologio.
In futuro sarà sfruttato anche come cronometro e come countdown.
Per ora limitiamoci a ora e data!
Uso un Mega per avere molti ingressi e un display da 3.2".
Devo monitorare parecchi sensori.
L'esigenza dell'orologio all'inizio era più un vezzo che altro, ora vedo l'opportunità di sostituire con questo strumento altri che già ho installati. Farei pulizia e libererei spazio.
Il tutto va installato in auto, alimentato dalla batteria della stessa tramite opportuno regolatore di tensione.
Scusate il prambolo lunghetto ma volevo inquadrare la questione.
Per raggiungere lo scopo monto un RTC esterno (077-H23318A) dovrebbe andare con le librerie per DS3231 e DS3232.

Eccomi quindi al punto: purtroppo non le trovo.

Sembra una cavolata ma è così.
Sto cercando da ore ma non cavo un ragno dal buco.
Ovunque vado finisco rimandato sempre su githib.com

ma qui la libreria non è il classico file da scaricare,c'è tutto il testo e io non so come usarlo perchè sono una capra!

Quindi eccomi qui a chiedere una mano.
O un posto dove scaricare la libreria o un modo per creare il file che mi serve partendo dal link che ho messo.
La seconda strada avrebbe anche un senso "didattico" che mi farebbe piacere seguire.

"Non dargli un pesce, insegnagli a pescare"......

Grazie a chiunque voglia dare il suo contributo.

da questo link clicca su "dowload zip" in alto a destra della lista dei file :wink:

VERGOGNA.....

:blush:

Visto che ormai la figuraccia l'ho fatta...proseguo con le domande da pivello.
Trovata e installata la libreria.
Provato uno sketch abbinato alla libreria e il tutto funziona.
Ovviamente mi restituisce un orario sbagliato visto che non è mai stato settato da nessuno.
Ho cercato i comandi per settarlo e provato degli sketch apposta (SetSerial, TimeRTCSet) per regolare l'ora da monitor seriale.
Sembra non abbiano nessun effetto.
L'ora resta quella della notte dei tempi.
Esiste un banale comando per settare l'ora e io non lo vedo come non vedevo il pulsante "download zip"?
Possibile.
Non mi serve inserire il codice all'interno del mio progetto. Posso settare l'ora una volta per tutte e poi usarla come mi serve. Almeno per ora.

Grazie

Riccardo

Guarda qui é facilissimo :wink:

Apri l esempio set serial, caricalo, apri il monitor seriale e metti la stessa risoluzione del serial begin nel esempio
poi sempre nel monitor seriale digita in ordine separati dalle virgole: anno,mese,giorno,ora,minuti,secondi e dai invio
cosi l rtc sarà impostato nell ora che vuoi tu e finché c é la batteria continuerà il tempo ad andare avanti :wink:

Ncora una volta vergogna!
Se non mi avessi indicato di impostare il baud rate avrei continuato a chiedermi perche non funzionava.
Eppure ero esattamente lí.
Arrivo al 99% della questione e lí mi fermo.
Cambieranno le cose!

Grazie, ovviamente funziona perfettamente.

Guzzi82:
Ncora una volta vergogna!
Se non mi avessi indicato di impostare il baud rate avrei continuato a chiedermi perche non funzionava.
Eppure ero esattamente lí.
Arrivo al 99% della questione e lí mi fermo.
Cambieranno le cose!

Grazie, ovviamente funziona perfettamente.

E di che! Farai tutto allora :slight_smile:

Grazie, dell'aiuto e della comprensione. :slight_smile:
Ho realizzato il mio orologio con datario, utilizzando il display 3.2"
Funziona bene e sono sodisfatto.:sweat_smile:

Da quando ho inserito il modulo RTC ho notato parecchi problemi di comunicazione con la scheda.
La cosa buffa è che ora li ha anche se scollego la scheda.
Compila, inizia a caricare il programma, l'esecuzione parte regolarmente ma il caricamento non viene "concluso", dopo alcuni minuti va in errore di trasmissione ma il sistema gira regolarmente.
Non capisco ma mi adeguo, disconnetto, riconnetto, rilancio, funziona.

Passiamo oltre.

Adesso voglio farne un cronometro e successivamente un timer.

Avete qualche sito dove prendere spunto? Io intanto cerco in giro.
Per il cronometro vorrei potere avere i classici 2 pulsanti start/stop e azzeramento.
Per il timer invece vorrei potere impostare il tempo nel modo più diretto possibile: un tasto per le ore, uno per i minuti e uno per i secondi. Potrei fare a meno delle ore basta potere impostare i minuti oltre i 60.
Non credo dovrò mai impostare un tempo superiore alle 2 ore (già 1 ora è tanto ma preferisco prevederlo).
Ho molti ingressi liberi, usare 5/6 pulsanti per le due funzioni non mi preoccupa (Mega).
Preferisco di gran lunga la praticità dei singoli tasti dedicati alle singole funzioni piuttosto che risparmiare ingressi inventando combinazioni di tasti.
Le condizioni di utilizzo saranno "concitate", deve essere ad accesso immediato, niente elocubrazioni mentali.

Già che ho chiesto 30, faccio 31: dove posso trovare delle istruzioni per la libreria dell RTC?

Grazie per i suggerimenti

Studiati innanzitutto la funzione millis perché ti servirà :wink:
MILLIS
ALTRO ESEMPIO

In poche parole millis ha la funzione di tenere a mente il tempo trascorso in ms da quando si accende la scheda di arduino :wink:

Un bell'esempio di cronometro è questo
Esempio

Studiaci un po' :wink:
Poi magari implementi il timer.

Perfetto, stavo già lavorando sulla millis().....
Grazie.

Guzzi82:
Perfetto, stavo già lavorando sulla millis().....
Grazie.

Fai bene :wink:

Perfetto. Il cronometro funziona perfettamente. Adesso devo scervellarmi un po' per fargli scrivere il tempo dividendolo in ore/minuti/secondi/centesimi.
Si perde più tempo a collocare le scritte sul display in modo che sia graficamente piacevole che a stendere il resto del codice.

Leggevo che Arduino (si parlava di UNO non so se MEGA faccia differenza) ha qualche limite di precisione nel conteggio del tempo. Tanto che l'uso di un modulo RTC è preferibile anche quando non ci siano problemi di interruzione dell'alimentazione.
Anche se credo che non usare un modulo esterno sia più uno sfizio che una scelta ragionata. Le librerie sono talmete comode e il costo talmente irrisorio....
Ma la domanda è questa: avendo un modulo RTC collegato, la funzione millis() ne giova? la frequenza la determina la scheda madre o il modulo aggiuntivo?
Pura curiosità.
Volendo usare il timer per tempi inferiori alle 2 ore, un eventuale errore di qualche decimo non mi reoccupa. Se fosero secondi però già sarebbe fastidioso.

Se ti può essere utile, io uso questa funzione per stampare in maniera intelligibile l'uptime di Arduino:

unsigned long uptime = millis () / 1000;
byte d, h, m, s;

d = uptime / 86400;
uptime %= 86400;
h = uptime / 3600;
uptime %= 3600;
m = uptime / 60;
uptime %= 60;
s = uptime;

d = giorni, h = ore, m = minuti, s = secondi

Per il resto, millis() non comunica in alcun modo con l'RTC. Se ne hai uno sta a te farli collaborare a dovere.

Ciao io uso l'rtc con arduino uno ma la differenza credo che sia nei pin..la frequenza dovrebbe essere la stessa se non sbaglio.
Per la stampa del tempo sul lcd dovresti usare la libreria Time se googli libreria time arduino c'è la guida ufficiale in inglese su come adoperarla..per quanto riguarda il timer o usi la funzione millis o usi TimeAlarms che è una sorta di sorella della libreria time..con questa libreria si creano dei timer con periodi che vanno da 1secondo a 50gg credo il tutto in modalita' 1 volta al giorno,2 volte al giorno etc...dopo 50gg dovrebbe andare in overlock e si resetta il conteggio....per periodi più lunghi c'è la funzione timeAction che non sò come funziona :slight_smile:

Guzzi82:
Perfetto. Il cronometro funziona perfettamente. Adesso devo scervellarmi un po' per fargli scrivere il tempo dividendolo in ore/minuti/secondi/centesimi.
Si perde più tempo a collocare le scritte sul display in modo che sia graficamente piacevole che a stendere il resto del codice.

Leggevo che Arduino (si parlava di UNO non so se MEGA faccia differenza) ha qualche limite di precisione nel conteggio del tempo. Tanto che l'uso di un modulo RTC è preferibile anche quando non ci siano problemi di interruzione dell'alimentazione.
Anche se credo che non usare un modulo esterno sia più uno sfizio che una scelta ragionata. Le librerie sono talmete comode e il costo talmente irrisorio....
Ma la domanda è questa: avendo un modulo RTC collegato, la funzione millis() ne giova? la frequenza la determina la scheda madre o il modulo aggiuntivo?
Pura curiosità.
Volendo usare il timer per tempi inferiori alle 2 ore, un eventuale errore di qualche decimo non mi reoccupa. Se fosero secondi però già sarebbe fastidioso.

Grazie ad entrambe per le risposte.
Le studierò a dovere mentre cerco anche la mia strada.
Da una prima prova durata poco più di mezz'ora il mio cronometro da polso segnava 32'17"32 mentre arduino contava 1921600 millisecondi (ovvero 32'01"600).
La differenza mi sembra troppo grossa per impuarla tutta alla mia poca destrezza nel fare partire il cronometro da polso in contemporanea col contatore di Arduino.
Sto facendo altre prove.

Da quello che so il conteggio (millis()) dovrebbe essere indipendente da come è scritto il codice. Non è una funzione che può essere rallentata da altre azioni che avvengono durante il loop (ovvero scrivere il dato sullo schermo)

mi sembra un errore molto grosso, troppo grosso....

Guzzi82:
Da quello che so il conteggio (millis()) dovrebbe essere indipendente da come è scritto il codice. Non è una funzione che può essere rallentata da altre azioni che avvengono durante il loop (ovvero scrivere il dato sullo schermo)

mi sembra un errore molto grosso, troppo grosso....

Mah ... guarda che millis() non è affatto preciso su tempi lunghi e del tutto inutilizzabile per avere un "orologio" preciso. Moltissimi fattori ne influenzano la precisone, tra cui la temperatura, l'oscillatore, la stabilità della tensione di alimentazione, ecc.

In pratica, per avere una precisone accettabile ci vuole un RTC esterno, per avere una precisione degna di tale nome, ci vuole un OTTIMO RTC esterno :grin:

Guglielmo

altro breve test: da cronometro Citizen 17'35"81 letti da Arduino 17'27"000 (1047000)
con un errore di 7"81 su 17'35"
il caso di prima era un errore di 15"72 su 32'17"
sono proporzionali
????

Perché probabilmente è propio l'oscillatore che NON oscilla esattamente a 16MHz e quindi ... l'errore è ovviamnete proporzionale.

Se fosse sempre così, già sarebbe correggibile con una fase di "calibrazione", ma se poi ci aggiungi gli altri fattori che ti ho elencato ... capisci bene da solo che il tutto va a farsi benedire.

Guglielmo

P.S.: Ho un'applicazione molto economica che non usa un RTC ma solo la millis() (... non mi è fondamentale la precisione) e, nonostante un meccanismo di calibrazione continua ogni volta che si corregge l'orario, la precisione è sempre molto bassa (parliamo anche di 20'/30' al giorno di differenza ... fortuna che, un giorno in più, uno in meno, e l'errore non cresce a dismisura :grin: ).

Verissimo..infatti nel datasheet del DS1302 c'è anche l'immagine su come mettere l'oscillatore sul pbc e i range di temperatura..non pensavo neanche io fosse così delicato..inoltre se i contatti non sono perfetti come c'è una piccola caduta salta tutto..è instabile ai movimenti su shield figuriamoci su breadboard senza batteria XD.

gpb01:
Mah ... guarda che millis() non è affatto preciso su tempi lunghi e del tutto inutilizzabile per avere un "orologio" preciso. Moltissimi fattori ne influenzano la precisone, tra cui la temperatura, l'oscillatore, la stabilità della tensione di alimentazione, ecc.

In pratica, per avere una precisone accettabile ci vuole un RTC esterno, per avere una precisione degna di tale nome, ci vuole un OTTIMO RTC esterno :grin:

Guglielmo

Ok. Stabilito che millis() non è il mio strumento.
Se lo dice un generale di corpo d'armata ci devo credere!
A questo punto devo capire come usare il mio RTC per il cronometro.
Qualche post fa chiedevo se qualcuno sapeva dove reperire le istruzioni per usare la libreria RTC (nel mio caso la DS3232RTC.h)
Magari lì trovo i comandi per costruire un cronometro.

In merito alla bontà del modulo RTC vorrei chiederti cosa intendi.
A me serve un orologio normalissimo, sto costruendo un piccolo pannellino da montare in auto sul quale leggere alcuni parameti del motore. Ho pensato di usarlo anche come orologio visto che non ce l'ho.
Se prende 1' in 1 mese.... amen
Anche il cronometro (l'appetito vien mangiando) non deve essere "atomico", ma su tempi di 1h o 2h mi deve tenere il secondo.

Per queste esigenze serve un RTC "di classe" o basta qualcosa da battaglia?

Grazie ancora