Cómo usar un módulo de reloj en tiempo real (DS3231)


Antes de nada, debería saber qué es un RTC (Real Time Clock), o reloj de tiempo real. Estos chips son muy frecuentes en multitud de aplicaciones, de hecho, cualquier PC tiene uno de ellos en la placa base, y está alimentado también por una pila CR2032 también, que por cierto es la que mantiene la hora y la configuración en el BIOS/UEFI y del que la coge el sistema operativo al arrancar para estar en hora (aunque ahora, con Internet, se puede usar la sincronización con servidores para mayor precisión, pero esto es otra historia…).

El RTC pues ,lo que hace es obtener mediciones de tiempo, así de simple. La diferencia con otros tipos de relojes electrónicos es que simplemente mide el tiempo, y lo hace contabilizando pulsos de señal de reloj, sabiendo la frecuencia y periodos de la misma. Además de la hora, un RTC también permite llevar una contabilidad de los días, semanas, meses y años. Es decir, la fecha completa…

En el caso del Time Clock Module (o DS3231) es un módulo que mide el tiempo, dependiente o independientemente de su tarjeta Arduino ( o derivado ) a través de su propia electrónica especializada consistente en el DS3231 acompañado de un Xtal o cristal de cuarzo que actuará como resonador, el que aporta la frecuencia. Adicionalmente, tambien se necesita una circuitería electrónica capaz de llevar el recuento y almacenar la fecha en una memoria. La circuitería debe ser capaz de contabilizar segundos, minutos, horas, días, semanas, meses y años.

Esa memoria es volátil, por eso necesita de la pila, para tener alimentación constante. Si no tiene pila o se agota, se borrará… Eso es lo que le ocurre a los PCs cuando se le agota la pila, dan una hora incorrecta. Si la configuras mientras el PC está encendido, la hora se mantendrá, ya que el RTC se está alimentando, pero es durante los procesos durante los que está apagado cuando se necesita de esa batería.

En cuanto a la forma de comunicarse con el RTC DS3131 para obtener los valores de fecha que consigue, se hace mediante bus I2C. Y para la alimentación, puedes usar 2.3 a 5.5v para el DS3231, lo que es algo más bajo que los 4.5 a 5.5v del DS1307, por lo que puede ser más eficiente energéticamente y hacer que la pila dure más.

Además, debe saber que estos módulos suelen tener una EEPROM adicional AT24C32 para almacenar algunos registros y mediciones previas, lo que es bastante práctico.

En el caso de usarlo con Arduino, la tarjeta Arduino mide el tiempo transcurrido desde que se encendió el módulo (en ms) y el módulo viene ensamblado listo para usar, con batería (suministrada).

Código

El código ha sido realizado por Gilles Thebault: http://gilles.thebault.free.fr/spip.php?article53

Biblioteca

El código necesita la biblioteca «Wire», que ya está en la tarjeta. Así que no tiene que descargarlo.

También necesitará la biblioteca «ds3231»: https://github.com/rodan/ds3231 .

Conexiones

CÓDIGO

El siguiente e código configura el módulo DS3231 y luego imprime la fecha y hora actuales cada segundo en el monitor serie:
#include <Wire.h>
#include <ds3231.h>
 
struct ts t; 
 
void setup ()  {
  Serial.begin ( 9600 ) ;
  Wire.begin () ;
  DS3231_init ( DS3231_CONTROL_INTCN ) ;
  /*------------------------------------------------ ----------------------------
  ¡Para sincronizar su módulo de reloj, inserte los valores de horario a continuación!
  -------------------------------------------------- --------------------------*/
  t.hour=12; 
  t.min=30;
  t.sec=0;
  t.mday=25;
  t.mon=12;
  t.year=2019;
 
  DS3231_set ( t ) ; 
}
 
void loop vacío ()  {
  DS3231_get ( & t ) ;
  Serial.print ( "Fecha:" ) ;
  Serial.print ( t.mday ) ;
  Serial.print ( "/" ) ;
  Serial.print ( t.mon ) ;
  Serial.print ( "/" ) ;
  Serial.print ( t.year ) ;
  Serial.print ( "\t Hora:" ) ;
  Serial.print ( t.hour ) ;
  Serial.print ( ":" ) ;
  Serial.print ( t.min ) ;
  Serial.print ( "." ) ;
  Serial.println ( t.seg ) ;
 
  delay ( 1000 ) ;
}


Explicación del código:

