Arduino‎ > ‎

Arduino - Configurar Reloj DS3231

El módulo DS3231, un reloj para Arduino


El módulo DS3231 permitirá que podamos llevar un registro detallado del transcurso del tiempo en nuestro microcontrolador. Los proyectos que podemos llevar a cabo con este módulo van desde estaciones de sensores hasta alarmas y sondas de registro de datos.


En múltiples ocasiones vamos a necesitar que nuestros proyectos lleven un conteo estricto sobre el tiempo transcurrido. Esto es imposible de conseguir con nuestro Arduino debido a que el mismo no está capacitado para ello. Necesitamos un circuito que sea capaz de mantener el conteo del tiempo aún cuando el microcontrolador esté apagado.

Afortunadamente existe el módulo DS3231.

Este módulo incluye un circuito integrado, el DS3231, además de un regulador de tensión, una batería de 3.6 voltios (de las que se encuentran en los motherboard de las computadoras), entre otras cosas (es capaz de medir temperatura).

Se comunica con Arduino utilizando el protocolo I2C, por lo que encontraremos los pines VCC, GND, SCL y SDA.

     


Una vez se ha descargado e instalado la librería podemos proceder a probar nuestro módulo. Como siempre, cada vez que se vaya a utilizar la interfaz I2C los pines A4 y A5 deben ser reservados para conectar el SDA y SCL, respectivamente.

Las conexiones con Arduino se deben realizar de la siguiente manera.

 

Con las conexiones hechas, se procede a la configuración inicial del módulo. Es necesario llevar a cabo un proceso de asignación de fecha y hora. Esta información será almacenada en el circuito integrado y se mantendrá en el tiempo gracias a la pila con la que cuenta el dispositivo.

El código para setear la hora es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <DS3231.h>
#include <Wire.h>
 
DS3231 Clock;
void setup() {
  // Se inicial la interfaz I2c
  Wire.begin();
  // Se inicia la Comunicación Serial
  Serial.begin(9600);
  //Se establece el modo horario en 12 horas (false = 24h)
  Clock.setClockMode(true);
  //Se establece el año
  Clock.setYear((byte)(14));
  //Mes
  Clock.setMonth((byte)05);
  //Dia de la semana (no lo estoy considerando)
  //Clock.setDoW((byte)dia);
  //Día
  Clock.setDate((byte)22);
  //Hora
  Clock.setHour((byte)8);
  //Minutos
  Clock.setMinute((byte)11);
  //Segundos
  Clock.setSecond((byte)0);
}
 
void loop() {
 
}

 

No estoy considerando el día de la semana ya que no me parece relevante. Esta librería me ha dado problemas cuando la seteo en 24 horas debido a que luego de las 15 horas regresa a 10. Supongo que algo tiene que ver con los 5 bits que requeriría ir mas allá del 16. En fin, utilizándola en 12 horas trabaja muy bien.

La hora que he establecido en este ejemplo es las 8:11 PM, del 22 de mayo de 2014.

Ahora les presentaré el código que se utiliza para rescatar la hora de nuestro dispositivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <DS3231.h>
#include <Wire.h>
 
DS3231 Clock;
 
 
byte year, month, date, DoW, hour, minute, second;
 
void setup() {
  // Se inicial la interfaz I2c
  Wire.begin();
  // Se inicia la Comunicación Serial
  Serial.begin(9600);
}
 
void loop() {
 
  delay(1000);
  //Se rescata la información
  Clock.getTime(year, month, date, DoW, hour, minute, second);
  //Se imprime
  Serial.print(date, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  ");
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(minute, DEC);
  Serial.print(":");
  Serial.println(second, DEC);
}

 

El resultado que se obtiene debe ser similar a lo que se muestra a continuación.

 

La librería cuenta con algunas otras opciones interesantes como alarmas y funciones de oscilador. Dentro del paquete se pueden encontrar algunos ejemplos.

ċ
DS3231.zip
(10k)
Andrés Franchi,
16 may. 2017 9:28
Comments