Questo tutorial mostra come collegare ed utilizzare un modulo RTC con Arduino,
grazie a questo modulo visualizzeremo la data e l'ora su un display.
Questi moduli si trovano su eBay ad un costo irrisorio ed hanno sul retro anche un alloggio per una batteria tampone ricaricabile LIR2032.
Per questo motivo il modulo può funzionare in completa autonomia, e ci consente in qualunque momento di reperire la data e l'ora per utilizzarla nei nostri progetti.
Il circuito è anche dotato di una memoria eeprom che in caso di mancanza di alimentazione, e con batteria scarica, tiene in memoria l'orario e la data in cui il conteggio si è fermato.
Per fare delle prove ho realizzato un semplice progetto, collegando all'Arduino il modulo RTC ed un display LCD. Il funzionamento lo potete vedere nel video seguente:
Alla prima accensione avrete un'ora e una data non corrette, per impostare la data corretta ho messo un pulsante.
Infatti non tutti sanno che quando carichiamo lo sketch in Arduino trasmettiamo anche l'informazione della data e dell'ora del caricamento,
premendo il pulsante andiamo a copiare queste informazioni nel modulo RTC, che d'ora in poi avrà data e ora corrette.
Naturalmente il pulsante va premuto appena caricate lo sketch e poi non va più usato.
Per replicare il progetto dovete realizzare questo semplice circuito:
Come potete vedere il modulo è collegato ad Arduino tramite solo 4 fili, infatti 2 sono per l'alimentazione, e due per la comunicazione effettuata sfruttando il protocollo i2c.
Ed infine caricate questo sketch, che per funzionare ha bisogno della libreria "RTClib", da estrarre e mettere nella cartella "libraries" nella directory di Arduino.
- #include <Wire.h>
- #include <RTClib.h>
- #include <LiquidCrystal.h>
- char buffer1[20];
- char buffer2[20];
- RTC_DS1307 RTC;
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
- const int setpin = 6;
- boolean statepin = 0;
- void setup () {
- pinMode (6, INPUT);
- digitalWrite (6, HIGH);
- Wire.begin();
- RTC.begin();
- lcd.begin(16, 2);
- if (! RTC.isrunning()) {
- RTC.adjust(DateTime(__DATE__, __TIME__));
- }
- }
- void loop () {
- statepin = digitalRead (setpin);
- if (statepin == LOW)
- {
- RTC.adjust(DateTime(__DATE__, __TIME__));
- }
- DateTime now = RTC.now();
- sprintf(buffer1, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
- lcd.setCursor(0,0);
- lcd.print( buffer1 );
- sprintf(buffer2, "%02d/%02d/%d", now.day(), now.month(), now.year());
- lcd.setCursor(0,1);
- lcd.print( buffer2 );
- delay(1000);
- }
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!
ciao daniele sono luigi-mi piace il progetto orologio lo vorrei realizzare ma ho un problemino con la libreria RTC mi errore in fase di compilazione come se non la riconoscesse eppure lo scompattata e inserita nelle libreria mi puoi
RispondiEliminaa capire dove sbaglio? grazie
La cartella dove è contenuta la libreria non può contenere il simbolo "-" rinominala e riprova. Fammi sapere :)
Eliminaho scaricato la libreria dal sito di mauro alfieri e funziona perfettamente, grazie per il consiglio adesso mi accingo a costruire l'orologio ciao e grazie ancora
RispondiEliminaAhahah OK grande la scaricherò anch'io ;)
Eliminaciao daniele sono luigi oggi ho ricevuto il modulo rtc ho eseguito i vari collegamenti e via e partito come un siluro solo che l'ora va bene, mentre i minuti rispetto a l'ora corrente e indietro di 10 di minuti ,e possibile regolare i minuti
RispondiEliminaAppena carichi lo sketch premi il pulsante e avrai l'ora giusta.
EliminaVa ottimamente, grande Daniele, adesso saldo tutto e me lo metto sul comodino eheheheh!!!!!!!!
RispondiEliminagrazie!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ahah OK grande, grazie anche x i complimenti sugli altri post :)
RispondiEliminaciao Daniele, come faccio ad attivare un PIN ad un orario preciso ogni giorno? Dovrei impostare un if(...) per leggere l'orario. Se mi dai una mano ti ringrazio.
RispondiEliminaAd esempio se vuoi attivarlo alle 10 del mattino metti:
Eliminaif(now.hour()>10)
digitalWrite (13, HIGH)
Prova così, dovrebbe andare, ma purtroppo con me non ho il materiale per testarlo. Fammi sapere, ciao!
ciao,ho un problema,quando scollego arduino e dopo qualche ora lo ricollego mi trovo l'ora che non è andata avanti,in pratica si ferma dal momento in cui interrompo l'alimentazione,il modulo RTC è lo stesso che hai usato tu e nel dubbio ho provato anche a sostituire la batteria tampone ricaricabile con una normale da 3volt ma non cambia nulla...è normale che faccia cosi?io pensavo che il conteggio dovesse andare avanti nel modulo RTC con la sua batteria tampone per poi visualizzare l'ora giusta alla successiva accensione...oppure sto sbagliando io qualcosa?grazie.
RispondiEliminaCiao!
Eliminanon saprei proprio a me funziona correttamente, sei sicuro che il modulo funzioni?
hai inserito la batteria nel rtc?
EliminaCiao daniele, complimenti per tutto.
RispondiEliminaIo vorrei unire i tuoi 2 progetti in uno solo, cioè l'orologio con sensore di temperatura lm35.
Come deve essere lo skecht?
Grazie mille
Ciao ma se usassi i pin A3 e A2 per RTC invece dei pin A5 e A4 dovrei cambiare qualcosa nello sketch?
RispondiEliminaNon si può, la comunicazione i2c funziona solo sui pin a4 e a5
Eliminama lo schema e lo sketch vanno bne anche con rtc 1302?
RispondiEliminagrazie
Ciao scusa una domanda. ma per fare un if o else quale codice si deve usare? if(hour >= 10) tipo così?
RispondiEliminagrazie mille per l'aiuto stavo facendo un timer..
Questo commento è stato eliminato dall'autore.
RispondiEliminaCiao Daniele scusa, mi stampa dul display prima riga 165:165:85 seconda riga 165/165//2165 anche se premo il tastierino non sincornizza ora e data col pc. mi manca qualche libreria o devo correggere qualcosa della sintassi?
RispondiEliminase puoi rispondimi
Grazie
Ciao Daniele, desidero aggiungere dei rgb per i giorni del mese, della settima è del mese. Quindi è possibile al girare delle 24 ore spegnere lo rgb del giorno e accendere quello successivo. Così sia per la settimana che per il mese
RispondiEliminaho caricato parte del programma in uno mio sketch, e mi dice che now non è dichiarato, ma non deve essere dichiarata... come mai?
RispondiEliminadisplay.setCursor(0, 10);
//display.print(__DATE__);
sprintf(buffer2, "%02d/%02d/%d",now.day(),now.month(),now.year());
display.print( buffer2 );
display.print(" DAY:");
display.print(DAY);