Continuo la serie dei miei tutorial sull’RTC DS1307 ed Arduino, in questo articolo ti mostro come puoi utilizzare un RTC DS1307 già assemblato.
Rispetto alla shield RTC di cui puoi leggere i precedenti articoli:
- Tutorial: RTC Shield con DS1307
- RTC Arduino: usa arduino come orologio
- RTC shield DS1307: impostare data e ora
- Data logging con Arduino
Questa scheda RTC DS1307 può esserti utile per realizare gli stessi progetti con il vantaggio delle ridotte dimensioni oltre al fatto che non devi assemblartela.
Inoltre ho acquistato questa scheda per poterla utilizzare nel mio progetto RTC Rainbow Ring V3 orologio luminoso che nei prossimi articoli utilizzerà la RTC DS1307 per recuperare l’ora esatta anche in mancanza di alimentazione grazie alla batteria tampone di cui è dotata:
Schema dell’RTC DS1307
la scheda è già assemblata, a parte i pin, questo ti permette di decidere se dalsare dei pin lineari, dei pin ad angolo o degli strip femmina, utilizza il tipo di connessioni pin necessarie al tuo progetto.
Su entrambi i lati, presenta una linea di pin a cui saldare gli strip per connettere la shield al tuo progetto:
io ho saldato degli strip semplici, maschio, da entrambi i lati per poterla utilizzare sulla breadboard.
In realità pensando di utilizzarla con la Rainbow Ring V3 avrei potuto saldare degli strip femmina a 90° per collegare agevolmente le due schede nel mio progetto.
I pin delle due schede coincidono in quanto presentano la stessa sequenza: SCL,SDA,Vcc,Gnd:
Sketch per l’RTC DS1307
Per provare l’RTC DS1307 ho utilizzato la libreria RTCLib utilizzata anche negli altri articoli e l’esempio DS1307:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Serial.begin(57600); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { 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(); Serial.print(" since midnight 1/1/1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("d"); // calculate a date which is 7 days and 30 seconds into the future DateTime future (now.unixtime() + 7 * 86400L + 30); Serial.print(" now + 7d + 30s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(3000); }
Buon divertimento !!!
96 commenti
Vai al modulo dei commenti
ciao mauro
ti volevo chiedere circa il RTC 1307 .
Ho realizzato in versione Stand alone il termometro, + la registrazione su SD ( cololegato su miso e mosi ) e il gruppo RTC 1307 quest’ultimo colllegato elettrricamente su SCL SDA del atmega328p-pu, la mia domanda e questa :
compilando il codice e spedendolo sull atmega328 tramite arduino Mega adk lui fa partire l’ora e minuti dal momento della compilazione e va in avati l’ora senza problemi. Ma se voglio cambiare l’ora a mio piacimento l’ora esiste un modo semplice per interagire con l’rtc senza ricompilare il codice . Infatti se avvio il circuito e poi stacco l’rtc dal SDA E SCL l’ora cmq viene registrata . come posso fare ?
Nel codice vedrai anche delle righe disabilitaTe // perche ho fatto delle prove con l’rtc .ma cqm non e’ cambiato nulla.
ti ringrazio
Armando
Autore
Ciao Armando,
ho letto quello che hai postato e come spesso scrivo ti chiedo di non inviare codice nei commenti perchè è illegibile.
Per modificare l’ora puoi leggere uno degli articoli dedicati all’RTC ho scritto uno sketch in cui eseguo il cambio ora 🙂
Mauro
ok grazie
ti faccio sapere l’esito
a.
Ciao mauro, ho istallato l’rtc ds1307 e compilato lo script. Visualizzando la data sul monitor seriale i dati sono corretti e vengono aggiornati correttamente. Il mio problema è mandare un segnale HIGH oppure un clock in uscita da un pin digitale in corrispondenza ad un orario o ad una data. Io ho provato i comandi (iSerial.available e serial .read con opportuni cicli if) ma in uscita non mi da niente. hai qualche consiglio?
Grazie in anticipo,
alessio
Autore
Ciao Alessio,
i comandi che stai utilizzando servono per comunicare attraverso il canale seriale/usb di arduino, non fa quello che ti occorre.
Quello che vuoi realizzare é più simile al concetto di sveglia o timer, puoi leggere l’articolo sul l’irrigazione arduino, troverai dei concetti più simili a quello che vuoi realizzare.
Dovrai ovviamente adattare lo sketch seguendo la spiegazione che trovi nei ieri articoli.
Mauro
Grazie Mauro, ho risolto il problema grazie ai tuoi suggerimenti!
Autore
Ciao Alessio,
sono contento per te, non vedo l’ora di sapere che il tuo progetto é pronto e ti offro fin da ora la possibilità di condividerlo sul Blog.
Mauro
Buongiorno Mauro,
ho un Arduino UNO, ho scaricato la libreria RTC da tè consigliata, ho collegato la scheda RTC DS1307 come da tutorial, ho usato lo stesso sketch del tutorial ma quando avvio il monitor seriale mi compaiono stranissimi caratteri ,tipo cirillico 🙂 suppongo sia un problema di codifica o di protocollo … non sò che cosa fare, avresti dei consigli da darmi per risolvere il problema?
Complimenti per la pulizia delle saldature 🙂 … che saldatore usi?
Autore
Ciao Paolo,
i caratteri strani sul monitor seriale potrebbero dipendere dal Baud rate impostato nello sketch e sul monitor seriale.
Controlla che entrambi siano a 9600, chiusi e riapri il monitor seriale.
Il saldatore che utilizzo è uno di quelli comuni da bricocenter da 35/40w ciò che penso faccia la differenza è lo stagno che uso un 60stagno 40 piombo … solitamente invertono le proporzioni.
Mauro
grazie, era il Baud rate, però lo ho impostato a 57600 come nel tuo esempio, che tipo di vantaggi o svantaggi può portare la modifica del Baud rate? Ho intenzione di realizzare un monitoraggio per un piccolo impianto fotovoltaico con supervisione web … ed anche un sistema di irrigazione (ho visto che hai un post sull’argomento) con sensori di controllo, tutto tramite web …
35/40 w ? non lo avrei mai detto … io uso ancora la pasta saldante … anche tenere pulita la punta del saldatore con un pò di carta vetrata aiuta molto nella saldatura
Saluti
Autore
Ciao Paolo,
per comprendere le differenze sulle impostazioni di baudrate ti consiglio di leggere la pagina di wikipedia sul baud rate, è un argomento lungo da sviscerare in un commento.
Mauro
Ciao Mauro,
non capisco una cosa. Nei collegamenti utilizzi i pin 4 e 5 ma poi nello sketch, tramite la libreria fai solo “DateTime now = RTC.now();”
E’ la libreria che utilizza i pin 4 e 5 ?
Se volessi cambiare i pin dovrei agire sulla libreria?
Inolotre a cosa serve Wire.begin(); ?
Autore
Ciao Giordano,
L’RTC usa il protocollo I2C che su arduino trovi sui pin A4 ed A5 e non puoi spostare altrove a meno di non cambiare modello di arduino la Mega ad esempio usa 20 e 21 per questo protocollo.
La libreria usa quei due pin in modo certo sapendo ciò che ti ho scritto sopra.
Il metodo begin() dell’oggetto Wire ( Wire.begin() ) inizializza l’uso dell’oggetto Wire incaricato di comunicare con l’RTC attraverso il protocollo I2C
Mauro
Grazie!
Mi è capitato che l’RTC perdesse totalmente le informazioni sulla data oppure che abbia un ritardo di qualche minuto. Mi è anche successo che la data sia corretta ma, non alimentando più l’RTC, riprovando il giorno dopo, prelevando il giorno tramite now.day() non venga conteggiato l’incremento del giorno…
Eppure la batteria tampone è carica… come mai secondo voi?
Autore
Ciao Giordano,
le anomalie che rilevi sembrano dovute a qualche calo di tensione non compensato dalla batteria tampone o al malfunzionamento dell’RTC.
Se la batteria tampone è carica e connessa saldamente alla shield protenderei per il secondo motivo.
Quanti giorni hai tenuto in test il progetto verificando queste anomalie? E quante volte i quei giorni si sono verificate?
Il secondo problema ( reset della data ) potrevbbe essere invece dovuto allo sketch che in fase di setup() non trova l’RTC o quest’ultimo non gli risponde immediatamente ed entra nella routine di impostazione dell’ora resettandola al giorno in cui hai caricato lo sketch, é successo anche a me.
Mauro
Scusa se rispondo solo ora.
L’anomalia l’ho rilevata facendo prove ovvero eseguendo il codice più volte e modificandolo. L’anomalia del giorno passato ma non tenuto in conto dall’RTC l’ho rilevata facendo dei test a mezzanotte. Dopo 10 minuti dalla mezzanotte l’orario rilevato dall RTC era giusto, ma il giorno era rimasto fermo.
La batteria risulta, con un tester, carica ed avendo l’alloggiamento apposito sembra ben salda.
Cmq questi problemi li rilevo solo dopo che stacco e spengo tutto il circuito. Se all’accensione lo allineo all’orario giusto, poi chiaramente i minuti vengono rispettati mentre per il giorno non ho più potuto fare test a mezzanotte.
Rileggendo il commento mi rendo contro che non è chiarissimo… devo intanto perderci più tempo io.
Per gli utenti del sito: https://www.youtube.com/watch?v=k-g-h3u-66s
Autore
Ciao Giordano,
ho provato diverse shield con RTC senza rilevare errori come quelli che mi descrivi.
Ti suggerirei di cambiare RTC e verificare nuovamente, potrebbe essere difettoso il componente.
Mauro
Ciao Mauro, innanzitutto ti ringrazio perchè il tuo sito mi ha letteralmente guidato nelle prime esperienze con arduino ed è tutto spiegato veramente bene. Volevo segnalarti che oggi ho provato lo sketch riportato e non ha funzionato( in particolare, la seriale restituiva sempre RTC NOT RUNNING , e sempre la stessa data e ora di default). Alla fine ho risolto scaricando un altra versione della libreria RTC ( da questo indirizzo: https://github.com/adafruit/RTClib )
Segnalo questa cosa nel caso altri lettori incontrassero le stesse difficoltà .
Grazie per tutti i tuoi meravigliosi tutorial senza i quali oggi probabilmente starei ancora accendendo e spegnendo un led 😀
Andrea
Autore
Grazie Andrea per la condivisione dell’informazione.
Una curiosità personale: che RTC shield possiedi?
Lo stesso identico modulino che è riportato sopra nelle foto. L’unica differenza grafica che sono riuscito a notare, è che i nomi dei vari pin nel mio modulino sono riportati sotto, nel lato dove c’è l’oscillatore e non in quello superiore dove c’è la batteria tampone. Per il resto stessa forma, stesso colore, stessi pin, ecc ecc 🙂
Autore
Ciao Andrea,
mi è sorto il dubbio che la tua scheda potesse essere più simile a quella della adafruit che a quella da me utilizzata.
Questa differenza potrebbe spiegare anche il funzionamento con la libreria che hai scaricato.
Mauro
Ciao.
Anche a me restituisce sempre lo stesso messaggio.
E la data è impossibile da modificare.
Il mio modulo è quello che hai usato in altri progetti, che si innesta sopra arduino UNO
Questa sera proverò anche io quello sketch.
Spero di risolvere.
Autore
Ciao Enrico,
quando dici “restituisce sempre lo stesso messaggio” intendi RTC not found ?
Se si potresti avere un modulo non compatibile con la libreria che hai scaricato.
Se usi la shield rtc della futura elettronica, che io ho utilizzato in altri tutorial, sappi che devi usare la libreria modificata consigliata in quei tutorial e sul sito del produttore.
Ciao Mauro, prima di tutto complimenti per tutti i tutorial, mi sto avvicinando al mondo di Arduino da poco più di un mese e il tuo sito mi sta aprendo un mondo davanti agli occhi!
Ho letto in internet che la batteria LIR2032 è una batteria ricaricabile; l’alimentazione necessaria per la ricarica (sempre se è prevista da questo shield) deriva dall’alimentazione della scheda stessa (Vcc Gnd) o va alimentato un altro piedino apposito? A tal riguardo, sai fornirmi brevemente qualche indicazione sulla funzione degli altri piedini o dove posso reperirla? Non sono ancora pratico nel trovare le informazioni a riguardo, sto scoprendo pian piano i siti da consultare e questo fin’ora mi è risultato il migliore per un inesperto di elettronica come me.
Grazie mille e ancora complimenti!!!
Autore
Ciao Matteo,
non conosco la LIR2032 come batteria ricaricabile e dubito che questa shield possa ricaricare tale pila.
In ogni caso ti consiglio di far riferimento al produttore della shield per verificare il funzionamento degli altri pin e la posibilità di ricaricare la batteria.
Innanzitutto, grazie di esistere, sono nuovo di Arduino e in questo sito ho imparato i rudimenti.
Anch’io ho un problema con un shield della Futura Elettronica, diversamente dai problemi su menzionati, il mio proprio non compila. La libreria è quella modificata che ho trovato nel sito della Futura e lo sketch è quello degli esempi inseriti e uguale a quello soprariportato. Ho provato sia con Ubuntu che con windows 7, niente, in fase di compilazione ci sono oltre 100 errori. Ho provato a cancellare le righe contenenti la RTC, la compilazione è andata a buon fine, ma solo aggiungendo #include “RTCLib.h” appaiono gli errori. Ringrazio anticipatamente per i consigli/suggerimenti che vorrete dispensarmi.
Autore
Ciao Antonio, sei sicuro di aver installato la libreria in modo corretto? Prova ad incollae le prime 3 righe di errore e provo ad interpretarle.
Ciao Mauro,
ringrazio della risposta ma ho già risolto, la libreria era stata installata correttamente ma non c’era verso di farla funzionare, quindi ho scaricato la libreria originale RTCLib-master.h ed ho notato che mancavano parecchie righe di codice, ho aggiunto il codice per far lampeggiare il LED, salvato aggiuntala manualmente nella cartella principale di Arduino per windows 8 e in automatico in sketchbook in Ubuntu e tutto è filato liscio.
Ringrazio ancora e mi permetto di chiedere un’altra delucidazione. Ho arduino da poco tempo e mi piace smanettarci, provando e riprovando con diversi codici con varie modifiche. Ovviamente per vedere i risultati devo ogni volta compilare e rigettare nella flash di Arduino, “consumando” la memoria, dato che resiste per 10000 scritture (che sono tante) ma pur sempre “limitate”, chiedo se c’è un emulatore e/o simulatore e/o virtualizzatore, in modo da provare e riprovare fintanto che il codice è perfetto e quindi copiarlo definitamente nella flash.
Sperando di essermi spiegato, ringrazio e saluto cordialmente
P.S. mentre stavo scrivendo/navigando in internet ho scoperto il prg Fritzing, ma non ho capito se fa al caso mio.
Autore
Ciao Antonio,
sono contento tu sia riuscito a risolvere il problema riscontrato con la RTCLib.
Simulatori esistono, io stesso ho scritto di uno o due simulatori, non ricordo con precisione; tuttavia sono adatti se devi accendere o spegnere dei led,motori e servo e poco altro quando arrivi ad usare le shield come la RTC non sono in grado di simulare anche le shield.
E’ vero che 10000 sono un limite ma io stesso non le ho mai raggiunte pur avendo scritto oltre 260 articoli e tanti progetti e di test ne faccio molti ed in ogni caso se hai passione vedrai che ti procurerai presto tanti altri modelli arduino perché al primo progetto finito vorrai installarlo e lasciarlo in funzione e per continuare a sperimentare ti occorrerà un nuovo arduino 🙂
Ciao Marco,
in effetti hai ragione, a questo RTC ho subito aggiunto una SD card e tribolando non poco, per trovare piedini digitali liberi, sono riuscito ad “introdurci” un display. Ora il tutto funziona interrottamente per acquisire, solo per curiosità, giornalmente le temperature; volevo aggiungere un sensore di umikdità, ma i piedini SCK MISO e MOSI sono già occupati. Cmq ti ringrazio enormemente per il tuo intervento. Grazie e saluti
Autore
Ciao Antonio,
i sensori di umidità che ho provato io sono di tipo DHT11 o SHT1x ed usano SDA/SCL od anche un solo pin digitale.
Ciao Mauro,
questo è quello che ho trovato in Cina e questa la piedinatura
Sensor MTH01 Sensor
1 CS – On/Off
2 SCK – CLK
3 SDAT – MOSI
4 Reset – Reset
5 VSS – GND
6 VDD – +5 V
e questi i collegamenti consigliati
Pin Arduino(Slave) Pin Sensor(Master)
7 1
11 3
13 2
Un chiarimento, i pin SDA e SCL sono quelli sopra il D13?
che attualmente sono impegnati dalla scheda RTC e l’11 e il 13 dalla SCCard.
Saluti e buona giornata.
Gentile Mauro
innanzi tutto grazie per i suoi preziosi tutorial e la sua assistenza
Ho acquistato un RTC del tutto simile a quello presentato da lei presentato in questo tutorial
Ho iniziato a smanettarci sopra e da allora sono iniziati degli “strani” comportamenti che non riesco ad interpretare e stanno mettendo a dura prova la mia salute mentale 🙂
Vorrei innanzitutto impostare l’ora attraverso la funzione riportata nella riga 16 dello sketch riportato sopra, ma dal momento che il mio rtc “is running” lo sketch ovviamente non lo aggiorna allora ho pensato:
Tolgo la funzione dal ciclo IF, carico lo sketch su arduino, commento la riga 16 e la ricarico senza mai aprire il monitor seriale per non fare resettare arduino e ripartire il setup…
Tutto sembra funzionare , l’ora è perfettamente sincronizzata se non che quando chiudo il programma e lo riapro l’RTC si risincronizza con l’orario del vecchio sketch
Ma se la funzione di sincronizzazione è commentata perchè lui si sincronizza lo stesso???
Altra opzione, scollego tutto e tolgo la batteria, così il ciclo IF legge che l’ora non è impostata e fa partire la sincronizzazione… Tutto funziona ma mi accorgo che perde 5 secondi al giorno, allora nel loop inserisco che alle ore 1:15:30 “RTC.adjust(DateTime(now.unixtime() – 5))” e poi aggingo un delay di 15 secondi
Tutto perfetto se non che dopo qualche giorno di funzionamento succede che
a) l’ora è perfettamente sincronizzata ma il giorno del mese è indietro (tipo di 1 o 2 giorni)
oppure
b) la data è precisa ma l’ora è sbagliata di qualche minuto
A questo punto mi chiedo:
a) sto facendo un sacco di confusione
b) l’RTC funziona male (l’ho pagato circa 4 euro)
c) = a x b
P.S. Sarebbe bello avere un tutorial che dimostra come impostare l’ora attraverso il monitor seriale 😉
Grazie in anticipo per la pazienza
Ciao
Autore
Ciao Carlo,
le anomalie che tu rilevi non mi sono mai capitate, è vero che, forse, non ho mai eseguito controlli così approfonditi con tutti i mie RTC, ne ho comperati tanti modelli ed usati su molti progetti.
Considerando il costo di questi RTC e la qualità costruttiva direi che qualche secondo di perdita è comprensibile ed accettabile, non sono degli orologi atomici.
La altre anomalie mi fanno pensare ad un malfunzionamento della shield in tuo possesso.
Per l’impostazione dell’ora via seriale non è complesso da realizzare e sono sicuro che sapresti realizzarlo anche tu leggendo i tutorial sul blog, non l’ho mai gatto perché ritengo che sia più interessante impostare data ed ora con dei pulsanti senza avere il Pc sempre collegato.
Grazie Mauro
Credo che i comportamenti “anomali” siano da attribuire all’utilizzo del monitor seriale, perchè nel weekend ho seguito il tutorial per impostare data e ora attraverso il display lcd e funziona tutto benissimo, ovviamente continua ad avanzare di 5 secondi al giorno, ma lo compenso con quella funzione che ho riportato sopra.
Giusto per la cronaca, anche il mio monta una batteria ricaricabile
Attraverso la tua libreria è possibile gestire i giorni della settimana?
Altrimenti metto un contatore che avanza alle 00:00:00 e si resetta quando supera 7
Ciao
Carlo
Autore
Ciao Carlo,
a memoria ricordo che la libreria gestisce anche i giorni della settimana ma che non abbia metodi per recuperarli dallo sketch.
Dovresti crearti un metodo per estrarre questa informazione dalla libreria ed usarla nello sketch.
ciao,volevo chiederti una spiegazione sul modulo RTC,io ne ho uno uguale al tuo,lo uso con arduino uno,ho notato che la batteria non si ricarica,anche dopo ore è sempre scarica e quando spengo tutto e riaccendo anche dopo pochi secondi l’ora torna sempre indietro al momento in cui ho caricato lo sketch…ho provato anche a mettere una batteria da 3 volt ma non cambia nulla,è solo questione di batteria o un malfunzionamento del modulo?(senza batteria se misuro sui teminali il voltaggio è superiore ai 4 volt)dovrebbe tenere la data anche dopo giorni senza essere alimentato vero?grazie e complimenti per il sito,ciao ciao
Autore
Ciao Alfredo,
il mio modulo non possiede una batteria ricaricabile, il tuo si?
ciao Mauro,
il mio si ha una batteria ricaricabile,è uguale a quello in foto qui sopra,ma rileggendo tra le righe c’è appunto scritto che la batteria serve per recuperare l’ora in caso di mancanza di alimentazione…non capisco perché il mio non la conservi,devo provare a ricaricare la batteria fuori dal modulo e poi rimetterla,ma anche se metto una batteria normale da 3 volt non cambia nulla,l’orario si perde sempre…
Autore
Ciao Alfredo,
se la pila è scarica può verificarsi la perdita di orario, prova a ricaricarla o con una pila nuova, anche non ricaricabile.
Se hai già verificato con pile cariche e perde cmq l’orario è possibile che tu debba eseguire qualche configurazione Hw tipo saldare qualche ponticello o altro, devi chiedere al rivenditore che potrà anche sostituirti il componente in assistenza.
ciao Mauro
provo a contattare il rivenditore,l’importante è avere la certezza che l’orario non va perso se tolgo alimentazione…grazie 1000 ciao ciao 🙂
Ciao, vorrei chiederti come posso impostare l’accensione e lo spegnimeto ad un determinato orario,
es. si accende alle 9 e 30 del mattino e si spegne alle 17 e 30 del pomeriggio, perchè trovo solo code con lcd pulsanti ecc, ma ho solo arduino uno e rct 1307.
Grazie in anticipo per la pazienza
Ciao
Autore
Ciao Andrea,
lo sketch è descritto linea per linea proprio per farti comprendere il suo funzionamento ed eliminare le parti di codice non necessarie al tuo progetto.
Ti bastano poche righe della loop per eseguire quello che desideri.
ciao mauro io e da pochissimo che mi sono avvicinato al mondo di arduino dato che le l’elettronica mi ha sempre affascinato ho comprato arduino e una scheda ds 1307 con una scheda rele’ perche volevo fare un progetto dove arduino eccita dei rele’ in ore stabilite del giorno e volevo chiederti se riesci a aiutarmi in questo progetto . grazie
Autore
Ciao Aristide,
ci sono tanti articoli che ho pubblicato su questo argomento.
Studiali e sono sicuro che sarà il miglior aiuto che posso darti
grazie mille
speriamo che me la cavo 😉
Ciao Mauro scusami se ti disturbo ancora ti volevo chiedere io ho montato il modulo RTC Tiny Ic2 e sembra che va bene in senso vedo il led di arduino dove ce scritto TX che lampeggia ma se apro il monitor seriale vedo che ogni lampeggio mi da delle scritte strane e normale non dovrebbbe comparire la data le ore minuti ecc ecc forse devo modificare lo sketch .
Autore
Ciao Aristide,
controlla che il baudrate impostato sul monitor seriale ( in basso a destra ) sia il medesimo impostato nello sketch.
Se non sai cosa sia il baud rate o dove si imposta nello sketch puoi leggere qualche articolo del corso base in cui lo descrivo.
ciao Mauro ti confermo che il baud non era corretto infatti appena l’ho corretto si legge l’ora e la data . Adesso ti chiedo ma per impostare l’ora precisa bisogna aver per forza un display o no e poi se voglio collegarci una scheda rele’ per farli eccitare in un orario che voglio devo cambiare sketch se riesci puoi essere piu dettagliato scusami se ti rompo . Grazie
Autore
Ciao Aristide,
puoi leggere i miei articoli sulle centraline per irrigazione, dovresti trovare tutto già fatto.
Con la descrizione riga per riga troverai facile anche apportare le modifiche che ti servono.
Se preferisci approfondire meglio le tue conoscenze su arduino prima di realizzare il tuo progetto ti consiglio la lettura del mio corso base on-line gratuito arduino o di partecipare ad uno dei miei corsi arduino in aula.
ok TI ringranzio per il consiglio
Ciao Mauro…. io ho un tiny rtc, e sono riuscito a settarlo e a visualizzare ora mnuti secondi e anche calendario su LCD , il problema è che ogni un Tot di ore lui va avanti di 3 o 4 secondi… secondo te c’è qualcosa che non va sull’ Rtc ? Libreria? Quarzo?
Se aumenta i secondi costantemente non va molto bene perchè fra un po di anni probabilmente sarà sballato di ore e non di secondi…
Autore
Ciao Francesco,
la precisione di questi moduli RTC è alquanto opinabile.
La scorsa settimana un appassionato mi ha regalato un nuovo tipo di RTC senza quarzo ma con taratura laser, non ho ancora avuto tempo di testarlo.
Nelle prossime settimane ci provo e rilascio i risultati sul blog.
Quindi mi devo rassegnare per la precisione… Inserirò un recupero dei secondi aumentati magari ogni giorno alla stessa ora per rimanere almeno nel minuto…Grazie Cmq
Autore
Ciao Francesco,
l’alternativa è utilizzare moduli con precisione maggiore, dipende da che tipo di progetto stai realizzando.
L’ultima spiaggia potrebbe essere connetterti ad un server ntp ( network time protocol ) pubblico.
Un esempio di modulo di precisione ?
In rete si trova qualcosa? …Invece via software con un atmega328 e una libreria si può fare qualcosa di preciso ??
Grazie….
Autore
Ciao Francesco,
non ho sottomano il modulo di precisione che mi hanno regalato ed in ogni caso non l’ho ancora provato per darti delle dritte.
Se vuoi usare l’ntp per la sincronizzazione via ethernet puoi consultare gli esempi sulla classe Ethernet presenti nell’IDE arduino.
ciao Mauro, ho un problema anche io con questa schedina rtc
in pratica lo sketch funziona …ma, dopo un po si sballa
è capitato ieri sera, l’orario avanzava regolarmente…una volta arrivato alle 20.59 è passato alle 21.09..poi alle 21.19…21.29 e cosi via.
da cosa è dovuto questo problema?
altra cosa, come in foto anche io ho l’alloggio per la LIR 2032 3.6 V che come saprai è una batteria ricaricabile.
se la sostituisco on una sempplice CR2032 3V non ricaricabile? avrei problemi di surriscaldamento della batteria e possibile scoppio?
Autore
Ciao Luca,
per il problema dell’orario avrai letto nei commenti che si verifica anche ad altri appassionati è che questi moduli non sono super affidabili.
C’è da dire che il tuo fa dei salti preoccupanti, di solito perdono qualche secondo al giorno, ma non fanno salti nel tempo.
Potrebbe essere danneggiato.
Per la pila io non conosco il circuito di questi componenti dovresti rivolgerti al produttore chiedendo se la funzione di carica puoi disabilitarla.
l’ora scorre, solo che fa dei salti …ma c’è qualcosa che non va con il codice mi sa.
xke in pratica invee che aggiornare i minuti per esempio 20.58 – 20.59 – 21.00 – 21.01…mette il 10 al posto di 01, il 20 al posto di 02. in pratica cambia il numero prima .
adesso per esempio è passato da 13.59 a 14.1, poi 14.2 e cosi via…come se salta la scrittura . dobrevve mettere lo zero davanti.
come posso fare a postarlo il codice?
se utilizzo questo codice funziona meglio:
https://www.mauroalfieri.it/elettronica/rtc-shield-ds1307-impostare-data-e-ora.html
il problema è che è stato sviluppato per poter modificare ora e data e molte righe sono da togliere. dici che è possibile toglierle? potresti aiutarmi a farlo? xke ne sto uscendo pazzo 🙂
Autore
Ciao Luca,
secondo me stai sbagliando l’interpretazione del codice perché questo esempio, classico per testare gli RTC, ha un delay di 3 secondi per cui è normale che tu veda :59 e poi :01 se stai visualizzando i secondi .. non capisco cosa tu stia leggendo.
Dove leggi nello sketch che dovrebbe metterci lo 0 davanti? Io non lo vedo in nessuna linea di questo sketch.
Il codice non puoi postarlo, è già scritto in questo articolo, se lo hai modificato introducendo degli errori puoi correggerli ripartendo da questo esempio.
Se l’altro esempio di codice funziona meglio usa quello eliminando solo la funzione setMode() e il suo richiamo nella loop().
In ogni caso non c’è alcuna differenza logica tra questo sketch e quello che ti permette di impostare l’ora, l’unica differenza è che quello scrive su un display e per farlo usa l’sprintf();
prima di tutto mi associo ai tanti complimenti che ricevi. veramente meritati.
Sto usando uno sketch che usa la libreria DS1307RTC.h e non la RTClib.h. purtroppo non riesco a leggere il giorno della settimana (Wday) poichè anche se il compilatore non da errore il valore è sempre = 6 (istruzione Serial.print(tm.Wday).
per gli altri parametri data/tempo tutto è ok
Qualche idea per aiutarmi?
Quale è la principale differenza tra le due librerie?
grazie e saluti
Feliciano
Autore
Ciao Feliciano,
hai provato a consultare la documentazione della libreria che stai utilizzando ?
Io ho provato solo le librerie che leggi nei miei articoli.
ciao mauro
complimeti ancora per tutto…sei per me fonte di ispirazione
vorrei solo sapere perché quando visualizzo la data e il tempo, invece di apparirmi la data e l’ora giusta, mi appare 2165/165/165 165:165:85
se puoi aiutarmi, mi fai un grande favore
grazie e ancora fantastico
Autore
Ciao Andrea,
hai connesso ad A4 ed A5 altri sensori o shield non I2C?
di solito questo tipo di errore è dovuto ad un uso errato dei pin A4 ed A5 di arduino.
Ciao Mauro, anch’io ho lo stesso errore ma ai pin A4 eA5 sono collegati i due pin del display, come si risolve?
Grazie.
Autore
Ciao Domenico,
quale problema ? Dovresti indicarmi a quale errore ti riferisci.
In generale se vuoi utilizzare i pin A4 ed A5 come I2C non devi utilizzarli per altri scopi.
Ciao Mauro,
ormai seguo i tuoi tutorial da moolto tempo e devo dire che sono più che ottimi, solo che di improvviso mi sono scontrato con questo tema e non so come risolvere…
tempo fa ho acquistato questa scheda
https://www.futurashop.it/Allegato_PDF_IT/8190-RTCSHIELDKIT.pdf
basata su DS1307, ed ha sempre funzionato alla perfezione, ho fatto temporizzatori, chiudere un relè ad una ora determinata ecc… insomma tutto perfetto…
ultimamente sono andato per modificare dei parametri su un programma che stava già funzionando ormai da anni e mi esce questo errore:
Arduino:1.6.4 (Windows 7), Scheda:”Arduino Uno”
Opzioni di compilazione cambiate, ricompilo tutto
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/WString.h:29:0,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Print.h:26,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26,
from C:\Program Files\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:26,
from C:\Users\Simone\Documents\Arduino\libraries\RTClib\RTClib.cpp:4:
C:\Users\Simone\Documents\Arduino\libraries\RTClib\RTClib.cpp:17:31: error: variable ‘daysInMonth’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
static uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };
^
Errore durante la compilazione
Io non so proprio più che fare, ho cercato altre librerie, scaricate di nuovo le tue, provato di nuovo programmi base ma mi da sempre e dico sempre questo errore nella compilazione.
Come potrei risolvere? c’è un modo?
Attendo una tua gentile risposta…
Grazie…
Autore
Ciao Simone,
è di certo un problema di librerie, ti segnala che il metodo daysInMonth non è disponibile nella libreria che possiedi.
Hai provato scaricare la libreria RTCmod di futura elettronica, eliminare tutte quelle presenti nel tuo IDE e ricaricare solo quest’ultima ?
L’alternativa è modificare lo sketch in modo che non chiami quel metodo oppure scriverti quel metodo nella tua libreria.
ciao
sto cercando di automatizzare l’acquario, e ho pensato di utilizzare un raspberry come controlker principale e alcuni arduini come schede di controllo di processo, il tutto comunicante con il bus I2C dove gli arduini dovrebbero essere gli slave.
l’idea era di dare a ogni Arduino un indirizzo diverso (p.e. 0x04 0x05 , ecc)
nel loop principale di ciascuno fare eseguire il processo (leggere le temperature da sensori dallas e attivare il riscaldamento, oppure leggere il ph dell’acqua e aprire in base a quello l’elettrovalvola del CO2)… durante il processo scrivo anche i valori che misuro in un registro.
regolarmente il raspberry master interroga ciascuna scheda leggendo i valori del registro della scheda memorizzandoli in un db.
ho quindi provato a scriverela parte su arduino che gestisce il bus wire…
se non attivo il bus I2C tutto funziona bene… (lasciato girare x giorni)
quando il raspberry inizia a interrogare le schede subito funziona tutto, poi mi accorgi che non tutti i valori dei registri arrivano corretti… poi inizio ad avere letture strane delle temperature o del ph…
a questo punto, resettando la scheda in questione tutto riparte regolarmente, gira x un po poi ricomincia a dare errori…
fermando la supervisione del raspberry le varie schede ricominciano a funzionare correttamente.
in particolare una cosa che mi ha stupito è che se cercavo di leggere i 12 byte del registro di uno di questi arduini subito me li dava correttamente… poi dopo un po di letture gli ultimi byte diventavano 255… il numero dey byte finali errati aumentava man mano…
ho quindi deciso di leggere un byte x volta… sembrava funzionare… ma dopo un po che girava sfalsava il numero del registro di 1… (gli chiedevo il primo e mi dava il secondi, gli chiedevo il secondo e mi dava il terzo.. e così via, resettando k’arduino si riallineava…
ho quindi pensato di raddoppiare il registro e scrivere il dato a coppie uguali 1=2 3=4 ,ec… e poi chiedere i fispari(se avveniva lo scalamento il valore ottenuto era lo stesso..
a questobpunto ha iniziato a darmi 0 nella lettura del registro 1.. solo in quello…
ho rischiato di buttare il computer fuori dalla finestra…
ho cercato su internet se trovavo una qualche implementazione di uno slave completo I2C per arduino dove scrivere i valori in un registro e poi interrogarli con I2C ma non ho trovato nulla.
Autore
Ciao Roberto,
purtroppo non ho mai eseguito esperimenti con la comunicazione I2C tra arduino e/o altre schede.
L’unica cosa che mi viene in mente è che per qualche motivo, dovresti verificare nello sketch, tu non richieda il registro corretto ma incrementi la lettura del registro involontariamente.
Potrei anche sbagliare.
allego di seguito il programma dettagliato:
1) innanzitutto il protocolla I2C permette di passare pacchetti di byte, avendo temperature del tipo 24,75° ho deciso di passare separatamente la parte intera e la parte decimale (2 cifre)
ho quindi deciso di creare un vettore dy byte da trasmettere che per il protocollo può essere al
massimo di 32 byte, ho deciso di dare alla scheda l’indirizzo 0x05:
[[ codice rimosso in automatico ]]
pointregister è un puntatore all’area di memoria (vettore VALORI) dove memorizzo nel programma i dati…
[[ codice rimosso in automatico ]]
nella funzione setup avvio l’I2C con indirizzo 5 e definisco 2 funzioni che vengono attivate quando sul bus avviene un evento
attivo anche il watch dog per evitare che il sistema si blocchi
[[ codice rimosso in automatico ]]
il ciclo principale ha ben poco a che fare con I2C, esegue solo le funzioni sul bus dallas per leggere le temperature, scrive le temperature sul display, attiva relais, ecc
inoltre ogni giro attende un secondo e resetta il watchdog
[[ codice rimosso in automatico ]]
infine riporto qui sopra le due funzioni per la gestione del bus
le altre schede hanno un funzionamento analogo e il software ha la stessa identica struttura.
Autore
Ciao Roberto,
come hai letto in fondo ad ogni mio articolo “non è possibile incollare sketch o parti di sketch nei commenti”
buongiorno, specifico già che di arduino so molto poco.
vorrei costruire un impianto per l’automatizzazione delle tapparelle di casa con una scheda Mega, dei relè e un temporizzatore RTC.
La mia domanda è, dopo aver collegato il temporizzatore alla scheda , come collego il temporizzatore ad un relè? e soprattutto che modifiche devo apportare allo sketch.
grazie
Autore
Ciao Luca,
benvenuto.
Se sei neofita ma con tanta voglia di imparare e realizzare il tuo progetto ti consiglio di leggere un po di articoli partendo dal corso base on-line gratuito per iniziare e man mano comprenderai facilmente come procedere.
Purtroppo per un progetto come il tuo occorrono molte informazioni e di certo non è una cosa che può accadere nei commenti.
ciao mauro davvero complimenti per i tuoi progetti!
ho un piccolo problemino , decommentando la linea 16 per aggiornare l’ora mi mette una data del 2013! , ovviamente la data nel pc è l’attuale, che problema potrei avere?
grazie mille in anticipo!
Autore
Ciao Mattia,
la riga 16 si occupa dell’impostazione della data ed ora solo se il controllo precedente restituisce il valore false.
Leggi bene come funziona lo sketch per comprendere come funziona.
Salve,
dopo lunghi anni di abbandono (interrotto da brevissime eccezioni) del mio vecchio hobby di cimentarmi con circuiti elettronici ho recentemente deciso di riprenderlo con le opportunità offerte oggi, quindi Arduino.
In quanto a conoscenza sono alla lettera “A”, pertanto so poco quanto nulla. Ho acquistato la schield DS1307, ho caricato la “adafruit RTClib (aggiornata alla v. 1.1). Purtroppo ricevo questo errore:
Arduino:1.6.7 (Mac OS X), Scheda:”Arduino/Genuino Uno”
sketch_feb20a:8: error: invalid digit “8” in octal constant
08
^
sketch_feb20a:9: error: invalid digit “9” in octal constant
09
^
sketch_feb20a:1: error: expected unqualified-id before numeric constant
01
^
exit status 1
invalid digit “8” in octal constant
Questo report potrebbe essere più ricco di informazioni con
“Mostra un output dettagliato durante la compilazione”
abilitato in “File > Impostazioni”
Spero possa darmi una mano a capirci qualcosa. Grazie anticipate.
Autore
Ciao Nicola,
prova con la libreria rilasciata dal produttore o con una di quelle che ho indicato in altri articoli dedicati a questo componente.
Ciao scusami io sto realizzando una serra dove ce una pompa da 220 collegata al relè e un rtc ma non so programmarla la pompa ha il seguente funzionamento che ad una determinata ora come ad esempio le 14:00 si attiva mandando acqua per 20 secondi e cosi nei giorni successivi puoi aiutarmi
Autore
Ciao Damiano,
puoi studiare il mio esempio di centralina di irrigazione e comprendere come funziona per modificarlo.
Salve,
premetto che sono alle prime armi con Arduino e ho a disposizione il Duemlanove (ATmega328) e un Mega2560, sono alle prese con varie sperimentazioni con display a 16 colonne 2 righe e utilizzando il Duemilanove ho provato vari sketch riguardanti l’assemblaggio tra un RTC ds 1307 ed il display senza problemi.
Alla prova di altri sketch l’IDE di Arduino mi da errore per la mancanza della libreria board.h, dopo varie ricerche non riesco a trovarla così come mi evidenzia l’errore l’IDE, ma riesco a trovare solo Border.h nella cartella Firmata (con la B maiuscola) cosa che mi ripete l’errore alla prova.
Gentilmente se può darmi delucidazioni riguardanti questo mio problema o alle mie mancanze di conoscenza a riguardo delle librerie, le ne sarei molto grato.
Distinti Saluti
Alessio A.
Autore
Ciao Alessio,
in questo sketch ti da questo errore?
Mi sembra strano perché non faccio uso di tale libreria, per cui potrebbe trattarsi solo di una cattiva installazione dell’IDE, scarica ed aggiorna la 1.8.0 e riprova.
Salve,
controllando la seriale in uscita ho sempre lo stesso valore:
01/01/2000 00:00:00
01/01/2000 00:00:00
01/01/2000 00:00:00
01/01/2000 00:00:00
01/01/2000 00:00:00
01/01/2000 00:00:00
Quale potrebbe essere il problema?La batteria non carica??
Autore
Ciao Daniele,
hai provato a commentare la riga 13 e la 17 solo una volta per impostare l’orario e poi commentarle nuovamente negli esempi successivi ?
Ciao Mauro, volevo chiederti se esiste un modo per testare la batteria del DS1307 in modo da segnalarlo in caso sia scarica o sotto una soglia.
Ho pensato di leggere il valore della batteria con un ingrasso analogico di arduino, ma questo consuma dell’energia della stessa; ho provato a guardare anche il data sheet del DS ma non ho trovato nessuna informazioen a riguardo.
Grazie dell’aiuto.
Maurizio
Autore
Ciao Maurizio,
penso che l’unica sia leggere il livello di carica con un pin analogico.
Sul consumo non penso sia un problema in quanto:
1. lo eseguirai al massimo una volta al giorno;
2. è una misurazione istantanea
Grazie Mauro,
mi confermi quindi che se non interrogata la porta analogica del micro è tre state e quindi non dovrebbe consumare nulla?!..
Autore
Ciao Maurizio,
c’è sempre un consumo minimo dovuto al micro controllore ed al circuito di alimentazione, puoi verificare con un tester.
Ciao Mauro…..innanzitutto BUON ANNO!!!!
Partendo dal presupposto che sto utilizzando lo stesso shield e sketch che utilizzi te per la gestione dell’orologio (epurato soltanto del delay(3000) avrei alcune domande da porti:
tenendo sotto controllo l’ora che viene stampata sul monitor seriale rispetto all’ora visualizzata dall’orologio di windows ho notato che dopo una giornata l’ora restituita dal monitor seriale si discosta di circa 30″ in + rispetto a quella dell’orologio di windows (ok l’orologio corre un po’ di + ma potrei considerarlo accettabile).
Ora se collego, tramite i 4 terminali aggiuntivi dello shield (+5,GND,SCL,SDA), un lcd 20×4 e modifico lo sketch in modo che mi stampi l’ora e la data sul lcd stesso, già solo dopo 30 minuti di funzionamento l’orologio dello shield mi restituisce un tempo di circa 30″ in + rispetto a quello di windows (corre da paura).
In questi giorni ho effettuato parecchie prove (provato ad utilizzare librerie differenti) ma non riesco a risolvere il problema
Hai avuto modo di verificare se questo comportamento anomalo si verifica anche con te oppure gentilmente riesci a darmi qualche dritta per venirne a capo e riuscire ad ottenere lo stesso risultato che si ha con la stampa su monitor seriale?
Grazie
Autore
Ciao Claudio,
francamente tra i test con monitor seriale e con display LCD non ho mai rilevato differenze di “accelerazione” del conteggio orario.
Che il modulo non sia il campione della precisione è vero, di solito il 30″ ogni giorno è più o meno il tempo di sfasatura che anche io rilevo.
Leggendo il tuo commento mi sembra di intuire che il modulo LCD sia di tipo I2C e che sia connesso al modulo RTC, giusto ?
Ti chiederei di eseguire qualche test, se hai voglia:
1. collega direttamente il display ad arduino e non attraverso l’RTC
2. prova a collegare due resistenze di pull-up da 4,7K tra il pin positivo e rispettivamente la prima ad SDA e la seconda ad SCL, trovi in rete molti schemi
Devo dire che non ho mai usato display LCD I2C con moduli RTC come questo.
Ciao Mauro, seguo spesso le tue guide. Ho un problema con il modulo DS1307 connesso all’ESP32 TTGO T8 V1.3. Ho usato sempre la libreria rtclib1.2.0 ed ha sempre funzionato fino a fine dicembre. Oggi ho acceso il pc e non mi compila più lo sketch, mi dice “Errore durante la compilazione per la scheda TTGO LoRa32-OLED V1”. Se nel codice, che fa anche altre cose, commento le linee riguardanti l’rtc tutto funziona perfettamente. L’esp32 lo programmo tramite arduino ide versione 1.8.7. Secondo te come potrei risolvere il problema? Grazie.
Autore
Ciao Giuseppe,
di solito il log di errore è più esplicito in merito alle anomalie, verifica che non ti indichi una differenza nell’uso della libreria.
Buon giorno Mauro.
vorrei dire qualcosa sulle mie esperienze con il DS1307 e la mia battaglia contro la sua imprecisione. Ho comperato, già diversi mesi fa, due moduli RTC DS1307 assemblati, come quello mostrato in questa discussione. Come molti altri utenti del DS1307, ho ben presto scoperto la sua incredibile imprecisione; entrambi i moduli vanno avanti di circa 9″ al giorno (sono più di 100ppm! questo è tipicamente l’errore denunciato nei forum che ho consultato, ma i 30″ denunciati da Claudio il 1 gennaio 2019 sono qualcosa di inaudito). Siccome è inconcepibile che un oscillatore al quarzo abbia un simile errore, mi sono messo a studiare la cosa. Ho letto con cura il datasheet e anche l’Application Note 58, citata nel datasheet, dove si trova questa significativa frase: “using a crystal with a CL of 12pF on an RTC designed with a 6pF CL causes the RTC to be about 3 to 4 minutes per month fast”.
Siccome l’errore che osserviamo è proprio di questa entità, ho sospettato che il cristallo montato sul modulino non avesse il valore di CL corretto. Ma nel datasheet è scritto chiaramente che il cristallo deve avere una CL di 12,5 pF, ed è facile verificare che cristalli di quella geometria con CL maggiore di 12,5 pF non ne esistono. Il sospetto diventa quindi che il datasheet contenga indicazioni errate (è un sospetto grave, lo ammetto, ma con i miei 32 anni di esperienza in elettronica, non mi stupisco più di niente). Comunque, per tagliare la testa al toro, ho provato a mettere 5,6 pF in parallelo al cristallo (un smd da 0805 ci sta a pennello), e l’errore è crollato a circa 30ppm! Molto meglio, ma ancora tanto. A questo punto bisognerebbe provare a cambiare il quarzo e metterne uno da 6 pF, ma ho desistito soprattutto perché, anche con il quarzo giusto, mi potrei trovare con un errore attorno ai 10ppm, mentre io voglio un errore inferiore a 1ppm.
Ho implementato quindi una correzione software, di cui sono piuttosto soddisfatto: dopo un mese non ha ancora sgarrato di un secondo! Se mi dici come si fa, ti allego i l mio sketch (scusami, ma non ho perso molto tempo a studiare la policy del tuo forum)
Autore
Grazie Flavio per la condivisione dei tuoi approfonditi studi di elettronica su questo componete che, effettivamente, si rileva alquanto impreciso.
Inviami pure un articolo ( testo, foto, schemi, descrizioni, sketch ) all’indirizzo info del blog, il medesimo da cui ti giunge questa risposta.
Scrivi nell’articolo tutto ciò che hai studiato e, dopo una valutazione insieme, ne pubblicherò un articolo in cui comparirà il tuo nome.