Reloj en tiempo real DS3231 con comunicaciones I2C

publicado en: Portada | 10

Un dispositivo microcontrolado es capaz de realizar un control del tiempo muy preciso, especialmente a escala humana pero, mantenerlo «en hora» y por tanto funcionando, es muy costoso en términos de consumo, así que es habitual disponer en un circuito que necesite la hora real un componente capaz de realizar esta tarea de manera autónoma y que se mantenga con un consumo muy bajo para poder alimentarlo con una pequeña batería durante mucho tiempo. A estos dispositivos se los denomina relojes en tiempo real (RTC, por las siglas de Real-Time Clock)

El funcionamiento externo, es decir, de cara al usuario (o al circuito) de los relojes en tiempo real el muy similar. Si además comparten comunicaciones, I2C es popular entre las populares, se puede generalizar bastante a la hora de describir su explotación.

Al igual que todos comparten un esquema de circuito de aplicación típica o una comunicación similar, también comparten un par de (relativos) inconvenientes. Por una parte, su precisión suele ser moderada, adecuada para un uso a escala humana pero que requiere calibración para mantenerse en unos valores aceptables. Un valor característico suele estar entorno a las ±5 partes por millón (ppm) que, muy aproximadamente, puede corresponder con ±5 minutos al año; admisible si se establece un protocolo de sincronización. El inconveniente es que la precisión desciende bruscamente en función de las variaciones de temperatura y no es raro que se multiplique por 10 (o más) en determinadas circunstancias.

Como muchos otros componentes, los relojes en tiempo real necesitan un oscilador con el que funcionar (responsable de la precisión de la que antes hablaba) No es que disponer de un oscilador sea un inconveniente en sí mismo pero será otro componente que añadir al circuito que necesitará su espacio o, alternativamente, otro cálculo que hacer para mantener todo el circuito con cierta frecuencia de base.

Hay otros inconvenientes más obvios, como el consumo y por tanto la duración de la batería que mantiene la hora y la configuración, que por ser algo más universal (aunque irregularmente distribuido, lógicamente) suele considerarse en el diseño de los dispositivos que incorporan RTC y no es un problema específico.

El reloj en tiempo real que describo en este artículo, el DS3231, resuelve la necesidad de un oscilador externo y los inconvenientes de precisión usando uno interno y la tecnología de oscilador de cristal con compensación de temperatura (TCXO, por temperature-compensated crystal oscillator) Una tabla almacenada en la memoria interna del componente determina cómo compensar la hora en función de la temperatura y del tiempo de funcionamiento (la edad) del dispositivo. Con esta técnica, según la hoja de datos, se consigue una precisión de ±3.5 ppm en el rango de temperatura industrial, de -40°C a +85°C, o de ±2 ppm en el rango de temperatura comercial.

Normalmente, los relojes en tiempo real suelen incluir una pequeña memoria en la que almacenar cosas comunes en su uso, como un par de horas de alarma. Tampoco es raro necesitar más memoria para otras aplicaciones horarias algo más específicas, por lo que se suele añadir en las aplicaciones típicas o incluso internamente en algunas versiones de los integrados. Por ejemplo, el DS3232 es igual que el DS3231 que nos ocupa pero con 236 bytes SRAM que también se mantienen, como la fecha y la hora, con la batería de respaldo del dispositivo.

Decía al principio que la comunicación entre circuitos (I2C, por Inter-Integrated Circuit) es de las más populares y más frecuentemente presentes, aunque también es cierto que en determinados montajes las comunicaciones SPI (Serial Peripheral Interface) pueden ser mejor alternativa; en tales casos existen versiones equivalentes, por ejemplo el DS3234 con respecto al DS3231, que sustituyen I2C por SPI.

Al medir la temperatura para compensar el funcionamiento del RTC, este dispositivo puede usarse también como un termómetro dentro del propio montaje. Aunque los valores que devuelve se presentan en intervalos de un cuarto de grado, su precisión no es muy buena, ±3°C según la hoja de datos. Teniendo en cuenta que la temperatura se va a medir en la placa del circuito, junto a componentes calentándose sin mucho control, esta medida es suficiente en muchos casos, sobre todo si lo que interesa es medir tendencia y no sólo temperatura exacta en un instante. Por otra parte, la temperatura siempre está disponible para ser consultada pero se lee de un registro que se actualiza solamente cada 64 segundos, suficiente para mostrar una evolución a lo largo de un periodo largo, insuficiente para saber la temperatura de un instante.

Pinout del RTC DS3231

pinout del reloj en tiempo real RTC DS3231

Circuito típico de uso del RTC DS3231

circuito de aplicación para el reloj en tiempo real DS3231

Víctor Ventura

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

Más entradas - Página web

Sígueme:
TwitterLinkedIn

Seguir Víctor Ventura:

Programador multimedia y web + IoT. Mejor con software libre.

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

