Un modulo orologio è un modulo elettronico, tipicamente utilizzato per misurare l’ora e la data, di solito include un oscillatore a cristallo per generare un riferimento temporale accurato e dispone di alcuni circuiti di controllo per impostare e regolare l’ora.
In occasioni con elevati requisiti di clock, i moduli clock DS1302 e ds3231 possono soddisfare le esigenze di base. Di seguito vi presenterò la definizione, lo schema dei pin, i parametri, le funzioni e la programmazione del modulo clock ds3231.
Cos'è il modulo RTC DS3231?
Il modulo DS3231 RTC è un modulo Real-Time Clock (RTC) popolare comunemente utilizzato in progetti elettronici. È un dispositivo piccolo ed economico che fornisce funzioni accurate di misurazione del tempo e calendario. Il modulo DS3231 RTC si basa sul chip DS3231, che è un RTC estremamente preciso con un oscillatore a cristallo compensato in temperatura integrato. È in grado di fornire informazioni su data e ora con una precisione fino a ±2 ppm.
Il modulo DS3231 RTC è ampiamente utilizzato in applicazioni come la registrazione dei dati, la marcatura temporale e i sistemi di allarme. È anche comunemente utilizzato in dispositivi elettronici che richiedono una misurazione precisa del tempo, come fotocamere, registratori audio e controllori industriali. Il modulo è facile da usare e può essere interfacciato con microcontrollori come Arduino e Raspberry Pi.
Nel complesso, il modulo DS3231 RTC è un modulo orologio affidabile e preciso ampiamente utilizzato in vari progetti elettronici.
Parametri del modulo RTC DS3231
| Parameter | Value |
|---|---|
| Size | 38mm (length), 22mm (width), 14mm (height) |
| Weight | 8g |
| Working voltage | 3.3-5.5V |
| Clock accuracy | ±2ppm from 0°C to +40°C; ±3.5ppm from 40°C to +85°C |
| Calendar alarm clocks | 2 programmable |
| Square wave output | Yes |
| Real-time clock output | Seconds, minutes, hours, weekdays, dates, months and years |
| Leap year compensation | Up to 2100 |
| Temperature sensor | Built-in with ±3°C accuracy |
| Memory chip | AT24C32, 32K storage capacity, IIC bus interface |
| Memory chip features | Maximum transmission speed 400KHz, address can be modified |
| Battery backup | Yes, for continuous timing |
| Operating temperature | Commercial: 0°C to +70°C; Industrial: -40°C to +85°C |
| Power consumption | Low |
| Other features | Aging correction register, RST output, push button reset input |
| UL approved | Yes |
Struttura del chip clock DS3231
Il chip clock DS3231 è costituito da otto moduli, suddivisi in quattro gruppi funzionali: TCXO, controllo dell’alimentazione, pulsante di reset e RTC.

