DS3231 con Arduino - collegamenti, codice e errori da evitare

Arduino Uno con modulo ds3231, display LCD, LED e buzzer su breadboard.

Scritto da

Eustachio Fiore

Pubblicato il

19 mag 2026

Indice

Un progetto Arduino diventa molto più affidabile quando l’ora resta corretta anche dopo lo spegnimento, un reset o un blackout. Il modulo DS3231 è una delle soluzioni più pulite per ottenere questo risultato: preciso, semplice da collegare e adatto sia a un orologio da banco sia a un datalogger o a un sistema di automazione. Qui trovi collegamenti, codice essenziale, vantaggi reali, limiti pratici e gli errori che vale la pena evitare fin dal primo test.

I punti che contano davvero prima di montare il modulo

  • Il DS3231 mantiene data e ora con una precisione molto alta grazie all’oscillatore compensato in temperatura.
  • Con Arduino serve soprattutto il bus I2C: SDA, SCL, alimentazione e massa.
  • La batteria di backup non serve solo a “salvare l’ora”, ma a lasciare il progetto pronto anche quando manca corrente.
  • Le due sveglie e l’uscita INT/SQW diventano utili quando vuoi svegliare il microcontrollore solo in certi momenti.
  • Il vero margine di errore, quasi sempre, sta nel cablaggio o nella gestione iniziale dell’ora, non nel chip.

Che cosa fa davvero il DS3231 con Arduino

Il DS3231 non è un semplice “orologio digitale” aggiunto alla scheda: è un RTC, cioè un real-time clock, progettato per tenere il tempo in modo autonomo. Il datasheet di Analog Devices indica una precisione di ±2 ppm tra 0 °C e 40 °C e di ±3,5 ppm tra -40 °C e +85 °C, valori che nella pratica lo rendono molto più stabile di tanti moduli economici basati su un quarzo esterno non compensato.

Per un progetto Arduino questo significa una cosa molto concreta: l’ora non dipende dal loop, dal `delay()` o dalla stabilità dell’alimentazione della scheda. Il DS3231 mantiene secondi, minuti, ore, giorno, data, mese e anno; gestisce anche gli anni bisestili fino al 2100 e offre due allarmi programmabili, oltre a un’uscita square-wave e a un sensore di temperatura interno con accuratezza dichiarata di circa ±3 °C.

Funzione Perché conta su Arduino Effetto pratico
Oscillatore compensato in temperatura Riduce la deriva dovuta ai cambi termici L’orario resta molto più stabile nel tempo
Batteria di backup Continua a contare il tempo anche senza alimentazione principale Il progetto riparte già allineato
Due allarmi Permettono eventi schedulati senza controlli continui nel loop Più efficienza e meno codice di polling
Uscita square-wave Utile per interrupt o impulsi periodici Comportamenti più precisi rispetto a temporizzazioni software
Sensore di temperatura Serve per la compensazione interna e per diagnosi Non sostituisce un sensore ambientale, ma aggiunge valore

In breve, il DS3231 ha senso quando vuoi che l’ora sia un dato affidabile e non un dettaglio “più o meno corretto”. Da qui il passo successivo è collegarlo bene, perché con l’I2C basta poco per fare tutto giusto o tutto storto.

Schema di collegamento Arduino Uno con display LED, modulo RTC DS3231 e LCD per un sistema di dosaggio.

Come collegarlo senza complicarsi la vita

Su Arduino il DS3231 parla quasi sempre tramite I2C, quindi i collegamenti fondamentali sono pochi. La documentazione Arduino ricorda che la libreria Wire è la base per l’I2C ed è già inclusa nei pacchetti delle board, quindi non devi inventarti nulla di strano per iniziare.

Pin del modulo Arduino Uno / Nano Note pratiche
VCC 5V oppure 3,3V Dipende dal modulo, non solo dal chip
GND GND La massa comune è obbligatoria
SDA A4 Linea dati I2C
SCL A5 Linea clock I2C
INT/SQW Un pin digitale con interrupt, per esempio D2 Serve solo se usi sveglie o impulsi periodici
32K Di solito non collegato Raramente serve in un progetto base

Su Mega i pin I2C cambiano, e in generale vale la regola semplice: non fidarti dei numeri stampati sul modulo, fidati della sigla dei pin e dello schema della tua board. Io controllo sempre anche l’indirizzo I2C del chip, perché il DS3231 risponde a 0x68: se lo scanner non lo vede, il problema è quasi sempre un cavo invertito, un’alimentazione sbagliata o una massa mancante.

Un dettaglio che merita attenzione è il tipo di breakout. Molti moduli pronti per Arduino accettano 5V, ma il chip in sé è pensato per lavorare anche a 3,3V e non tutti i cloni gestiscono l’alimentazione nello stesso modo. Se il modulo include anche una piccola EEPROM o un circuito di carica della batteria, io leggo sempre la serigrafia prima di alimentarlo “alla cieca”. Ora che il cablaggio è chiaro, vale la pena passare al codice minimo che davvero funziona.

