Micropython: Usando el RTC shield de la D1 Mini

La placa D1 mini se destaca por la posibilidad de utilizar distintos shields que amplían sus capacidades. En este artículo les muestro como utilizar el RTC shield, que nos brinda la posibilidad de contar con un Reloj de Tiempo Real (Real Time Clock) y cómo acceder a él empleando Micropython.

Introducción

A menudo en un proyecto es necesario tener la información de la fecha y hora actual. Cuando medimos distintas variables y las publicamos en Internet o las almacenamos en memoria, o para disparar un evento en un momento dado, por ejemplo. En un artículo anterior expliqué como puede aprovecharse el protocolo NTP, que nos permite acceder a distintos servidores disponibles en la red que nos brindan esa información. Sin embargo, si no tenemos conectividad debemos optar por otra solución, como un Reloj de Tiempo Real, como el que incluye el Shield para D1 Mini que veremos a continuación.

El RTC Shield

Como suele suceder con estas placas, es probable que nos encontremos con distintos modelos con la misma denominación. Ninguna está fabricada por Wemos, el diseñador original de la D1 mini sino que pertenecen a distintos fabricantes. En este artículo emplearé una que incluye sólo el RTC (hay otra placa que además tiene una memoria EEPROM) que aparentemente fue diseñada y comercializada por la empresa Robotdyn.

Fig. 1. Ambos lados del RTC shield con la batería montada

El esquemático de la shield es el siguiente

Fig. 2. Esquemático (fuente: robotdyn.com)

El shield contiene el circuito integrado DS1307, que es un tanto antiguo. Este chip es capaz de mantener la fecha y hora con un consumo muy bajo, alimentado por un batería como la CR1220 que permite que el reloj siga funcionando aunque desconectemos la placa de su alimentación.

La conexión con la D1 mini se realiza empleando el bus I2C a través de los pines 5 (SCL) y 4 (SDA). La dirección del RTC en el bus I2C está fijada en 0x68.

El Programa

Para acceder a la información de fecha y hora del DS1307 a bordo del shield podemos escribir nuestro propio código que lea sus registros internos empleando I2C o podemos emplear una librería que ya resuelva el problema. Optaremos por esta segunda alternativa, utilizando un código desarrollado por Mike Causer, de cuyo trabajo ya hemos echado mano en otras oportunidades.

Preparando la librería

Esta librería puede encontrarse en este repositorio. Como pueden ver está escrito para una placa que contiene un chip DS1307 y una memoria EEPROM pero cada una de las librerías está escrita por separado, así que usaremos sólo la que nos hace falta.

Como primer paso descargamos el código del repositorio:

Fig. 3. Descargando del repositorio

Luego abrimos el archivo comprimido que hemos descargado y extraemos ds1307.py

Fig. 4. Archivos descargados

Finalmente abrimos este archivo en Thonny y lo guardamos en la memoria de la D1 mini.

Fig. 5. Librería copiada a la memoria dela D1 mini

Llegados a este punto ya podemos importar la librería y sus métodos a nuestro programa.

Primero probamos si la placa funciona correctamente escaneando el bus I2C:

import ds1307
from machine import I2C, Pin
from time import sleep

i2c = I2C (scl=Pin(5), sda=Pin(4), freq=400000)

while (True):
    print (i2c.scan())
    sleep (1)

Si en la consola vemos que detecta un dispositivo en la dirección 104 (0x68) es que todo funciona OK.

Métodos

La librería que hemos instalado contiene los siguientes métodos:


halt (valor): Prende, apaga o devuelve el estado del oscilador.

datetime (fecha_hora): Establece o devuelve la información de fecha y hora. Los datos forman una tupla con el siguiente formato: (año, mes, día, dia_semana, hora, minutos, segundos, décimas de segundo).

square_wave (sqw, out): Configura el funcionamiento de la salida SQW/OUT (pin 7 del DS1307) que no se utiliza en este shield.

Acceso al shield

Ahora hagamos el intento de leer la fecha y hora del shield con datetime usando el código de la imagen de mas abajo. Siempre devuelve lo mismo (1 de Enero del 2000) porque por omisión arranca con el oscilador detenido.

Prendemos el oscilador en la línea 9 y vemos que el tiempo avanza, pero la hora y fecha no son las correctas.

Para “poner en hora” el RTC debemos emplear nuevamente el método datetime. Una forma simple es cargar los datos a mano, como se ve en el siguiente ejemplo, que establece la fecha y hora al 21 de Noviembre de 2021 (domingo=7) a las 10:30:00 horas

import ds1307
from time import sleep
from machine import I2C, Pin

i2c = I2C (scl=Pin(5), sda=Pin(4), freq=400000)
reloj = ds1307.DS1307(i2c)

#Prender el oscilador
reloj.halt(False)

#Poner hora y fecha actual
ahora = (2021, 11, 21, 7, 10, 30, 0, 0)
reloj.datetime (ahora)

while (True):
    print (reloj.datetime())
    sleep (1)

Para comprobar que el RTC mantiene la hora con la batería, podemos desconectar el cable USB para que la D1 mini y el RTC queden sin alimentación y volver a conectar unos minutos después. En el programa comentamos la línea 13 que tiene la llamada a datetime, para no sobrescribir los datos actuales y comprobamos que la hora se ha mantenido durante la desconexión:

El RTC mantiene la hora luego de estar desconectado

Para no cargar los valores de fecha y hora de forma manual podemos aprovechar los métodos de la librería time, que expliqué en un artículo anterior, teniendo en cuenta que el formato de datos del método localtime es ligeramente diferente del que emplea datetime en la librería ds1307.

Conclusión

Vimos las características fundamentales del RTC shield para la D1 mini y como utilizarlo con un programa escrito en Micropython. Con esto seguramente podrán incluirlo en sus proyectos cuando sea necesario contar con información de fecha y hora de manera permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias