Un módulo de reloj es un módulo electrónico que se utiliza normalmente para medir la hora y la fecha. Por lo general, incluye un oscilador de cristal para generar una referencia horaria precisa y cuenta con algunos circuitos de control para configurar y ajustar la hora.
En ocasiones en las que se requieren relojes de alta precisión, los módulos de reloj DS1302 y ds3231 pueden satisfacer las necesidades básicas. A continuación, le presentaré la definición, el diagrama de pines, los parámetros, las funciones y la programación del módulo de reloj ds3231.
¿Qué es el módulo RTC DS3231?
El módulo RTC DS3231 es un popular módulo de reloj en tiempo real (RTC) que se utiliza habitualmente en proyectos electrónicos. Se trata de un dispositivo pequeño y económico que proporciona funciones precisas de reloj y calendario. El módulo RTC DS3231 se basa en el chip DS3231, que es un RTC extremadamente preciso con un oscilador de cristal compensado por temperatura integrado. Es capaz de proporcionar información de hora y fecha con una precisión de hasta ±2 ppm.
El módulo DS3231 RTC se utiliza ampliamente en aplicaciones como el registro de datos, el sellado de tiempo y los sistemas de alarma. También se utiliza habitualmente en dispositivos electrónicos que requieren una medición precisa del tiempo, como cámaras, grabadoras de audio y controladores industriales. El módulo es fácil de usar y se puede conectar con microcontroladores como Arduino y Raspberry Pi.
En general, el módulo RTC DS3231 es un módulo de reloj fiable y preciso que se utiliza ampliamente en diversos proyectos electrónicos.
Parámetros del módulo 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 |
Estructura del chip de reloj DS3231
El chip de reloj DS3231 consta de ocho módulos, divididos en cuatro grupos funcionales: TCXO, control de alimentación, botón de reinicio y RTC.