Il codice minimo che uso per leggere e impostare l’ora

Per la maggior parte dei progetti io preferisco una libreria alta come RTClib, perché mantiene il codice leggibile e riduce gli errori sui registri interni. La sequenza corretta è sempre la stessa: inizializzare Wire, avviare il modulo, controllare se ha perso alimentazione e, solo se serve, impostare l’ora iniziale. L’ora di compilazione è comoda per il primo settaggio, ma non va lasciata attiva per sempre, altrimenti ogni upload rischia di riscrivere il clock.

#include 
#include 

RTC_DS3231 rtc;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (!rtc.begin()) {
    Serial.println("DS3231 non trovato");
    while (true) {
    }
  }

  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
}

void loop() {
  DateTime now = rtc.now();

  Serial.print(now.day());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.print(now.year());
  Serial.print(' ');
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.println(now.second());

  delay(1000);
}

Questa versione fa due cose bene: imposta il DS3231 solo quando serve e poi legge l’ora in modo continuo. Se vuoi una precisione ancora più rigorosa, soprattutto in un progetto con rete o sincronizzazione esterna, puoi sostituire l’impostazione iniziale con un’ora arrivata via seriale, NTP o interfaccia utente. Per un orologio da laboratorio, però, questo scheletro è già più che sufficiente.

Una piccola nota da esperienza pratica: se dopo ogni upload l’ora torna alla compilazione, stai quasi sempre lasciando attiva l’istruzione di settaggio. È un errore banale, ma è anche uno di quelli che fanno perdere più tempo. Da qui è naturale chiedersi quando il DS3231 convenga davvero rispetto all’alternativa più nota, il DS1307.

Quando conviene davvero rispetto al DS1307

Il DS1307 compare spesso nei progetti economici, ma non offre lo stesso livello di affidabilità. Io lo considero accettabile solo quando il tempo è un’informazione accessoria, mentre il DS3231 diventa la scelta naturale quando vuoi cronologia corretta, allarmi affidabili e meno drift nel lungo periodo.

Aspetto DS3231 DS1307
Precisione Molto alta grazie al TCXO integrato Dipende molto dal quarzo esterno e dalla taratura
Gestione temperatura Compensazione interna Molto più limitata
Allarmi Due allarmi programmabili Funzionalità più essenziali
Backup batteria Sì, con passaggio automatico Sì, ma con prestazioni meno stabili sul tempo lungo
Uso tipico Datalogger, orologi affidabili, automazioni, sveglie precise Prototipi semplici o progetti in cui la precisione non è critica

Se devo essere diretto, io scelgo quasi sempre il DS3231 quando il progetto esce dal perimetro del “funziona al banco”. Il DS1307 resta utile per esperimenti rapidi o per chi vuole spendere il meno possibile, ma il salto di qualità del DS3231 si sente subito quando il sistema deve stare acceso per settimane o mesi. A questo punto conviene vedere gli errori che fanno deragliare i primi test, perché spesso non dipendono dal chip ma dal contorno.

Gli errori che vedo più spesso nei primi test

  • Lasciare `rtc.adjust(...)` dentro al loop o nel setup per sempre: ogni reset riscrive l’orario e ti dà l’illusione che il modulo non funzioni.
  • Scambiare SDA e SCL: l’I2C non perdona, e con due fili invertiti il dispositivo sembra morto anche se non lo è.
  • Alimentare il modulo senza controllare il tipo di breakout: il chip DS3231 tollera diversi scenari, ma alcuni moduli economici no.
  • Dimenticare la massa comune: senza GND condiviso il bus diventa instabile o del tutto silenzioso.
  • Montare una batteria non adatta al circuito del modulo: se il modulo ha una carica integrata, una semplice CR2032 non sempre è la scelta corretta.
  • Credere che il sensore di temperatura sostituisca un termometro vero: è utile per il RTC, ma non è uno strumento di misura ambientale di precisione.
  • Ignorare l’indirizzo I2C: se lo scanner non mostra 0x68, prima controllo il bus e solo dopo il codice.

Il punto più importante, secondo me, è questo: quando qualcosa non va, non partire subito dalla libreria. Prima verifico alimentazione, cablaggio e presenza del dispositivo sul bus; solo dopo guardo il programma. Nella maggior parte dei casi il bug è elettrico, non logico. Una volta superato questo filtro, il DS3231 inizia a dare il meglio nei progetti reali.

Dove il DS3231 dà il meglio nei progetti reali

