DS3231 es un RTC I²C con oscilador de cristal compensado por temperatura (TCXO), alimentación de respaldo, dos alarmas y salida de onda cuadrada programable. Su dirección I²C fija es 0x68. El CI ofrece ±2 ppm entre 0 y +40 °C y ±3,5 ppm entre −40 y +85 °C; una placa módulo puede añadir EEPROM, LED, regulador o cargador que no pertenecen al 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
| Dato del CI DS3231 | Valor de la hoja de datos |
|---|---|
| Alimentación principal | 2,3–5,5 V |
| Entrada de respaldo | 2,3–5,5 V |
| Dirección RTC | 0x68 fija |
| Velocidad I²C | hasta 400 kHz |
| Precisión | ±2 ppm (0 a +40 °C); ±3,5 ppm (−40 a +85 °C) |
| Salida de temperatura | ±3 °C |
| Funciones | dos alarmas; onda cuadrada programable; año bisiesto hasta 2100 |
| Elementos propios del módulo | dimensiones, AT24C32, LED, regulador y cargador varían |
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
Una referencia y un comparador supervisan VCC. Cuando VCC cae por debajo del umbral de fallo, se inhibe el acceso, el reloj conmuta a VBAT y RST pasa a nivel bajo. Al aplicar VBAT por primera vez el oscilador no arranca hasta aplicar VCC o escribir una dirección I²C válida; compruebe el indicador Oscillator Stop Flag tras eventos de alimentación.
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

| Nombre del pin | Función |
|---|---|
| 32 kHz | Salida de frecuencia de 32 kHz |
| VCC | Utilizado para el pin de corriente continua de la fuente de alimentación principal |
| /INT/SQW | Interrupción activa en nivel bajo o salida de onda cuadrada |
| RST | Pin de reinicio (Reset) |
| N.C. | Indica sin conexión; la parte externa debe conectarse a tierra |
| GND | Tierra (Masa) |
| VBAT | Entrada de alimentación de respaldo |
| SDA | Entrada y salida de datos en serie |
| SCL | Entrada de reloj en serie |
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 en el módulo RTC DS3231 | Pin en 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
Notas Practicas: Notas de integración integradas para el módulo DS3231 RTC
Comprobaciones de módulos:Confirme el esquema exacto, el I²C pull-up, el voltaje lógico, la química de la batería y si hay un cargador. La EEPROM AT24C32, las dimensiones, el LED y el cargador varían y no forman parte del CI DS3231. Use 0x68 para RTC y busque por separado cualquier EEPROM agregada. Fuentes:Dispositivos analógicos DS3231, ,Ficha técnica Rev. 10yGuía de Adafruit.




