Il DS3231 è un modulo RTC estremamente accurato con cui misurare il tempo con Arduino
Tra i moduli RTC (Real-time clock) il DS3231 risulta uno dei più accurati e affidabili, nonché economici. Il modulo offre un conteggio automatico dei giorni, misurando minuziosamente anni, mesi, giorni, ore, minuti e secondi, integrando anche un sensore di temperatura. La batteria tampone da 3V garantisce il cronometraggio anche in assenza di alimentazione da dev-board. Ricordiamo già da ora che la batteria a bottone da utilizzare è la 2032, la stessa utilizzata sulle schede madri dei PC e va acquistata separatamente.
Specifiche
Il modulo DS3231 è dotato di un TCXO (oscillatore termocompensato) con cui elabora con estrema precisione le informazioni di anno, mese, giorno, ora, minuti e secondi. Inoltre il TCXO gestisce il rilevamento della temperatura in un range compreso tra gli 0°C ed i 70°C. Nelle versioni industriali il range è più ampio e va da -40°C ai +85°C. A livello di affidabilità, la data alla fine del mese viene regolata automaticamente per i mesi con meno di 31 giorni, comprese le correzioni per l’anno bisestile. Tuttavia, la temperatura rilevata è meno attendibile, con un’accuratezza di ±3°C.
Il DS3231 adopera l’interfaccia I2C per comunicare con Arduino, ciononostante non è possibile connettere sulla stessa interfaccia più moduli RTC senza saldare i pin A0, A1 o A2, permettendo ad ogni modulo di cambiare indirizzo. Quindi, se abbiamo 2 moduli, nel primo salderemo la coppia A0, mentre nel secondo modulo salderemo la coppia A1.
Il modulo RTC DS3231 possiede 6 pin:
PIN | FUNZIONE |
---|---|
GND | Ground |
Vcc | Alimentazione a CC con 5V o 3,3V |
SDA | Serial Data Input/Output |
SCL | Serial Clock Input |
SQW | Square-Wave Output: necessita di un resistore in pullup e una tensione uguale o inferiore ai 5,5V. Funziona come un interruttore per la gestione degli allarmi o per far uscire fuori il processore dalla Sleep-Mode. |
32K | Uscita a 32 kHz per gestire in maniera più precisa la misurazione. |
Possiamo acquistare il modulo DS3231 su:
- Amazon: https://amzn.to/38klKkD
- Aliexpress: https://s.click.aliexpress.com/e/_AZo6Dv
Collegamenti
Come anticipato, il DS3231 utilizza l’interfaccia I2C, quindi collegheremo il modulo ai pin SDA e SCL di Arduino, oppure ai pin analogici A4 e A5.
L’alimentazione utilizzata in questo esempio è di 5V, ma vanno bene anche i 3,3V. Se il collegamento elettrico è effettuato correttamente, si attiverà il led rosso POWER.
Prima di effettuare il collegamenti, installare la batteria a bottone 2032 nel vano integrato nel modulo RTC, rammentando che il polo positivo della batteria va rivolto verso l’alto.
Codice
Per rendere operativo il modulo RTC DS3231 abbiamo bisogno della libreria apposita, scaricabile a questo LINK. Una volta scaricato e installato sulla IDE di Arduino, procediamo a redigere il primo sketch di prova per testare questo sensore (scaricabile QUI), trattando i dati rilevati solamente come stringhe e non come valori numerici. Iniziamo includendo la libreria DS3231.h e definiamo i collegamenti ai pin SDA e SCL di Arduino, creando l’oggetto rtc per gestire le informazioni che riceviamo dal modulo.
#include <DS3231.h> DS3231 rtc(SDA, SCL);
Passando ora al VOID SETUP, avviamo il monitor seriale, il modulo RTC e settiamo il giorno della settimana scrivendolo rigorosamente tutto in maiuscolo (o ci darà errore), l’ora nel formato h/m/s e la data nel formato GG/MM/AAAA. Non anteponete zeri, altrimenti fornirà errore.
rtc.setDOW(THURSDAY); // Imposta il giorno della settimana rtc.setTime(11, 0, 0); // Imposta l'ora in formato 24 ore rtc.setDate(7, 1, 2021); // Imposta data in formato GG/MM/AAAA
Prestiamo particolare attenzione alle tre righe riportate sopra, perché successivamente sarà necessario commentarle per disattivarle, altrimenti ad ogni avvio della dev-board il modulo si reimposterà con l’orario settato. Passiamo ora al VOID LOOP, dove stampiamo su monitor seriale il giorno della settimana (rtc.gtDOWStr()), la data (rtc.getDateStr()) e l’orario (rtc.getTimeStr()) sotto forma di stringhe.
Serial.println(rtc.getDOWStr()); // Giorno della settimana Serial.println(rtc.getDateStr()); // Data Serial.println(rtc.getTimeStr()); // Orario Serial.println("");
Carichiamo lo sketch, dopodiché torniamo nel VOID SETUP e commentiamo le impostazioni di ora e data come riportato qui:
//rtc.setDOW(THURSDAY); // Imposta il giorno della settimana //rtc.setTime(11, 0, 0); // Imposta l'ora in formato 24 ore //rtc.setDate(7, 1, 2021); // Imposta data in formato GG/MM/AAAA
Ricaricate lo sketch e apriamo il monitor seriale. Ricordiamo di nuovo che questo passaggio è fondamentale al fine di memorizzare correttamente le informazioni temporali. Impostando un delay di 1 secondo, osserviamo i dati stampati riportando il giorno della settimana in inglese (possiamo modificare la libreria e inserirli in italiano), la data e l’orario.
Passiamo ora al secondo sketch (SCARICABILE QUI), in cui i dati sono trattati come numeri e non solo come stringhe. Come nel primo esempio, inseriamo la libreria e definiamo i pin e creiamo l’oggetto rtc, definendo poi la variabile tempo in cui verranno caricate ore, minuti, secondi, anno, mese e giorno.
#include <DS3231.h> DS3231 rtc(SDA, SCL); Time tempo;
Nel VIOD SETUP avviamo il monitor seriale, il modulo rtc e impostiamo giorno della settimana, ora e data, rammentando che sarà necessario commentarle dopo il primo caricamento.
Serial.begin(9600); rtc.begin(); // avvio modulo DS3231 // Commenta le successiva tre righe dopo aver caricato lo sketch, poi ricaricalo nuovamente rtc.setDOW(THURSDAY); // Imposta il giorno della settimana rtc.setTime(11, 9, 0); // Imposta l'ora in formato 24 ore rtc.setDate(7, 1, 2021); // Imposta data in formato GG/MM/AAAA
Nel VOID LOOP acquisisco le informazioni temporali su tempo con la funzione getTime().
tempo = rtc.getTime();
Stampiamo su monitor seriale le informazioni singolarmente per anno (tempo.year), stampo il nome del mese (rtc.getMonthStr()) in lingua inglese, ricordando che modificando la libreria possiamo farlo in lingua italiana, poi il numero del mese (tempo.mon), il giorno (tempo.date), infine ore (tempo.hour), minuti (tempo.min) e secondi (tempo.sec).
Serial.print ("Siamo nell'anno "); Serial.print(tempo.year); Serial.print (" DC, nel mese di "); Serial.print( rtc.getMonthStr()); Serial.print("("); Serial.print(tempo.mon); Serial.print(")"); Serial.print(", giorno "); Serial.println(tempo.date); // Giorno della settimana Serial.print ("Oggi è "); Serial.println(rtc.getDOWStr()); // Informazioni su ore, minuti e secondi Serial.print("Sono le ore "); Serial.print(tempo.hour); Serial.print(" e "); Serial.print(tempo.min); Serial.print(" minuti e "); Serial.print(tempo.sec); Serial.println (" secondi."); Serial.println("");
Carichiamo lo sketch, poi come nel primo esempio, commento i seguenti dati e ricarico nuovamente il codice su Arduino.
//rtc.setDOW(THURSDAY); // Imposta il giorno della settimana //rtc.setTime(11, 0, 0); // Imposta l'ora in formato 24 ore //rtc.setDate(7, 1, 2021); // Imposta data in formato GG/MM/AAAA
Apriamo il monitor seriale per vedere il risultato. ogni 5 secondi ci viene fornita una scritta che riporta tutte le informazioni.
Passiamo adesso all’ultimo esempio (SCARICABILE QUI) del nostro DS3231 che prevede anche la misurazione della temperatura. Prenderemo spunto dal primo esempio, quindi vedremo solo le parti relative alla misurazione della temperatura. Ci spostiamo direttamente nel VOID LOOP dove adoperiamo la funzione rtc.getTemp() per ottenere la temperatura espressa in gradi Celsius.
Serial.print("Temperatura: "); Serial.print(rtc.getTemp()); Serial.println ("°C");
Come per ogni sketch fin ora esaminato, carichiamolo su Arduino, poi torniamo nel VOID SETUP e commentiamo le seguenti righe in modo che appaiano in questo modo:
//rtc.setDOW(THURSDAY); // Imposta il giorno della settimana //rtc.setTime(11, 0, 0); // Imposta l'ora in formato 24 ore //rtc.setDate(7, 1, 2021); // Imposta data in formato GG/MM/AAAA
Ricarichiamo lo sketch e apriamo il monitor seriale, in cui apparirà, oltre alla data e all’orario, anche la temperatura.