Librería de Arduino para consultar fecha y temperatura del integrado DS3231 por I2C

Librería de Arduino para consultar fecha y temperatura del integrado DS3231 por I2C

Librería de Arduino para consultar fecha y temperatura del integrado DS3231 por I2C

ACTUALIZADA: Visita también la nueva librería para gestionar fecha y hora con el módulo RTC DS3231 y Arduino con mejoras como la hora estacional.

El funcionamiento de los IC de relojes en tiempo real (RTC) más populares que se controlan utilizando el bus I2C suele ser muy similar. Además, la librería Wire de Arduino simplifica mucho las comunicaciones con dispositivos Two-wire Serial Interface (TWI), I2C, en concreto.

Tabla de contenidos

    A grandes rasgos, el proceso consiste en

    1. Iniciar las comunicaciones como esclavo (slave) o maestro (master, establecidas por defecto) con la función Wire.begin(dirección). Si se omite «dirección» se inician las comunicaciones siendo el μC el maestro del bus I2C.

    2. Activar la comunicación I2C con el dispositivo a través de la dirección de memoria en la que se encuentre, usando la orden Wire.beginTransmission(dirección).

    3. Escribir una orden en el bus I2C para indicar al dispositivo la operación que se desea que realice, usando Wire.write(orden), en la que «orden» es el código de la operacíon.

    4. Desactivar las comunicaciones para liberar el bus I2C con la función Wire.endTransmission().

    5. Solicitar al dispositivo el envío de cierta cantidad de datos que corresponden con la operación que se ha solicitado (en este caso, la fecha y la hora) con la función Wire.requestFrom(dirección,cantidad).

    6. Esperar a que estén disponibles para su lectura los datos solicitados con la función Wire.available(), que devuelve el número de datos que ya se han recibido y pueden leerse.

    7. Leer los datos enviados por el dispositivo (el reloj en tiempo real, en este caso) usando la función Wire.read() tantas veces como bytes indique Wire.available() que están disponibles.

    8. Normalmente los datos se envían en formatos muy compactos así que es muy probable que sea necesario interpretar los datos recibidos de manera que correspondan con la representación de los datos que se haga en el programa que usa el dispositivo.

    En lo que se refiere al DS3231 (y a los compatibles de la misma serie, como el DS3232) y a la interpretación de los datos, según las especificaciones del integrado, por ejemplo, los valores de los distintos dígitos que representan la hora se representan en decimal codificado en binario (BCD) que será más cómodo expresar como un valor decimal (un byte) para usarlo en Arduino

    En la misma línea, la temperatura se expresa como un byte en complemento a dos para la parte entera y dos bits para el paso, con una resolución de un cuarto de grado, de la parte decimal. En el código de la librería que se incluye a continuación se han comentado de forma exhaustiva estos y otros aspectos de la representación de los datos en el reloj DS3231

    Para consultar la temperatura con esta librería basta con usar el método leer_temperatura() del objeto DS3231 instanciado al empezar. Para leer la fecha y la hora en primer lugar se cargan y después se solicita en uno de los formatos (compacto, humano…) disponibles para distintos usos, documentados en el documento de cabecera de la librería del código de abajo.

    El siguiente es un código de ejemplo para mostrar cómo usar la librería. Como se decía más arriba, la temperatura se lee simplemente con la función leer_temperatura() del objeto de la clase DS3231 pero, para ignorar errores en la lectura, se utilizan dos constantes que almacenan, respectivamente, la temperatura máxima y mínima del dispositivo según la hoja de datos y que se leen con las funciones correspondientes.

    La lectura de la temperatura se realiza en dos tiempos: en primer lugar se carga el valor, con lo que diferentes usos de la fecha o la hora serán coherentes (no mostrarán un valor mayor en casos desfavorables) y en segundo lugar se usa conforme al formato que se necesite. En el programa de ejemplo (que no es muy práctico, aunque explica todas las posibilidades) se muestran todos los formatos disponibles

    • La función valor_fecha_hora() que devuelve un puntero a una matriz de char (bytes) que contiene los siete valores numéricos que representan la fecha y la hora en un reloj DS3231 convertidos a decimal (están en BCD en el dispositivo)

    • Usando la función numero_dia_semana() se obtiene un valor que corresponde con el número del día de la semana empezando en domingo. Para mostrarlo como texto se utiliza una matriz y se resta uno para empezar en el índice cero, domingo.

    • Para consultar la fecha en un formato «local» (español) se usa la función fecha_humana(), que entrega un puntero a una cadena en la que se representa la fecha en formato DD/MM/AAAA, siendo DD el día representado con 2 dígitos, MM el mes con 2 dígitos y AAAA el año con 4 dígitos.

    • La función hora_humana() devuelve la hora en el formato hh:mm:ss, siendo hh la hora (en formato de 24) representada con 2 dígitos, mm los minutos con 2 dígitos y ss los segundos con 2 dígitos.

    • Para usar fácilmente la fecha y la hora en archivos de registro (log) se ha programado la función fecha_hora_compacta(), que entrega el valor de la fecha y la hora en el formato AAMMDDhhmmss siendo AA el año representado con los 2 últimos dígitos, MM el mes con 2 dígitos, DD el día con 2 dígitos, hh la hora (en formato de 24) con 2 dígitos, mm los minutos con 2 dígitos y ss los segundos con 2 dígitos. Este formato, aún siendo de texto, ocupa poco y permite una ordenación alfabética muy sencilla.

    • La función fecha_hora_MySQL() sirve para presentar la fecha y la hora en el formato que usa el gestor de bases de datos MySQL (o la nueva y más libre MariaDB) AAAA-MM-DD hh:mm:ss, siendo AAAA el año representado con 4 dígitos, MM el mes con 2 dígitos, DD el día con 2 dígitos, hh la hora (en formato de 24) con 2 dígitos, mm los minutos con 2 dígitos y ss los segundos con 2 dígitos.

    Aunque son muchos formatos con los que representar la fecha y la hora, puede que no esté el que necesitas, pero seguro que basándote en alguno de los que hay y usándolo como ejemplo, será sencillo añadir un nuevo método conforme a otras especificaciones. Por favor, si añades nuevas funciones, comparte el código (¡libéralo!) y explícanos cómo funciona, así vamos haciendo mejor la librería poco a poco ¡Gracias!

    La salida del anterior programa de ejemplo podría ser algo parecido a lo que se muestra en la siguiente imagen: una lista de 7 valores (segundos, minutos, hora, día de la semana, día del mes, mes y año) la fecha y la hora expresadas de forma «humana» (según el estilo español) la hora como un número entero en el formato de los relojes de cuatro dígitos, la fecha y la hora en formato de la base de datos MySQL, la fecha y la hora en formato compacto (para logs) y la temperatura interna del DS3231.

    salida consola Arduino librería reloj tiempo real (RTC) y temperatura DS3231 por bus I2C

    Publicar comentario

    Puede que te hayas perdido