Reloj con Arduino, cómo controlar los tiempos con un RTC Deja un comentario

Puede que en algún momento hayas necesitado conocer la hora dentro de un programa o sketch. Por ejemplo, si quieres hacer un reloj con Arduino y las tiras de led NeoPixel.

Básicamente lo podemos hacer de dos formas, con software, gracias a la librería Time.h, o por hardware, con los módulos DS1307 y el DS3231, relojes en tiempo real (RTC). En este artículo te voy a enseñar las dos formas de hacerlo.

Reloj con Arduino

Antes de comenzar vamos a ver que material utilizar para crear el reloj con Arduino.

Material necesario para crear un reloj con Arduino

Empecemos por el software. Lo único que nos hará falta será el entorno de desarrollo oficial, el recomendado para principiantes en la materia.

A nivel de hardware vamos a necesitar lo siguiente:

  • Arduino UNO (puede ser cualquier otro tipo de placa)
  • Módulo RTC (yo voy a utilizar el DS3231 aunque hay otros tipos como el DS1307)
  • Cables macho-hembra

Crear un reloj con Arduino por software

Lo primero que vamos a ver es cómo hacer un reloj con Arduino por Software. Lo haremos, como casi siempre, a través de una librería, en este caso Time.h.

Para instalar la librería, tenemos tres opciones. Buscar en el Gestor Librerías, Añadir Librería .ZIP o a través de la carpeta library. En el siguiente vídeo te enseño cómo hacerlo.

Una vez instalada ya podemos empezar a programar.

Añadir librería Time a nuestro programa

Es muy sencillo. Si no recuerdas o no sabes que es lo que tienes que incluir, Arduino te lo pone fácil. Solo tienes que ir a Programa>Incluir Librería>Time.

Añadir librería a sketch

Esto te añade el siguiente código.

Como ves, no solo añade la librería Time.h, también añade las dependencias necesarias para que todo funcione correctamente.

Reloj con Arduino, ejecutando las primeras funciones

Vamos a empezar a ejecutar las primeras funciones del reloj con Arduino. Algo muy sencillo, que nos diga la hora, los minutos y los segundos. El código que debes utilizar es el siguiente.

La primera parte del sketch es donde importamos las librerías que vamos a utilizar.

En la función setup() iniciamos el monitor serie para mostrar los datos.

En la función loop() hacemos uso de las siguientes funciones.

Devuelve la hora.

Devuelve los minutos.

Devuelve los segundos.

Devuelve el día del mes.

Devuelve el mes.

Devuelve el año.

El resultado obtenido a través del monitor serie es el siguiente.

Monitor serie reloj con Arduino

Aunque veas que pone 1 de enero de 1970, es correcto. No te creas que hemos cogido el DeLorean de Regreso al Futuro y hemos ido hacia atrás en el tiempo :). Ahora veremos que significa todo esto.

Poniendo en hora el reloj con Arduino

Ya has visto que es muy sencillo obtener la hora y la fecha con esta librería. Lo que ocurre es que está mal y debemos poner el reloj en hora.

Este tipo de librerías funcionan de esta manera. Suelen tener una hora y una fecha de referencia a partir de la cual se obtienen todos los datos. Es algo muy típico en otros lenguajes de programación.

Para ponerlo en hora solo tenemos que utilizar la función setTime(…). Esta función está sobrecargada lo que quiere decir es que se puede llamar de diferentes maneras, con más o menos parámetros y que devuelva un tipo de dato u otro.

La que nos interesa ahora es la que admite como parámetros la hora, los minutos, los segundos, el día, el mes y el año.

Si lo queremos poner en hora, solo tienes que poner esa información. Hagamos un ejemplo. Modifica el código anterior y establece la fecha y la hora en la función setup().

El resultado que vemos ahora a través del monitor serie es el siguiente.

Monitor serie reloj en hora con Arduino

Ahora si, ya estamos en la hora y la fecha correcta.

Obteniendo la fecha actual

Por último, vamos a ver cómo obtener la hora y fecha actual. Imagínate que quieres guardar la hora y fecha de cuándo ha sucedido un evento. Para ello debemos utilizar la función now().

Esta función devuelve un tipo de dato time_t, el cual podemos manejar con las funciones que hemos visto anteriormente.

En el siguiente ejemplo, vemos como guardar la hora y fecha actual para luego mostrarla por el monitor serie.

La diferencia entre utilizar una u otra, es que aquí estamos almacenando la información en una variable de un preciso instante.

El gran inconveniente del reloj con Arduino por Software

Como ya has podido comprobar, cuando hacemos un reset de la placa (ya sea a través del botón, desconectando de la alimentación o cargando un nuevo programa) nuestro reloj comienza la cuenta desde cero.

Si hemos establecido una hora manual, empieza desde esa hora. Si no la hemos establecido, empieza desde el 1/1/1970.

Precisamente este es el gran inconveniente de esta librería, no podemos almacenar la hora y fecha actual. No nos serviría para un reloj en tiempo real.

Existe una solución intermedia, utilizando la fecha y hora de cuándo el sketch se ha cargado a la placa. Esto son constantes que se almacenan en el propio sketch (las veremos en el reloj por hardware).

Lo único que nos solucionaría sería que al cargar el sketch, se pusiera en hora el reloj solo.

Pero no te preocupes, lo que no puede hacer el software, el hardware se ocupa. Ahora lo veremos a continuación.

Componente RTC para crear un reloj con Arduino

Lo primero que debemos saber es ¿qué es un RTC? RTC viene de las palabras en inglés Real Time Clock (Reloj en Tiempo Real). Como su nombre indica, sirve para tener un reloj en tiempo real, que no pierda la hora como nos ha ocurrido con la librería Time.h.

La mayoría de los RTC utilizan un oscilador de cristal, aunque algunos utilizan la frecuencia de la red. La frecuencia más común con la que funcionan estos dispositivos es de 32,768 kHz que, precisamente, es la misma que utilizan los relojes de cuarzo y otro tipos de relojes.

Normalmente, los RTC tienen una fuente de alimentación alternativa para mantener el facha y la hora. Esta fuente es la utilizada cuando la alimentación principal está apagada.

Hay dos alternativas a la hora de alimentar los RTC. La tradicional, con baterías de litio y la más novedosa, con supercondensadores.

El DS1307 y el DS3231, RTC para Arduino

Dentro de la amplia gama de RTC que hay para utilizar con Arduino, caben destacar estos dos componentes, el DS1307 y el DS3231. En el mercado los encontramos dentro de circuitos integrados. A todo el conjunto se le llama Tiny RTC si utiliza el DS1307 y ZS-042 si utiliza el DS3231.

DS1307 DS3231

La gran diferencia entre estos dos componentes es la precisión. El DS1307 funciona bastante bien, el problema es que las temperaturas extremas afectan a su precisión. Estamos hablando que puede desfasarse 5 minutos al mes.

Por el contrario, el DS3231 es mucho más preciso, ya que tiene un oscilador interno al que no le afectan tanto los cambios de temperatura. Puede llegar a tener un desfase de unos minutos al año.

Cualquiera de los dos módulos puede ser útil en nuestros proyectos.

Funcionalidades extra del DS1307 y el DS3231

Además de su función principal, reloj de tiempo real, estos componentes tienen una memoria EEPROM y la capacidad de generar una onda cuadrada de varias frecuencias. Esta puede servir como señal de reloj para otros componentes.

Como extra, el DS3231, posee unas funciones de alarma como si fuera un despertador.

Conexión del DS1307 y DS3231 con Arduino

La conexión es extremadamente sencilla ya que utilizan el bus I2C. Dependerá del tipo de Arduino que tengas. Te hago un resumen de los pines que puedes utilizar.

  • Arduino UNO, PRO MINI -> SDA = A4 y SCL = A5
  • Arduino MEGA, DUE -> SDA = 20 y SCL = 21
  • Arduino LEONARDO, YUN -> SDA = 2 y SCL = 3
  • Arduino MKR1000 -> SDA = 11 y SCL = 12

Donde SDA es la señal de datos y SCL es la señal de reloj.

A continuación te dejo los dos esquemas de conexionado para el DS1307 y el DS3231.

Tiny RTC ArduinoZS-042 ARDUINO