TCXO DS3231
Il TCXO include un sensore di temperatura, un oscillatore e una logica di controllo. Il controller legge l’output del sensore di temperatura sul chip, utilizza una tabella di ricerca per determinare la capacità richiesta, aggiunge la correzione dell’invecchiamento dal registro AGE e quindi imposta il registro di selezione della capacità. I nuovi valori, comprese le modifiche al registro AGE, vengono caricati solo quando la temperatura cambia o quando la conversione di temperatura avviata dall’utente è completata. Il valore della temperatura viene letto all’accensione VCC e quindi ogni 64 secondi.
Controllo dell'alimentazione DS3231
La funzione di controllo dell’alimentazione è fornita dal riferimento di tensione compensato in temperatura (VPF) e da un circuito comparatore che monitora il livello VCC. Quando VCC è superiore a VPF, il DS3231 è alimentato da VCC. Quando VCC è inferiore a VPF ma superiore a VBAT, il DS3231 è ancora alimentato da VCC. Quando VCC è inferiore a VPF e inferiore a VBAT, il DS3231 è alimentato da VBAT. Per proteggere la batteria, l’oscillatore non si avvia quando VBAT viene applicato per la prima volta al dispositivo a meno che VCC non sia caricato o un indirizzo I2C valido non sia scritto sul dispositivo. Il tempo di avvio tipico dell’oscillatore è inferiore a 1 secondo. Dopo l’accensione VCC o una scrittura di un indirizzo I2C valido, il dispositivo misura la temperatura una volta e calibra l’oscillatore utilizzando il valore di correzione calcolato dopo circa 2 secondi. Una volta che l’oscillatore è in funzione, rimane in funzione finché l’alimentazione (VCC o VBAT) è valida. Il dispositivo misura la temperatura e calibra la frequenza dell’oscillatore ogni 64 secondi.
Pulsante di reset DS3231
Il DS3231 ha una funzione di interruttore a pulsante collegata al pin di uscita RST. Se il DS3231 non è in un ciclo di reset, monitora continuamente il fronte di discesa del segnale RST. Se viene rilevata una transizione di fronte, il DS3231 completa il debounce dell’interruttore portando RST a un livello basso. Dopo che il timer interno è scaduto, il DS3231 continua a monitorare il segnale RST. Se il segnale rimane a un livello basso, il DS3231 continua a monitorare la linea del segnale per rilevare un fronte di salita. Una volta rilasciato il pulsante, il DS3231 forza RST a un livello basso e mantiene tRST. RST può anche essere utilizzato per indicare allarmi di mancanza di alimentazione. Quando VCC è inferiore a VPF, viene generato un segnale di allarme di mancanza di alimentazione interno e RST viene portato a un livello basso. Se l’oscillatore non funziona quando VCC è caricato, tREC viene saltato e RST diventa immediatamente alto.
Orologio e calendario RTC DS3231
Le informazioni sull’orologio e sul calendario possono essere ottenute leggendo i byte di registro appropriati. I dati di orologio e calendario possono essere impostati o inizializzati scrivendo i byte di registro appropriati. Il contenuto dei registri di orologio e calendario è in formato decimale codificato in binario (BCD). Il DS3231 funziona in modalità a 12 o 24 ore. Il sesto bit del registro delle ore definisce la selezione della modalità a 12 o 24 ore. Quando questo bit è alto, viene selezionata la modalità a 12 ore. Nella modalità a 12 ore, il quinto bit è l’indicatore AM/PM, che è logico alto per PM.
Registri e funzioni interni del DS3231
Gli indirizzi dei registri DS3231 sono 00h–12h, che vengono utilizzati per memorizzare rispettivamente secondi, minuti, ore, settimane, date e informazioni di impostazione dell’allarme. Durante l’accesso multi-byte, se l’indirizzo raggiunge 12h alla fine dello spazio RAM, si verificherà un avvolgimento. A questo punto, individua la posizione iniziale che è l’unità 00h.
Le informazioni sull’ora e sul calendario del DS3231 vengono impostate e inizializzate leggendo i registri corrispondenti. Il buffer ausiliario dell’utente viene utilizzato per prevenire possibili errori quando i registri interni vengono aggiornati. Quando si leggono i registri di ora e calendario, il buffer dell’utente è in qualsiasi condizione START. Oppure sincronizza con il registro interno quando il puntatore del registro torna a zero.
Le informazioni sull’ora vengono lette da questi registri ausiliari e l’orologio continua a funzionare in questo momento, in modo che la rilettura dei registri possa essere evitata quando l’aggiornamento del registro principale si verifica durante l’operazione di lettura. Prendendo come esempio il registro di controllo (indirizzo 0EH), può controllare l’orologio in tempo reale, l’allarme e l’uscita a onda quadra.
Schema dei pin del DS3231

| Pin Name | Function |
|---|---|
| 32 kHz | 32 kHz frequency output |
| VCC | Used for the DC pin of the main power supply |
| /INT/SQW | Low-level active interrupt or square wave output |
| RST | Reset pin |
| N.C. | Indicates no connection; the external must be grounded |
| GND | Ground |
| VBAT | Backup power input |
| SDA | Serial data input and output |
| SCL | Serial clock input |
Schema a blocchi del DS3231

