🕒 Arduino • RTC DS1307 • LCD 16×2

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.

DifficoltàIntermedia
Modulo RTCDS1307
DisplayLCD 16×2
In poche parole: Arduino legge ora e data dal modulo RTC attraverso il bus I2C e le mostra sul display. Il pulsante permette di trasferire al DS1307 la data e l’ora di compilazione dello sketch quando serve impostarlo.

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.h e RTClib.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 per Arduino

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.

Funzionemillis()RTC DS1307
Tempo trascorso dall’avvioNon è il suo scopo principale
Ora realeNo
DataNo
Mantiene il tempo senza Arduino accesoNoSì, con batteria tampone

Materiale necessario

🔌 Arduino Uno
🕒 RTC DS1307
🖥 Display LCD 16×2
🔘 Pulsante
〰️ Resistenza da 220 Ω
🧩 Breadboard
🔗 Cavetti jumper

🧰 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 consigliato

Link 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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema di collegamento

Schema Arduino RTC DS1307 con display LCD 16x2

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.

ElementoCollegamento nel progetto
LCD RSPin 12
LCD EPin 11
LCD D4Pin 5
LCD D5Pin 4
LCD D6Pin 3
LCD D7Pin 2
Pulsante SETPin 6
RTC DS1307Bus I2C
Perché I2C è utile: il modulo RTC può trasferire più informazioni usando soltanto le linee dedicate del bus, senza occupare molti pin digitali come accade con il display parallelo.

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.

Attenzione: se premi il pulsante molto tempo dopo aver compilato lo sketch, l’RTC verrà impostato usando l’ora di compilazione, non l’ora esatta del momento in cui premi il pulsante.

Le librerie utilizzate

  • Wire.h — comunicazione I2C;
  • RTClib.h — gestione del DS1307;
  • LiquidCrystal.h — gestione del display LCD.

Codice Arduino commentato

RTC DS1307 + LCD 16×2
// ==========================================================
// 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

1

Avviamo I2C, RTC e LCD

Nel setup() inizializziamo tutti i dispositivi necessari alla comunicazione e alla visualizzazione.

2

Controlliamo che l’RTC sia attivo

rtc.isrunning() permette di verificare se il DS1307 sta mantenendo correttamente il conteggio del tempo.

3

Leggiamo l’ora

rtc.now() restituisce un oggetto DateTime contenente tutti i campi temporali.

4

Formattiamo ora e data

sprintf() crea stringhe ordinate nel formato HH:MM:SS e GG/MM/AAAA.

5

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_PULLUP la 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.