Instalar la librería RTClib para Arduino

Como no, gracias a una librería vamos a poder programar nuestro reloj con Arduino o RTC de una manera muy sencilla. Para este componente vamos a utilizar la librería RTClib que es compatible para los dos módulos, el Tiny RTC (DS1307) y el ZS-042 (DS3231).

Lo primero es instalarla, pero esta vez a través del gestor de librerías. Vete a Program>Incluir Librería>Gestionar Librerías
Gestor librerías

Cuando accedes a Gestionar Librerías, te aparece una nueva ventana. En esta ventana tienes que buscar RTClib.

Instarlar libreria

Te aparecerán varias opciones, selecciona la primera (RTClib by Adafruit) y le das a instalar. Este proceso hace lo mismo que si lo instalamos a través de un archivo .ZIP.

Ahora ya tienes acceso y puedes ver los ejemplos y hacer uso de la librería.

Utilizar la librería RTC para hacer un Reloj con Arduino

Ahora ya tenemos todo preparado para comenzar a programar con el RTC. Gracias a los ejemplos que suelen incluir estas librerías, el aprendizaje es relativamente sencillo, así que vamos a ver el ejemplo más básico que incluye. Así aprenderemos a programar con RTClib.

Lo encuentras en Archivo>Ejemplos>RTClib>ds3231.

Ejemplo ds3231 rtclib

Esto abre un código de ejemplo bastante extenso. Yo lo he reducido y me he quedado con las partes más importantes para poder ver qué es lo necesario.

A continuación vamos a ir viendo paso por paso qué es cada cosa.

RTC con Arduino, estudiando el código de ejemplo

El código que debes utilizar es el siguiente.

Importar librerías I2C, RTC y declarar objeto DS3231

En la primera parte añadimos las librerías Wire (para comunicación I2C) y RTClib (para controlar el módulo DS3231). Como vamos a utilizar el módulo DS3231, declaramos un objeto de este tipo.

Función setup

Lo primero es iniciar el monitor serie. Luego comprobamos que tengamos el RTC correctamente conectado y lo iniciamos.

La siguiente parte nos sirve para poner en hora el RTC. Esto es importante, siempre que no lo tengamos en hora, debemos utilizar la información del propio sketch para sincronizar la fecha y la hora.

Utilizamos las variables del sistema __DATE__ y __TIME__. Esto solo debemos hacerlo una vez, una vez que esté sincronizado, comentamos la línea de código y volvemos a cargar el sketch.

Función loop

En el loop, vamos a coger el tiempo actual con el método now() de la clase RTC_DS3231. Esto nos devuelve un tipo de dato DateTime.

Este tipo de dato tiene varios métodos que nos permiten acceder a la información.

  • now.day() -> devuelve el día del mes.
  • now.moth() -> devuelve el mes.
  • now.year() -> devuelve el año.
  • now.hour() -> devuelve la hora.
  • now.minute() -> devuelve los minutos.
  • now.second() -> devuelve los segundos.

Precauciones con el RTC y Arduino

Como todo componente eléctrico, tenemos que tener precauciones a la hora de trabajar con un RTC para hacer un reloj con Arduino.

La primera es mucho cuidad al sincronizar, no te olvides de comentar la línea de código y volver a cargar el sketch una vez esté sincronizado el RTC.

La segunda es el consumo de este componente. Según la hoja de características técnicas, consumirá un mínimo de 100 μA y un máximo de 650 μA. Dependerá la configuración. Debemos estar atento por si se acaba la pila.

Conclusión

Hacer un reloj con Arduino o RTC es relativamente sencillo tanto a nivel de software como a nivel de hardware. Debemos ser conscientes de las limitaciones de cada uno de los métodos y elegir el que más nos convenga.

Si no queremos perder la hora cuando se quede sin energía nuestro sistema, un RTC. Con el reloj con Arduino por software tenemos grandes posibilidades de que nuestro reloj se retrase.

Si te ha gustado el artículo, comparte por favor. Cualquier duda o sugerencia en los comentarios de este tutorial.

Gracias a Shutterstock por ceder los derechos de la imagen

 

Deja una respuesta

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

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

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?