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.
El esquemático de la shield es el siguiente
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:
Luego abrimos el archivo comprimido que hemos descargado y extraemos ds1307.py
Finalmente abrimos este archivo en Thonny y lo guardamos en la memoria de la 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:
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.