Il valore del modulo emerge soprattutto quando il tempo non è un dettaglio decorativo. Un RTC preciso cambia davvero il comportamento del progetto: non solo mostra l’ora, ma aiuta il microcontrollore a prendere decisioni affidabili.

  • Datalogger su SD: ogni misura viene salvata con un timestamp credibile, e i dati restano confrontabili anche dopo uno spegnimento.
  • Automazioni a orario: irrigazione, illuminazione, relè di laboratorio o sistemi domestici possono attivarsi in slot precisi senza affidarsi al ritardo del loop.
  • Orologi da banco e display: OLED, LCD o e-paper mostrano un’ora che non si perde al primo reset.
  • Sistemi a basso consumo: l’uscita INT/SQW consente di svegliare il microcontrollore solo quando serve, invece di restare in polling continuo.
  • Timer e sveglie: con i due allarmi interni puoi costruire un timer più pulito di una soluzione basata solo su `millis()`.

Se il progetto prevede log, orari o riattivazioni programmate, il DS3231 non è un vezzo: è una base tecnica sensata. Se invece vuoi solo “sapere più o meno che ora è”, stai probabilmente scegliendo un RTC più preciso di quanto ti serva. Ed è proprio per questo che vale la pena chiudere con una verifica pratica prima di dichiarare finito il montaggio.

Le verifiche finali che mi fanno capire se l’orologio è davvero pronto

  • Lo scanner I2C vede il modulo all’indirizzo 0x68.
  • L’ora continua a scorrere anche dopo aver tolto l’alimentazione principale.
  • La batteria è inserita correttamente e il modulo non usa una logica di ricarica incompatibile con la cella scelta.
  • La lettura su seriale avanza in modo regolare e non riparte da zero a ogni upload.
  • I fili SDA e SCL sono corti, ordinati e senza contatti incerti sulla breadboard.

Quando questi controlli sono a posto, il DS3231 smette di essere un componente “da provare” e diventa un blocco affidabile su cui costruire orologi, datalogger e automazioni che non perdono il filo del tempo.

Domande frequenti

Il DS3231 conviene quando l’ora deve restare davvero affidabile nel lungo periodo: usa un oscillatore compensato in temperatura, quindi deriva molto meno di un modulo basato solo su quarzo esterno. È la scelta giusta per datalogger, automazioni, orologi da banco e sistemi che devono ripartire già allineati dopo un blackout. Il DS1307 resta più adatto a prototipi semplici o casi in cui la precisione non è critica.

I collegamenti essenziali sono pochi: VCC, GND, SDA e SCL. Su Uno e Nano, SDA va su A4 e SCL su A5; INT/SQW è opzionale e può andare su un pin con interrupt, per esempio D2, se vuoi usare allarmi o impulsi periodici. Il bus I2C risponde all’indirizzo 0x68, quindi se lo scanner non lo vede il problema è quasi sempre un cavo sbagliato, una massa mancante o un’alimentazione non corretta.

La sequenza corretta è inizializzare Wire, avviare il modulo con rtc.begin() e usare rtc.lostPower() per capire se l’orologio ha perso alimentazione. Solo in quel caso ha senso eseguire rtc.adjust(DateTime(F(__DATE__), F(__TIME__))) per impostare l’ora di compilazione. Se lasci adjust() attivo sempre, ogni reset o upload riscrive il clock e sembra che il modulo non tenga il tempo.

Gli errori più comuni sono SDA e SCL invertiti, massa comune dimenticata, modulo alimentato senza controllare il tipo di breakout e batteria non adatta al circuito di carica presente sulla schedina. Un altro equivoco frequente è aspettarsi che il sensore di temperatura interno sostituisca un termometro ambientale: serve al RTC, non a misurare la stanza. Prima di toccare il codice, conviene sempre verificare che lo scanner I2C mostri davvero 0x68.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag:

ds3231 i2c rtc allarme interrupt

Condividi post

Eustachio Fiore

Eustachio Fiore

Mi chiamo Eustachio Fiore e ho sette anni di esperienza nel campo della tecnologia, degli hobby e del tempo libero. La mia passione per questi argomenti è nata fin da giovane, quando ho iniziato a esplorare il mondo della tecnologia e a scoprire come essa possa arricchire le nostre vite quotidiane. Scrivere per elicotterielettrici.it mi permette di condividere le mie conoscenze e di aiutare gli altri a comprendere temi complessi in modo chiaro e accessibile. Mi dedico a scrivere articoli che spaziano dalle ultime novità tecnologiche a suggerimenti pratici per hobby che possono migliorare il nostro tempo libero. Sono sempre attento a verificare le fonti e a confrontare le informazioni, per garantire che ciò che presento sia utile, preciso e aggiornato. La mia missione è rendere la tecnologia e i suoi sviluppi comprensibili e interessanti per tutti, affinché possano essere utilizzati per arricchire le esperienze quotidiane.

Scrivi un commento