Modulo RTC DS1307 e Arduino, visualizzare data e ora su un display


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.
Il modulo da me utilizzato è del tutto simile a questo:


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.

  1. #include <Wire.h>
  2. #include <RTClib.h>
  3. #include <LiquidCrystal.h>
  4. char buffer1[20];
  5. char buffer2[20];
  6. RTC_DS1307 RTC;
  7. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  8. const int setpin = 6;
  9. boolean statepin = 0;
  10. void setup () {
  11.   pinMode (6, INPUT);
  12.   digitalWrite (6, HIGH);
  13.   Wire.begin();
  14.   RTC.begin();
  15.   lcd.begin(16, 2);
  16.   if (! RTC.isrunning()) {
  17.     RTC.adjust(DateTime(__DATE__, __TIME__));
  18.   }
  19. }
  20. void loop () {
  21.   statepin = digitalRead (setpin);
  22.   if (statepin == LOW)
  23.   {
  24.     RTC.adjust(DateTime(__DATE__, __TIME__));
  25.   }
  26.   DateTime now = RTC.now();
  27.   sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  28.   lcd.setCursor(0,0);
  29.   lcd.print( buffer1 );
  30.   sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  31.   lcd.setCursor(0,1);
  32.   lcd.print( buffer2 );
  33.   delay(1000);
  34. }

Come al solito se avete problemi non esitate a scrivere un commento qua sotto, Ciao!!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

22 commenti:

  1. 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
    a capire dove sbaglio? grazie

    RispondiElimina
    Risposte
    1. La cartella dove è contenuta la libreria non può contenere il simbolo "-" rinominala e riprova. Fammi sapere :)

      Elimina
  2. ho 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

    RispondiElimina
  3. ciao 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

    RispondiElimina
    Risposte
    1. Appena carichi lo sketch premi il pulsante e avrai l'ora giusta.

      Elimina
  4. Va ottimamente, grande Daniele, adesso saldo tutto e me lo metto sul comodino eheheheh!!!!!!!!
    grazie!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    RispondiElimina
  5. Ahah OK grande, grazie anche x i complimenti sugli altri post :)

    RispondiElimina
  6. ciao 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.

    RispondiElimina
    Risposte
    1. Ad esempio se vuoi attivarlo alle 10 del mattino metti:
      if(now.hour()>10)
      digitalWrite (13, HIGH)
      Prova così, dovrebbe andare, ma purtroppo con me non ho il materiale per testarlo. Fammi sapere, ciao!

      Elimina
  7. 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.

    RispondiElimina
    Risposte
    1. Ciao!
      non saprei proprio a me funziona correttamente, sei sicuro che il modulo funzioni?

      Elimina
    2. hai inserito la batteria nel rtc?

      Elimina
  8. Ciao daniele, complimenti per tutto.
    Io vorrei unire i tuoi 2 progetti in uno solo, cioè l'orologio con sensore di temperatura lm35.
    Come deve essere lo skecht?
    Grazie mille

    RispondiElimina
  9. Ciao ma se usassi i pin A3 e A2 per RTC invece dei pin A5 e A4 dovrei cambiare qualcosa nello sketch?

    RispondiElimina
    Risposte
    1. Non si può, la comunicazione i2c funziona solo sui pin a4 e a5

      Elimina
  10. ma lo schema e lo sketch vanno bne anche con rtc 1302?

    grazie

    RispondiElimina
  11. Ciao scusa una domanda. ma per fare un if o else quale codice si deve usare? if(hour >= 10) tipo così?

    grazie mille per l'aiuto stavo facendo un timer..

    RispondiElimina
  12. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  13. Ciao 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?
    se puoi rispondimi
    Grazie

    RispondiElimina
  14. 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

    RispondiElimina
  15. ho caricato parte del programma in uno mio sketch, e mi dice che now non è dichiarato, ma non deve essere dichiarata... come mai?

    display.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);

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post