Programma il modulo RTC DS3231 con Arduino Uno
Strumenti richiesti:
- Arduino Uno x1
- Modulo RTC DS3231 x1
- Jumper (linea DuPont)
Istruzioni di cablaggio

| Pin on DS3231 RTC Module | Pin on Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Installazione della libreria RTClib
La libreria utilizzata in questo esempio è RTClib scritta da Adafruit, si prega di installare prima questa libreria.
Progetto – Carica librerie – Gestisci librerie – Inserisci “RTClib” nella casella di ricerca
Programmazione del DS3231
Innanzitutto, è necessario caricare la libreria RTClib appena installata.
#include "RTClib.h"
Dopo di che, è possibile creare un’istanza DS3231 denominata rtc e chiamare la funzione di RTC_DS3231
RTC_DS3231 rtc;
Le funzioni utilizzate per impostare l’ora sono rtc.adjust, ad esempio:
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
Viene utilizzato per rtc.now() ottenere l’ora del DS3231 e i dati restituiti sono di tipo DateTime, che contiene i dati di anno, mese, giorno, ora, minuto e secondo, ad esempio:
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
Codice del programma completo
// by lingshunlab.com
// Load the library of DS3231
#include "RTClib.h"
// create rtc instance
RTC_DS3231 rtc;
String input_string; // Declare the variable input_string to store the data input by the serial port
// Declare a two-dimensional array variable daysOfTheWeek, which is used to match the corresponding week name through the index (index) of the array
char daysOfTheWeek[7][12] = {"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
// get serial port data function
void GetSerialStuff(String& input_string) {
String temp_string = ""; // Declare the variable temp_string to temporarily store the data input by the serial port
while(Serial.available()) { // When the serial port has data, loop execution
temp_string += (char)Serial.read(); // Combine the read serial data into the inStr variable one by one
delay(2);
}
input_string = temp_string; // Assign the reference pointer variable to tempStr
}
void setup() {
Serial.begin(9600);
// Initialize rtc,
if (! rtc.begin()) { // If initialization fails, then
Serial.println("Couldn't find RTC");
Serial. flush();
abort(); // program stops
}
}
void loop() {
GetSerialStuff(input_string); // Get the data of the serial port
if(input_string != "") { // If the serial port is not empty, then
int to_year = input_string.substring(0, 4).toInt(); // Intercept year data from string and convert to int data type
int to_month = input_string.substring(5, 7).toInt(); // Intercept the month data from the string and convert it to int data type
int to_day = input_string.substring(8, 10).toInt(); // Intercept the day data from the string and convert it to int data type
int to_hours = input_string.substring(11, 13).toInt(); // Intercept the hour data from the string and convert it to int data type
int to_minute = input_string.substring(14, 16).toInt(); // Intercept minute data from the string and convert it to int data type
int to_second = input_string.substring(17, 19).toInt(); // Intercept the second data from the string and convert it to int data type
// Reset the time of the DS3231 module
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
delay(100);
}
// Get the time of DS3231
DateTime now = rtc.now();
// Display the current time of DS3231 through the serial port output
Serial.print(now.year(), DEC); // display the year in decimal
Serial. print('/');
Serial.print(now.month(), DEC);// Display the month in decimal
Serial. print('/');
Serial.print(now.day(), DEC);// Display the day in decimal
Serial. print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial. print(") ");
Serial.print(now.hour(), DEC);// display in decimal
Serial. print(':');
Serial.print(now.minute(), DEC);// Display minutes in decimal
Serial. print(':');
Serial.print(now.second(), DEC);// Display seconds in decimal
Serial. println();
// Display the temperature sensor data of DS3231 through the serial port output
Serial. print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial. println("C");
delay(1000);
}
Applicazione DS3231
- Sistemi di acquisizione dati
- Sistemi di controllo industriale
- Backup della batteria
- Monitoraggio della temperatura
- Sistemi di controllo accessi
- Dispositivi medici