DS3231 TCXO
El TCXO incluye un sensor de temperatura, un oscilador y una lógica de control. El controlador lee la salida del sensor de temperatura en el chip, utiliza una tabla de consulta para determinar la capacitancia requerida, añade la corrección por envejecimiento del registro AGE y, a continuación, establece el registro de selección de capacitancia. Los nuevos valores, incluidos los cambios en el registro AGE, solo se cargan cuando cambia la temperatura o cuando se completa la conversión de temperatura iniciada por el usuario. El valor de la temperatura se lee al encender el VCC y, a continuación, cada 64 segundos.
Control de alimentación DS3231
La función de control de alimentación es proporcionada por la referencia de voltaje compensada por temperatura (VPF) y un circuito comparador que supervisa el nivel de VCC. Cuando VCC es mayor que VPF, el DS3231 se alimenta mediante VCC. Cuando VCC es menor que VPF pero mayor que VBAT, el DS3231 sigue alimentándose mediante VCC. Cuando VCC es inferior a VPF y a VBAT, el DS3231 se alimenta mediante VBAT. Para proteger la batería, el oscilador no se inicia cuando se aplica VBAT por primera vez al dispositivo, a menos que se cargue VCC o se escriba una dirección I2C válida en el dispositivo. El tiempo de inicio típico del oscilador es inferior a 1 segundo. Después de encender VCC o escribir una dirección I2C válida, el dispositivo mide la temperatura una vez y calibra el oscilador utilizando el valor de corrección calculado después de unos 2 segundos. Una vez que el oscilador está en funcionamiento, permanece en funcionamiento mientras la alimentación (VCC o VBAT) sea válida. El dispositivo mide la temperatura y calibra la frecuencia del oscilador cada 64 segundos.
Botón de reinicio DS3231
El DS3231 tiene una función de interruptor de botón conectada al pin de salida RST. Si el DS3231 no está en un ciclo de reinicio, supervisa continuamente el flanco descendente de la señal RST. Si se detecta una transición de flanco, el DS3231 completa el rebote del interruptor bajando RST. Una vez que el temporizador interno llega a su fin, el DS3231 continúa supervisando la señal RST. Si la señal permanece en un nivel bajo, el DS3231 continúa supervisando la línea de señal para detectar un flanco ascendente. Una vez que se suelta el botón, el DS3231 fuerza el RST a un nivel bajo y mantiene el tRST. El RST también se puede utilizar para indicar alarmas de fallo de alimentación. Cuando el VCC es inferior al VPF, se genera una señal de alarma de fallo de alimentación interna y el RST se pone en bajo. Si el oscilador no funciona cuando se carga el VCC, se omite el tREC y el RST pasa inmediatamente a alto.
Reloj y calendario RTC DS3231
La información del reloj y el calendario se puede obtener leyendo los bytes de registro correspondientes. Los datos del reloj y el calendario se pueden configurar o inicializar escribiendo los bytes de registro correspondientes. El contenido de los registros del reloj y el calendario está en formato decimal codificado en binario (BCD). El DS3231 funciona en modo de 12 o 24 horas. El sexto bit del registro de horas define la selección del modo de 12 o 24 horas. Cuando este bit es alto, se selecciona el modo de 12 horas. En el modo de 12 horas, el quinto bit es el bit indicador AM/PM, que es lógico alto para PM.
Registros internos y funciones del DS3231
Las direcciones de registro del DS3231 son 00h~12h, que se utilizan para almacenar segundos, minutos, horas, semanas, fechas e información de configuración de alarmas, respectivamente. Durante el acceso multibyte, si la dirección alcanza 12h al final del espacio RAM, se producirá un rebobinado. En ese momento, localice la posición inicial, que es la unidad 00h.
La información de hora y calendario del DS3231 se configura e inicializa leyendo los registros correspondientes. El búfer auxiliar del usuario se utiliza para evitar posibles errores cuando se actualizan los registros internos. Al leer los registros de hora y calendario, el búfer del usuario se encuentra en cualquier condición START. O sincronícelo con el registro interno cuando el puntero del registro vuelva a cero.
La información de la hora se lee desde estos registros auxiliares y el reloj sigue funcionando en ese momento, de modo que se puede evitar la relectura de los registros cuando se produce la actualización del registro principal durante la operación de lectura. Tomando como ejemplo el registro de control (dirección 0EH), este puede controlar el reloj en tiempo real, el despertador y la salida de onda cuadrada.
Diagrama de pines 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 |
Diagrama de bloques del DS3231

Programa el módulo RTC DS3231 con Arduino Uno
Herramientas necesarias:
- Arduino Uno x1
- Módulo RTC DS3231 x1
- Puente (línea DuPont)
Instrucciones para el cableado

| Pin on DS3231 RTC Module | Pin on Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Instalación de la biblioteca RTClib
La biblioteca utilizada en este ejemplo es RTClib, escrita por Adafruit. Instale primero esta biblioteca.
Proyecto – Cargar bibliotecas – Administrar bibliotecas – Introduzca «RTClib» en el cuadro de búsqueda.
Programación del DS3231
En primer lugar, debe cargar la biblioteca RTClib que acaba de instalar.
#include "RTClib.h"
Después de eso, puede crear una instancia DS3231 llamada rtc y llamar a la función de RTC_DS3231.
RTC_DS3231 rtc;
Las funciones utilizadas para configurar la hora son rtc.adjust, por ejemplo:
rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
Se utiliza para obtener la hora del DS3231 mediante rtc.now(), y los datos devueltos son de tipo DateTime, que contiene los datos del año, mes, día, hora, minuto y segundo, por ejemplo:
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();
Código completo del programa
// 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);
}
DS3231 Aplicación
- Sistemas de adquisición de datos
- Sistemas de control industrial
- Batería de respaldo
- Monitorización de temperatura
- Sistemas de control de acceso
- Dispositivos médicos




