RTC DS1307 con Arduino: ora e data su display LCD
Impariamo a usare un modulo RTC DS1307 per mantenere ora e data anche quando Arduino viene spento e visualizziamo le informazioni su un display LCD 16×2.
Cosa imparerai
- che cos’è un RTC e perché è diverso da
millis(); - come funziona il modulo DS1307;
- come comunicare con il modulo tramite I2C;
- come usare
Wire.heRTClib.h; - come leggere ore, minuti, secondi, giorno, mese e anno;
- come mostrare ora e data su LCD 16×2;
- come impostare l’orologio con un pulsante.
Che cos’è un modulo RTC
RTC significa Real Time Clock, cioè orologio in tempo reale. Il suo compito è mantenere un riferimento di data e ora indipendente dall’esecuzione del programma principale di Arduino.
Nel progetto viene utilizzato il DS1307. Il modulo dispone di un alloggiamento per una batteria tampone, che consente all’orologio di continuare a mantenere il tempo quando Arduino non è alimentato.
Modulo RTC DS1307 utilizzato nel progetto originale.
RTC e millis(): qual è la differenza?
millis() misura il tempo trascorso dall’avvio di Arduino,
ma riparte da zero dopo un reset o uno spegnimento. Un RTC, invece,
mantiene un vero calendario con ora e data.
| Funzione | millis() | RTC DS1307 |
|---|---|---|
| Tempo trascorso dall’avvio | Sì | Non è il suo scopo principale |
| Ora reale | No | Sì |
| Data | No | Sì |
| Mantiene il tempo senza Arduino acceso | No | Sì, con batteria tampone |
Materiale necessario
🧰 Kit Arduino consigliato
Molti progetti del sito utilizzano breadboard, pulsanti, display, resistenze e moduli. Un kit completo è comodo per avere già a disposizione gran parte dei componenti di base.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
Schema originale del progetto RTC DS1307 con display LCD.
Collegamenti principali
Il display utilizza il classico collegamento parallelo già visto nei progetti precedenti, mentre il DS1307 comunica con Arduino tramite il bus I2C.
| Elemento | Collegamento nel progetto |
|---|---|
| LCD RS | Pin 12 |
| LCD E | Pin 11 |
| LCD D4 | Pin 5 |
| LCD D5 | Pin 4 |
| LCD D6 | Pin 3 |
| LCD D7 | Pin 2 |
| Pulsante SET | Pin 6 |
| RTC DS1307 | Bus I2C |
Come funziona il pulsante di impostazione
Nella versione originale il pulsante è collegato al pin 6 ed è configurato
con pull-up interno. Di conseguenza, quando viene premuto, il pin viene letto
come LOW.
In quel momento Arduino esegue:
RTC.adjust(DateTime(__DATE__, __TIME__)).
Le costanti __DATE__ e __TIME__ contengono
data e ora della compilazione dello sketch.
Le librerie utilizzate
Wire.h— comunicazione I2C;RTClib.h— gestione del DS1307;LiquidCrystal.h— gestione del display LCD.
Codice Arduino commentato
// ==========================================================
// RTC DS1307 + DISPLAY LCD 16x2 CON ARDUINO
// Visualizza ora e data su due righe
// ==========================================================
// Libreria per il bus I2C
#include <Wire.h>
// Libreria per il modulo RTC
#include <RTClib.h>
// Libreria per il display LCD
#include <LiquidCrystal.h>
// Buffer di testo per formattare ora e data
char bufferOra[20];
char bufferData[20];
// Crea l'oggetto RTC per il DS1307
RTC_DS1307 rtc;
// Collegamenti LCD:
// RS=12, E=11, D4=5, D5=4, D6=3, D7=2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Pulsante per impostare data e ora
const int setPin = 6;
void setup() {
// Usa il pull-up interno:
// pulsante rilasciato = HIGH
// pulsante premuto = LOW
pinMode(setPin, INPUT_PULLUP);
// Avvia il bus I2C
Wire.begin();
// Avvia il modulo RTC
rtc.begin();
// Avvia il display LCD 16x2
lcd.begin(16, 2);
// Se l'RTC non sta funzionando,
// imposta data e ora usando quelle di compilazione
if (!rtc.isrunning()) {
rtc.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
// Se il pulsante viene premuto...
if (digitalRead(setPin) == LOW) {
// Imposta l'RTC con data e ora di compilazione
rtc.adjust(DateTime(__DATE__, __TIME__));
}
// Legge data e ora correnti dal modulo
DateTime now = rtc.now();
// Formatta l'ora come HH:MM:SS
sprintf(
bufferOra,
"%02d:%02d:%02d",
now.hour(),
now.minute(),
now.second()
);
// Scrive l'ora sulla prima riga
lcd.setCursor(0, 0);
lcd.print(bufferOra);
// Formatta la data come GG/MM/AAAA
sprintf(
bufferData,
"%02d/%02d/%d",
now.day(),
now.month(),
now.year()
);
// Scrive la data sulla seconda riga
lcd.setCursor(0, 1);
lcd.print(bufferData);
// Aggiorna il display una volta al secondo
delay(1000);
}
Il codice spiegato passo passo
Avviamo I2C, RTC e LCD
Nel setup() inizializziamo tutti i dispositivi
necessari alla comunicazione e alla visualizzazione.
Controlliamo che l’RTC sia attivo
rtc.isrunning() permette di verificare se il DS1307
sta mantenendo correttamente il conteggio del tempo.
Leggiamo l’ora
rtc.now() restituisce un oggetto DateTime
contenente tutti i campi temporali.
Formattiamo ora e data
sprintf() crea stringhe ordinate nel formato
HH:MM:SS e GG/MM/AAAA.
Mostriamo tutto sul display
La prima riga mostra l’ora e la seconda riga la data.
Perché usare %02d in sprintf()
Il formato %02d forza la visualizzazione di almeno due cifre.
In questo modo le ore e i minuti vengono mostrati come 08:05
invece di 8:5.
Come impostare l’RTC in modo più pratico
Il metodo con __DATE__ e __TIME__ è semplice
e utile per imparare, ma in un progetto più evoluto si possono usare
pulsanti dedicati o un menu sul display per modificare manualmente
ore, minuti, giorno, mese e anno.
Un’altra possibilità è impostare una sola volta il DS1307 con uno sketch dedicato e poi caricare il programma definitivo senza più modificare l’orario.
Scarica libreria e sketch originali
⬇️ Scarica RTClib originale⬇️ Scarica arduino_rtc.ino
Debug rapido
- controlla che il DS1307 sia alimentato correttamente;
- verifica il collegamento I2C;
- controlla lo stato della batteria tampone;
- se il display è vuoto, verifica contrasto e collegamenti LCD;
- se ora e data sono errate, reimposta l’RTC;
- se il pulsante non funziona, ricorda che con
INPUT_PULLUPla pressione corrisponde a LOW; - verifica che RTClib sia installata nell’IDE Arduino.
Varianti del progetto
- creare un orologio digitale completo;
- aggiungere una sveglia con buzzer;
- mostrare giorno della settimana;
- aggiungere temperatura e umidità con DHT11;
- salvare dati su scheda SD con timestamp;
- usare un display OLED o LCD I2C;
- creare un datalogger con data e ora per ogni misura.
Cosa devi ricordare
- Un RTC mantiene ora e data indipendentemente dal programma principale.
- Il DS1307 comunica tramite I2C.
rtc.now()legge data e ora correnti.rtc.adjust()modifica l’orologio.sprintf()permette di formattare bene i valori.- La batteria tampone è fondamentale per mantenere il tempo a scheda spenta.
Domande frequenti
Perché l’orario si azzera quando spengo Arduino?
Controlla la batteria tampone e il suo corretto inserimento nel modulo RTC.
Devo premere il pulsante a ogni avvio?
No. Serve solo quando vuoi reimpostare data e ora. Una volta regolato, l’RTC continua a mantenere il tempo grazie alla batteria.
Posso usare un display I2C?
Sì. In questo modo anche il display può utilizzare il bus I2C e il cablaggio diventa molto più semplice.
Posso usare il progetto per un datalogger?
Sì. L’RTC è ideale per aggiungere data e ora a misure registrate da sensori o salvate su una scheda SD.

