Modulo RTC DS3231

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

ParameterValue
Size38mm (length), 22mm (width), 14mm (height)
Weight8g
Working voltage3.3-5.5V
Clock accuracy±2ppm from 0°C to +40°C; ±3.5ppm from 40°C to +85°C
Calendar alarm clocks2 programmable
Square wave outputYes
Real-time clock outputSeconds, minutes, hours, weekdays, dates, months and years
Leap year compensationUp to 2100
Temperature sensorBuilt-in with ±3°C accuracy
Memory chipAT24C32, 32K storage capacity, IIC bus interface
Memory chip featuresMaximum transmission speed 400KHz, address can be modified
Battery backupYes, for continuous timing
Operating temperatureCommercial: 0°C to +70°C; Industrial: -40°C to +85°C
Power consumptionLow
Other featuresAging correction register, RST output, push button reset input
UL approvedYes

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.

DS3231 RTC Chip Schematic Diagram
DS3231 RTC Chip Schematic Diagram

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

DS3231 Pin Diagram
DS3231 Pin Diagram
Pin NameFunction
32 kHz32 kHz frequency output
VCCUsed for the DC pin of the main power supply
/INT/SQWLow-level active interrupt or square wave output
RSTReset pin
N.C.Indicates no connection; the external must be grounded
GNDGround
VBATBackup power input
SDASerial data input and output
SCLSerial clock input

Schema a blocchi del DS3231

DS3231 Block Diagram
DS3231 Block Diagram

Programma il modulo RTC DS3231 con Arduino Uno

Strumenti richiesti:

  • Arduino Uno x1
  • Modulo RTC DS3231 x1
  • Jumper (linea DuPont)

Istruzioni di cablaggio

Connect DS3231 RTC Module with Arduino Uno
Pin on DS3231 RTC ModulePin on Arduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

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

Condividi con:

Torna in alto

Instant Quote