Este código es para usar un módulo de reloj en tiempo real (RTC) DS3231 con un Arduino. Aquí explicamos cada parte:

  1. Inclusión de bibliotecas: #include <Wire.h> #include <ds3231.h> Estas líneas incluyen las bibliotecas necesarias para la comunicación I2C y para controlar el módulo DS3231.
  2. Declaración de la estructura ts: struct ts t; Se declara una estructura ts que almacenará la fecha y hora.
  3. Configuración inicial en setup(): void setup() { Serial.begin(9600); Wire.begin(); DS3231_init(DS3231_CONTROL_INTCN);
    • Serial.begin(9600);: Inicializa la comunicación serie a 9600 baudios.
    • Wire.begin();: Inicializa la comunicación I2C.
    • DS3231_init(DS3231_CONTROL_INTCN);: Inicializa el módulo DS3231.
  4. Sincronización del reloj: t.hour = 12; t.min = 30; t.sec = 0; t.mday = 25; t.mon = 12; t.year = 2019; DS3231_set(t); Aquí se establecen los valores iniciales de la fecha y hora (25 de diciembre de 2019, 12:30:00) y se sincronizan con el módulo DS3231.
  5. Bucle principal loop(): void loop() { DS3231_get(&t); Serial.print("Fecha:"); Serial.print(t.mday); Serial.print("/"); Serial.print(t.mon); Serial.print("/"); Serial.print(t.year); Serial.print("\t Hora:"); Serial.print(t.hour); Serial.print(":"); Serial.print(t.min); Serial.print("."); Serial.println(t.sec); delay(1000); }
    • DS3231_get(&t);: Obtiene la fecha y hora actuales del módulo DS3231.
    • Serial.print(...): Imprime la fecha y hora en el monitor serie.
    • delay(1000);: Espera 1 segundo antes de repetir el bucle.

.

Cómo usar un módulo de reloj en tiempo real (DS3231)


Antes de nada, debería saber qué es un RTC (Real Time Clock), o reloj de tiempo real. Estos chips son muy frecuentes en multitud de aplicaciones, de hecho, cualquier PC tiene uno de ellos en la placa base, y está alimentado también por una pila CR2032 también, que por cierto es la que mantiene la hora y la configuración en el BIOS/UEFI y del que la coge el sistema operativo al arrancar para estar en hora (aunque ahora, con Internet, se puede usar la sincronización con servidores para mayor precisión, pero esto es otra historia…).

El RTC pues ,lo que hace es obtener mediciones de tiempo, así de simple. La diferencia con otros tipos de relojes electrónicos es que simplemente mide el tiempo, y lo hace contabilizando pulsos de señal de reloj, sabiendo la frecuencia y periodos de la misma. Además de la hora, un RTC también permite llevar una contabilidad de los días, semanas, meses y años. Es decir, la fecha completa…

En el caso del Time Clock Module (o DS3231) es un módulo que mide el tiempo, dependiente o independientemente de su tarjeta Arduino ( o derivado ) a través de su propia electrónica especializada consistente en el DS3231 acompañado de un Xtal o cristal de cuarzo que actuará como resonador, el que aporta la frecuencia. Adicionalmente, tambien se necesita una circuitería electrónica capaz de llevar el recuento y almacenar la fecha en una memoria. La circuitería debe ser capaz de contabilizar segundos, minutos, horas, días, semanas, meses y años.

Esa memoria es volátil, por eso necesita de la pila, para tener alimentación constante. Si no tiene pila o se agota, se borrará… Eso es lo que le ocurre a los PCs cuando se le agota la pila, dan una hora incorrecta. Si la configuras mientras el PC está encendido, la hora se mantendrá, ya que el RTC se está alimentando, pero es durante los procesos durante los que está apagado cuando se necesita de esa batería.

En cuanto a la forma de comunicarse con el RTC DS3131 para obtener los valores de fecha que consigue, se hace mediante bus I2C. Y para la alimentación, puedes usar 2.3 a 5.5v para el DS3231, lo que es algo más bajo que los 4.5 a 5.5v del DS1307, por lo que puede ser más eficiente energéticamente y hacer que la pila dure más.

Además, debe saber que estos módulos suelen tener una EEPROM adicional AT24C32 para almacenar algunos registros y mediciones previas, lo que es bastante práctico.

En el caso de usarlo con Arduino, la tarjeta Arduino mide el tiempo transcurrido desde que se encendió el módulo (en ms) y el módulo viene ensamblado listo para usar, con batería (suministrada).

Código

El código ha sido realizado por Gilles Thebault: http://gilles.thebault.free.fr/spip.php?article53

Biblioteca

El código necesita la biblioteca «Wire», que ya está en la tarjeta. Así que no tiene que descargarlo.

También necesitará la biblioteca «ds3231»: https://github.com/rodan/ds3231&nbsp;.

Conexiones

CÓDIGO

Arduino DS3231

Este código mostrará valores en el monitor serie.

#include <Wire.h>
#include <ds3231.h>
 
struct ts t; 
 
void setup ()  {
  Serial.begin ( 9600 ) ;
  Wire.begin () ;
  DS3231_init ( DS3231_CONTROL_INTCN ) ;
  /*------------------------------------------------ ----------------------------
  ¡Para sincronizar su módulo de reloj, inserte los valores de horario a continuación!
  -------------------------------------------------- --------------------------*/
  t.hour=12; 
  t.min=30;
  t.sec=0;
  t.mday=25;
  t.mon=12;
  t.year=2019;
 
  DS3231_set ( t ) ; 
}
 
void loop vacío ()  {
  DS3231_get ( & t ) ;
  Serial.print ( "Fecha:" ) ;
  Serial.print ( t.mday ) ;
  Serial.print ( "/" ) ;
  Serial.print ( t.mon ) ;
  Serial.print ( "/" ) ;
  Serial.print ( t.year ) ;
  Serial.print ( "\t Hora:" ) ;
  Serial.print ( t.hour ) ;
  Serial.print ( ":" ) ;
  Serial.print ( t.min ) ;
  Serial.print ( "." ) ;
  Serial.println ( t.seg ) ;
 
  delay ( 1000 ) ;
}