10 Respuestas

  1. David S.M.

    Hola victor!!
    Mira,tengo un rtc ds3231 y un tm1637 (4 digitos 7 segmentos).
    He leido tus articulos sobre los dos productos,porque quiero que el modulo de 4 digitos muestre la hora del rtc.
    Soy incapaz de combinarlos para que funcione juntos.
    El rtc lo muestro bien en el monitor serial,y lo hago tmbien en una lcd,pero no se como complementarlo en el modulo tm1637.
    Me ayudas con el codigo?Gracias de antemano.

    • Víctor Ventura

      Hola, David.

      No que hacer nada especial para que el DS3231 y el TM1637 funcionen juntos. Un ejemplo que usa ambas para mostrar los minutos y los segundos quedaría así:

      Espero que esto te ayude. Gracias por visitar polaridad.es

  2. David S.M.

    Gracias Víctor por la rápida respuesta,asi tambienpuedo cambiarlo para que muestre las horas y los minutos,y como bien explcaste en el apartado del TM1637,admite 6 digitos,asi que añado dos mas y muestro los segundos.
    Gracias.

  3. Carlos

    Hola Víctor!!!
    Estoy intentando encontrar un código para Esp8266 con el que controlar un relé activado con una programación horaria atraves de un DS3231.
    Me podrías orientar??
    Gracias por adelantado.

    • Víctor Ventura

      Hola, Carlos.

      Si lo que quieres es un código ya hecho, no creo que tengas problema en encontrarlo en la web con tu buscador favorito. Ahora mismo no me viene a la memoria ninguno que recomendarte.

      Si lo que quieres es hacerlo tú mismo, ① activar o desactivar el relé se hace poniendo a nivel alto o bajo una salida digital, ② en polaridad.es puedes encontrar varios artículos sobre el RTC DS3231 y ③ si quieres que el MCU sea un ESP8266 tienes un artículo para programar el MCU ESP8266 desde el IDE de Arduino, por ejemplo; aunque no me queda muy claro porqué usar este microcontrolador, diseñado para comunicaciones wifi

      Si te sirve una solución hardware (¿Para qué es el ESP8266, si el dispositivo tiene una programación horaria?) hay programadores baratísimos y muy precisos, que además almacenan la fecha y la hora con una batería que hasta podría recargarse con la alimentación que gestiona.

      Saludos y gracias por visitar polaridad.es

      • Carlos

        Hola Víctor!!
        Gracias por molestarte en responder.
        Lo que pretendo es que atraves de una app pueda activar una programación horaria que encienda y apague una luz de casa gracias a un relé. Es decir me voy de vacaciones y activo la programación.
        Se hacerlo con un arduino mini con un ds3231 conectado, pero con modulo esp8266-07, he leído que tiene una librería específica de un tal Makuna y no se adaptar el código.
        De todas formas te agradezco mucho tu atención.
        Un saludo.

  4. Federico

    Hola Víctor,
    Muchas gracias por tu dedicación en documentar tu experiencia.
    Mi consulta es:
    Estoy haciendo un datalogger con una placa LilyPad + módulo De + RTC DS3231.
    Con la función lowpower y apagando el módulo SD he disminuido bastante los consumos, pero más del 70% del consumo se lo lleva el DS3231.
    Si mantuviera sin alimentación el Ds3231 y sólo lo encendiera a la hora de tomar las medidas y guardar en SD, cuánto tiempo me duraría la batería CR2032? O sea, sin alimentación, cuánto dura la batería de litio?
    Muchas gracias, Federico desde Mendoza, Argentina.

    • Víctor Ventura

      Hola, Federico.

      Disculpa el retraso en responder, quería poder decirte algo útil y he tratado de verificar lo que necesitas, pero al final no tengo nada concluyente y por poco hasta me olvido.

      En primer lugar, me parecía muy raro que el DS3231 te consuma mucho. Solamente la lectura de la temperatura (y doy por hecho que no es tu caso) es un poco más exigente y aún así es solo algo más de medio miliamperio. Los consumos sin leer nada (sin usar el bus I2C) son como la cuarta parte de eso.

      En realidad, esa es la información «oficial», no he podido medirlo en los montajes en los que yo lo he usado. Los circuitos en los que he integrado el componente no me servían para medirlo porque no tienen una alimentación (batería) separada ya que usando una única LiPo resolvía toda la alimentación y resultaba muy barato y de diseño más simple.

      Para las pruebas suelo utilizar algún módulo comercial que soporte el componente que voy a usar (el DS3231, en este caso) o lo fabrico si no existe o necesito una configuración rara (esto ocurre una entre mil veces). Como los módulos con el DS3231 incluyen su sistema de alimentación y batería de soporte, pensé en tomar medidas unas horas para poder extrapolar y recordé que ya había hecho alguna prueba.

      Este es el punto que, por desgracia, que te puede ayudar. Si has utilizado un módulo como el que me sirvió para escribir algunos de los primeros artículos sobre el DS3231 resulta que el problema puede estar ahí, no en el RTC, porque parece que tienen un problema de diseño y/o de fabricación que descarga la batería consumiéndola como si no hubiera un mañana. Algo que debería durar meses se gasta en unos pocos días.

      En su momento lo investigué, lo descubrí (me suena que hasta vi una forma viable de resolverlo) y lo olvidé porque, en realidad, no lo necesitaba al usar el módulo solo en pruebas 🙁 No me resisto a encontrarlo y además puede ser útil para otros lectores pero, como te decía antes, prefiero no retrasar más la respuesta. Si recuerdo o encuentro una solución razonablemente práctica, la publicaré por si todavía ayuda.

      Entre tanto, te recomiendo que pruebes a trabajar con un módulo de otro tipo/fabricante o mucho mejor, si puedes, uses directamente el DS3231.

      Suerte con tu proyecto y gracias por participar en polaridad.es

  5. Gustavo A Paez

    Hola Victor, te saludo desde Bucaramanga.

    Tengo una inquietud, quisiera saber como puedo guardar datos en la memoria que trae este modulo de arduino el DS3231, seria para guardar el dato de un sensor cada cierto tiempo.

    Gracias

  6. Stefany

    Hola Victor, Un saludo.

    Quería hacerte una consulta, es posible saber el estado de la batería? es decir.. Una rutina que permita saber si la batería externa ya no esta arrojando los valores de voltaje deseados..

    Gracias!
    Feliz Día.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *