31/07/2024
En el vasto universo de la electrónica y la programación, la capacidad de gestionar el tiempo es crucial para una infinidad de proyectos. Desde simples relojes hasta complejos sistemas de automatización o registro de datos, saber la hora y la fecha exactas puede marcar la diferencia. Si alguna vez te has preguntado cómo tu placa Arduino puede llevar un registro preciso del tiempo sin recurrir a cálculos tediosos, ¡has llegado al lugar correcto! En este artículo, exploraremos dos métodos principales para incorporar la funcionalidad de tiempo en tus proyectos Arduino: la versátil librería Time y los confiables módulos de Reloj en Tiempo Real (RTC).

Ambos enfoques tienen sus propias ventajas y limitaciones, y comprenderlos te permitirá elegir la solución más adecuada para tus necesidades. Prepárate para desentrañar los secretos de la medición del tiempo con Arduino y llevar tus creaciones al siguiente nivel.
- La Librería Time: Gestión de Tiempo por Software
- Módulos RTC: La Solución de Hardware para el Tiempo Real
- Comparación: Librería Time vs. Módulos RTC
- Preguntas Frecuentes sobre el Tiempo en Arduino
- ¿Por qué mi reloj Arduino pierde la hora cada vez que lo desconecto?
- ¿Es la librería Time.h una librería oficial de Arduino?
- ¿Qué diferencia hay entre los módulos RTC DS1307 y DS3231?
- ¿Necesito conexión a Internet para que el RTC mantenga la hora?
- ¿Puedo usar la librería Time para manejar fechas anteriores al 1 de enero de 1970?
- Conclusión
La Librería Time: Gestión de Tiempo por Software
La librería Time, aunque desarrollada por Arduino, no siempre viene preinstalada con el IDE. Sin embargo, su instalación es un proceso estándar y sencillo que te abrirá las puertas a una gestión de tiempo por software sorprendentemente eficaz. Esta librería simplifica enormemente la manipulación de fechas y horas, liberándote de la necesidad de realizar conversiones y cálculos complejos.
Entendiendo la Base de la Librería Time
El corazón de la librería Time reside en un tipo especial de variable: time_t. Esta variable de 32 bits es la encargada de almacenar el tiempo de una manera muy particular y eficiente. Su principio de funcionamiento se basa en el estándar de tiempo Unix, que registra los segundos transcurridos desde el 1 de enero de 1970 (la 'Época Unix') hasta el momento actual. Este método es el mismo que utilizan muchos sistemas operativos basados en Linux, lo que garantiza una compatibilidad y una lógica de funcionamiento bien establecida.
La principal ventaja de este enfoque es su simplicidad. Al convertir la fecha y la hora en un único número de segundos, podemos realizar operaciones aritméticas (suma y resta) con gran facilidad. Por ejemplo, si deseas saber la fecha exacta una semana después de un evento, simplemente sumas los segundos equivalentes a una semana al valor time_t original, y la librería se encargará de todas las conversiones necesarias para mostrarte la nueva fecha y hora. La librería maneja estas conversiones de forma automática, permitiéndote operar libremente con el tiempo como si fuera un número entero.
Sin embargo, es importante ser consciente de una limitación clave: la librería Time no puede trabajar con fechas anteriores al 1 de enero de 1970, ya que su punto de partida es esa fecha.
Primeros Pasos con la Librería Time
Para comenzar a utilizar la librería, el primer paso es establecer una fecha y hora inicial desde la cual tu programa comenzará a contar. Esto se logra con la función setTime():
// Formato: hora, minutos, segundos, días, mes, año setTime(19, 28, 50, 20, 10, 2015);Luego, para obtener la fecha y hora actual según el conteo de la librería, declaras una variable time_t y la igualas a la función now(). Esta función contendrá la fecha y hora que has insertado y que la librería está actualizando constantemente.
time_t t = now(); // Declaramos la variable time_t t y la inicializamos con la hora actualPrácticas y Ejemplos con la Librería Time
La mejor manera de asimilar estos conceptos es a través de la experimentación. A continuación, te mostraremos cómo representar la fecha y la hora en el monitor serial y cómo programar una alarma sencilla.
Imprimiendo Fecha y Hora en el Monitor Serial
Este código te permitirá ver cómo la librería Time actualiza y muestra la fecha y hora segundo a segundo:
#include <Time.h> // Incluimos la librería Time void setup() { Serial.begin(115200); // Inicializamos el puerto serie. // Anotamos la hora y la fecha desde la que nuestro programa empezará a contar. // Formato: hora, minutos, segundos, días, mes, año setTime(19, 28, 50, 20, 10, 2015); } void loop() { time_t t = now(); // Declaramos la variable time_t t y obtenemos la hora actual // Imprimimos la fecha y la hora Serial.print(day(t)); Serial.print("/"); Serial.print(month(t)); Serial.print("/"); Serial.print(year(t)); Serial.print(" "); Serial.print(hour(t)); Serial.print(":"); Serial.print(minute(t)); Serial.print(":"); Serial.println(second(t)); delay(1000); // Esperamos 1 segundo }Observarás que la hora aumenta segundo a segundo desde la fecha de inicio que le marcamos. Un ejercicio interesante es aumentar el tiempo del delay() (por ejemplo, a 3000 ms) y ver cómo el reloj sigue contando correctamente los segundos internamente, aunque solo los represente cada 3 segundos en el monitor serial. Esto demuestra que la librería mantiene el tiempo de forma continua, independientemente de la frecuencia de lectura.
Las funciones utilizadas para extraer los componentes de la fecha y hora de la variable time_t son:
hour(t): Devuelve la hora (0-23).minute(t): Devuelve los minutos (0-59).second(t): Devuelve los segundos (0-59).day(t): Devuelve el día del mes (1-31).month(t): Devuelve el mes (1-12).year(t): Devuelve el año.
Programando una Alarma Sencilla
Ahora, programemos una alarma que se active a una hora específica, por ejemplo, a las 19:30. En este caso, simplemente mostraremos un mensaje en el monitor serial, pero podrías activar cualquier salida digital (un LED, un zumbador, un relé, etc.).
#include <Time.h> // Incluimos la librería Time void setup() { Serial.begin(115200); // Inicializamos el puerto serie. // Anotamos la hora y la fecha desde la que nuestro programa empezará a contar. // Formato: hora, minutos, segundos, días, mes, año setTime(19, 28, 50, 20, 10, 2015); } void loop() { time_t t = now(); // Declaramos la variable time_t t y obtenemos la hora actual // Imprimimos la fecha y la hora (opcional, para seguimiento) Serial.print(day(t)); Serial.print("/"); Serial.print(month(t)); Serial.print("/"); Serial.print(year(t)); Serial.print(" "); Serial.print(hour(t)); Serial.print(":"); Serial.print(minute(t)); Serial.print(":"); Serial.println(second(t)); delay(1000); // Esperamos 1 segundo // Programamos la hora a la que la alarma se activará en este caso 19:30 if (hour(t) == 19 && minute(t) == 30) { Serial.println("Alarma Activada!"); // Aquí podrías añadir código para activar un LED, un zumbador, etc. } }Este ejemplo demuestra la facilidad con la que puedes tomar decisiones basadas en el tiempo con la librería Time. Es un punto de partida excelente para proyectos que requieran acciones programadas.
El Gran Inconveniente de la Gestión de Tiempo por Software
A pesar de sus ventajas, la librería Time tiene una limitación fundamental cuando se utiliza sin hardware adicional: no puede almacenar la hora y la fecha actual de forma persistente. Si tu placa Arduino se reinicia (ya sea por un botón de reset, una desconexión de energía o la carga de un nuevo programa), el reloj interno de la librería se reiniciará a la hora y fecha que le hayas establecido manualmente con setTime() en el setup(), o al 1 de enero de 1970 si no la has establecido. Esto significa que no es adecuada para construir un reloj en tiempo real que mantenga la hora precisa a lo largo del tiempo, incluso después de un corte de energía.
Existe una solución intermedia para el reinicio: utilizar las constantes de compilación del sketch, __DATE__ y __TIME__. Estas constantes capturan la fecha y hora en que el sketch fue compilado y cargado en la placa. Así, cada vez que cargas el sketch, el reloj se pondría en hora automáticamente con la hora de compilación. Sin embargo, esto no soluciona el problema de la pérdida de tiempo al desconectar la energía.
Para superar esta limitación, necesitamos recurrir a una solución de hardware: los módulos de Reloj en Tiempo Real (RTC).

Módulos RTC: La Solución de Hardware para el Tiempo Real
Cuando la precisión y la persistencia son primordiales, los módulos RTC, o Real Time Clock (Reloj en Tiempo Real), son la respuesta. Estos componentes son circuitos integrados diseñados específicamente para mantener la hora y la fecha con gran precisión, incluso cuando la alimentación principal está apagada. ¿Cómo lo logran? La mayoría de los RTC incorporan un oscilador de cristal (comúnmente de 32,768 kHz, similar a los relojes de cuarzo) y, lo que es más importante, una fuente de alimentación alternativa, como una pequeña batería de litio o un supercondensador, que les permite seguir contando el tiempo en segundo plano.
Componentes RTC Comunes: DS1307 y DS3231
Dentro de la amplia gama de módulos RTC compatibles con Arduino, dos se destacan por su popularidad y rendimiento: el DS1307 y el DS3231. Ambos se encuentran a menudo en módulos compactos (conocidos como Tiny RTC para el DS1307 y ZS-042 para el DS3231) que facilitan su conexión a Arduino.
DS1307 vs. DS3231: Precisión y Características
La principal diferencia entre estos dos módulos radica en su precisión:
- DS1307: Es un RTC funcional y económico. Sin embargo, su precisión puede verse afectada por las variaciones de temperatura. Puede desfasarse hasta 5 minutos al mes, lo cual es aceptable para muchos proyectos, pero no para aplicaciones que requieran una alta exactitud.
- DS3231: Es significativamente más preciso. Incorpora un oscilador de cristal compensado por temperatura (TCXO), lo que lo hace mucho menos susceptible a los cambios ambientales. Su desfase se mide en minutos al año, lo que lo convierte en la opción preferida para aplicaciones críticas.
Ambos módulos ofrecen funcionalidades adicionales más allá de la simple hora y fecha:
- Memoria EEPROM: Permiten almacenar pequeños bloques de datos de forma no volátil.
- Salida de Onda Cuadrada: Pueden generar una señal de reloj a varias frecuencias, útil para sincronizar otros componentes.
- Funciones de Alarma (DS3231): El DS3231, en particular, incluye dos alarmas programables, lo que lo convierte en un pequeño despertador electrónico por derecho propio.
Conexión de Módulos RTC con Arduino
La conexión de los módulos RTC a Arduino es notablemente sencilla, ya que ambos utilizan el bus de comunicación I2C (Inter-Integrated Circuit), que requiere solo dos pines de datos (SDA y SCL) además de la alimentación. Los pines específicos de tu placa Arduino dependerán del modelo:
- Arduino UNO, PRO MINI: SDA = A4, SCL = A5
- Arduino MEGA, DUE: SDA = 20, SCL = 21
- Arduino LEONARDO, YUN: SDA = 2, SCL = 3
- Arduino MKR1000: SDA = 11, SCL = 12
Asegúrate de conectar VCC a 5V (o 3.3V, según el módulo) y GND a GND.
Instalando la Librería RTClib
Para interactuar con los módulos RTC de forma sencilla, utilizaremos la librería RTClib de Adafruit, compatible con ambos DS1307 y DS3231. El método más fácil para instalarla es a través del Gestor de Librerías del IDE de Arduino:
- Ve a
Programa>Incluir Librería>Gestionar Librerías... - En la ventana del Gestor de Librerías, busca
RTClib. - Selecciona
RTClib by Adafruity haz clic enInstalar.
Una vez instalada, tendrás acceso a los ejemplos y a todas las funciones de la librería.
Programando con RTClib para tu Reloj RTC
La librería RTClib simplifica enormemente la lectura y configuración de los módulos RTC. Veamos un ejemplo básico para el DS3231, que es el más común y preciso:
// Librerías necesarias para la comunicación I2C y la RTClib #include <Wire.h> // Para la comunicación I2C #include <RTClib.h> // Para manejar el módulo RTC // Declaramos un objeto para nuestro RTC DS3231 RTC_DS3231 rtc; void setup () { Serial.begin(9600); // Inicializamos el monitor serial delay(3000); // Pequeña espera para que el serial se inicie correctamente // Comprobamos si el módulo RTC está conectado y funcionando if (! rtc.begin()) { Serial.println("Error: No se encontró un módulo RTC. Verifique las conexiones."); while (1); // Detenemos el programa si no hay RTC } // IMPORTANTE: Esta línea ajusta el RTC con la fecha y hora de compilación del sketch. // Solo debe ejecutarse UNA VEZ para poner el RTC en hora inicialmente. // Después de la primera carga y sincronización, COMENTA esta línea y vuelve a cargar el sketch. // Si no la comentas, el RTC se restablecerá a la hora de compilación cada vez que reinicies el Arduino. // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ejemplo para establecer una fecha y hora manual específica: // rtc.adjust(DateTime(2023, 12, 25, 10, 30, 0)); // Año, Mes, Día, Hora, Minuto, Segundo } void loop () { // Obtenemos la fecha y hora actual del RTC DateTime now = rtc.now(); // Imprimimos la fecha y hora en el monitor serial Serial.print(now.day()); Serial.print('/'); Serial.print(now.month()); Serial.print('/'); Serial.print(now.year()); Serial.print(" "); Serial.print(now.hour()); Serial.print(':'); Serial.print(now.minute()); Serial.print(':'); Serial.print(now.second()); Serial.println(); delay(1000); // Esperamos 1 segundo antes de la próxima lectura }Analicemos las partes clave de este código:
- Importar Librerías: Se incluyen
Wire.hpara la comunicación I2C yRTClib.hpara las funciones del RTC. - Declarar Objeto RTC:
RTC_DS3231 rtc;crea una instancia del RTC, permitiéndonos interactuar con él. - Función
setup():Serial.begin(9600);: Inicia la comunicación serial.if (! rtc.begin()) { ... }: Comprueba la conexión y el funcionamiento del RTC. Es fundamental para asegurar que el módulo esté presente y respondiendo.rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));: Esta es la línea más importante para la sincronización inicial.__DATE__y__TIME__son macros predefinidas por el compilador que representan la fecha y hora en que el sketch fue compilado. Al pasar estos valores artc.adjust(), el RTC se pone en hora con la hora del PC en el momento de la compilación. ¡Recuerda comentar esta línea después de la primera carga y sincronización para evitar que el RTC se reinicie cada vez que el Arduino se encienda!
- Función
loop():DateTime now = rtc.now();: Esta función clave obtiene la fecha y hora actuales del RTC y las almacena en un objetoDateTime.- Los métodos del objeto
DateTime(now.day(),now.month(),now.year(),now.hour(),now.minute(),now.second()) permiten acceder individualmente a los componentes de la fecha y hora para imprimirlos o utilizarlos en tu lógica de programa.
Precauciones al Trabajar con RTC y Arduino
Al igual que con cualquier componente electrónico, es importante tener en cuenta algunas precauciones:
- Sincronización Inicial: La línea
rtc.adjust()solo debe ejecutarse una vez para poner en hora el RTC. Si la dejas descomentada, cada vez que el Arduino se reinicie, el RTC volverá a la fecha y hora de compilación del sketch, perdiendo el tiempo transcurrido desde la última vez que estuvo encendido. - Consumo de Energía: Aunque los RTC son eficientes, consumen una pequeña cantidad de energía, especialmente el DS3231, que puede ir de 100 μA a 650 μA dependiendo de la configuración. La duración de la batería de respaldo es finita; es bueno estar atento a su posible agotamiento, lo que llevaría a la pérdida de la hora si la alimentación principal falla.
Comparación: Librería Time vs. Módulos RTC
Para ayudarte a decidir qué método es el más adecuado para tu proyecto, aquí tienes una tabla comparativa:
| Característica | Librería Time (Software) | Módulos RTC (Hardware) |
|---|---|---|
| Persistencia (tras reinicio/corte energía) | No persistente, se reinicia a la hora configurada o 1970/01/01 | Persistente, mantiene la hora con batería de respaldo |
| Precisión | Depende de la precisión del oscilador interno de Arduino, puede desviarse significativamente | Alta precisión (especialmente DS3231), desfase mínimo |
| Material Adicional | Ninguno, solo Arduino | Módulo RTC (DS1307/DS3231), batería (incluida en muchos módulos), cables |
| Costo | Nulo (software) | Bajo (unos pocos euros/dólares) |
| Complejidad de Uso | Muy sencilla para operaciones básicas | Sencilla con librerías, requiere conexión I2C |
| Uso Recomendado | Proyectos donde la hora no necesita persistir (ej. temporizadores que se reinician con el dispositivo), cálculos de duración dentro de una sesión | Relojes, dataloggers, sistemas de alarma, proyectos que requieren hora y fecha precisas y persistentes |
| Funcionalidades Extra | Operaciones aritméticas de tiempo | Alarmas, memoria EEPROM, salida de onda cuadrada (DS3231) |
Preguntas Frecuentes sobre el Tiempo en Arduino
¿Por qué mi reloj Arduino pierde la hora cada vez que lo desconecto?
Esto ocurre si estás utilizando únicamente la librería Time (el método de software). La librería basa su conteo en el tiempo que la placa lleva encendida desde su último reinicio. Al desconectar la energía, el Arduino se apaga y el conteo se pierde. Para mantener la hora de forma persistente, necesitas un módulo RTC (Real Time Clock), que tiene su propia batería para seguir contando el tiempo incluso sin alimentación externa.
¿Es la librería Time.h una librería oficial de Arduino?
Sí, la librería Time fue desarrollada por Arduino. Aunque no siempre viene preinstalada por defecto en todas las versiones del IDE, se considera una librería estándar y recomendada para la gestión de tiempo por software.
¿Qué diferencia hay entre los módulos RTC DS1307 y DS3231?
La principal diferencia es la precisión. El DS3231 es mucho más preciso que el DS1307 debido a que incorpora un oscilador de cristal compensado por temperatura (TCXO), lo que lo hace menos sensible a las variaciones térmicas. El DS1307 puede desfasarse varios minutos al mes, mientras que el DS3231 apenas se desvía unos minutos al año. Además, el DS3231 suele tener funciones de alarma y un sensor de temperatura incorporado.
¿Necesito conexión a Internet para que el RTC mantenga la hora?
No, los módulos RTC (como el DS1307 o DS3231) son dispositivos autónomos que mantienen la hora gracias a su propio oscilador de cristal y una batería de respaldo. No necesitan conexión a Internet para funcionar una vez que se han puesto en hora inicialmente. La conexión a Internet solo sería necesaria si quisieras sincronizar tu RTC con un servidor de tiempo (NTP) para una precisión extrema, pero no es un requisito para su funcionamiento básico.
¿Puedo usar la librería Time para manejar fechas anteriores al 1 de enero de 1970?
No, la librería Time, al igual que el estándar de tiempo Unix en el que se basa, utiliza el 1 de enero de 1970 como su punto de partida ('Época Unix'). Por lo tanto, no puede representar ni operar con fechas anteriores a esa.
Conclusión
Como hemos explorado, la gestión del tiempo en tus proyectos Arduino es un aspecto fundamental que puede abordarse de dos maneras principales: mediante la librería Time para soluciones de software o a través de módulos RTC para una persistencia y precisión superiores. La elección entre uno y otro dependerá enteramente de los requisitos de tu proyecto.
Si tu aplicación solo necesita un temporizador que se reinicia con el dispositivo, o si la pérdida de hora tras un corte de energía no es crítica, la librería Time es una solución sencilla y elegante. Es ideal para aprender y para prototipos rápidos donde la precisión a largo plazo no es una preocupación principal.
Por otro lado, si estás construyendo un reloj, un sistema de registro de datos (datalogger) que necesita estampar la hora de eventos, o cualquier dispositivo que deba mantener la hora precisa incluso después de un reinicio o una desconexión de energía, un módulo RTC es indispensable. La inversión en un DS3231, en particular, te brindará una precisión asombrosa y una gran tranquilidad.
Dominar estas herramientas te abrirá un abanico de posibilidades para crear proyectos Arduino más inteligentes y funcionales, capaces de interactuar con el mundo real de una manera más consciente del tiempo.
Si quieres conocer otros artículos parecidos a Dominando el Tiempo en Arduino: Librería Time y RTC puedes visitar la categoría Librerías.
