Módulo RTC DS3231

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

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

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 RTC Chip Schematic Diagram
DS3231 RTC Chip Schematic Diagram

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

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

Diagrama de bloques del DS3231

DS3231 Block Diagram
DS3231 Block Diagram

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

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

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

Compartir en:

Scroll al inicio

Cotización