En esta ocasión te vamos a enseñar como realizar la programación de eventos con arduino, o dicho de otra forma: como podemos programar el arduino para ejecutar determinadas funciones en una hora/fecha determinadas. La información de fecha / hora actual proviene de un circuito integrado RTC (Real Time Clock) DS1307. Un RTC está especialmente diseñado para mantener la información horaria, aún cuando nuestro arduino se encuentre sin alimentación. Esto es fantástico en aplicaciones del mundo real, donde no siempre se puede confiar en el suministro de energía eléctrica.
Imaginemos por un momento que deseamos encender una lampara con arduino a una hora determinada. ¿Como podemos decirle al arduino que deseamos hacer esto? ¿Como implementamos un programa genérico para realizar cualquier acción con nuestro arduino a una hora / fecha determinada? En este tutorial te explicamos como puedes hacer precisamente eso: Temporizar cualquier acción con arduino para que sea llevada a cabo según la programación de horario elegida.
En nuestra foto de portada vemos nuestro laboratorio de domótica con arduino, que estaremos usando durante este tutorial, en conjunto con un arduino UNO y el RTC DS1307.
Conexión y uso de un RTC con Arduino.
En otra entrada anterior hemos tratado ya como realizar la conexión del RTC DS1307 con Arduino, así como su funcionamiento básico. Vamos a colocar aquí la imagen de la conexión como referencia. Para saber como podemos leer y escribir el RTC, así como más detalles de su funcionamiento, recomendamos leer nuestro tutorial referente a este tema.
Una vez que tengamos nuestro arduino funcionando con el RTC y hayamos programado la hora y fecha actual dentro de este, podemos seguir con el resto de este tutorial.
Librerías para Programación de Eventos con Arduino.
Como ya sabemos, la plataforma arduino tiene un buen número de librerías que nos facilitan bastante algunas tareas, pues la lógica ya ha sido implementada y solamente debemos conocer el API de dichas librerías para acceder a su funcionalidad. En este caso, estaremos trabajando con la librería de gestión de eventos y horarios conocida como “TimeAlarms”. Mediante esta librería podemos programar la ejecución de determinadas funciones en una fecha y hora específica. La librería “TimeAlarms” depende de la librería “Time” para conocer la fecha/hora actual, por lo que también debe ser instalada. Finalmente para la interfaz con el reloj en tiempo real utilizaremos la librería DS1307RTC.
A continuación dejamos los enlaces para descargar las librerías requeridas:
La siguiente es la explicación de que hace cada una de las librerías:
- Time: Funciona como un reloj en tiempo real por software que lleva la cuenta del tiempo usando el CPU de arduino. Funciona llevando un conteo del número de segundos desde segundos transcurridos desde la medianoche UTC del 1 de enero de 1970 (timestamp de Unix). Este conteo se pierde al apagar el arduino, por lo que NO funciona como base de tiempo confiable sin energía eléctrica.
- TimeAlarms: Es la encargada de la programación de eventos utilizando la hora/fecha (unix) provista por la librería Time. Esta librería asocia las funciones declaradas dentro del sketch de arduino a un evento que ocurre en una hora/fecha determinada.
- DS1307RTC: Se encarga de la comunicación con el RTC DS1307 o DS3231 para obtener el tiempo actual y mantener la precisión a largo plazo, esta librería proporciona la base de tiempo permanente para ser usado por la librería “Time” y “TimeAlarms”
Programa para temporizador con arduino
Con todo esto ya instalado en nuestro IDE podemos comenzar con nuestro primer sketch que permite realizar la programación de eventos con Arduino. En este programa buscamos hacer lo siguiente: Hacer que todos los días a las 14:00, 14:05, 14:10 se ejecute una función elegida por nosotros que imprime un texto al monitor serial de arduino. El código de nuestro sketch queda de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /** GeekFactory - "Construye tu propia tecnologia" Distribucion de materiales para el desarrollo e innovacion tecnologica www.geekfactory.mx Ejemplo de Programación de Eventos con Arduino con las librerias Time y TimeAlarms en este programa, la hora se configura en el inicio del arduino y solamente se utiliza el CPU de arduino para llevar el conteo del tiempo, en este ejemplo NO se utiliza el reloj en tiempo real externo. */ #include <Time.h> #include <TimeAlarms.h> void setup() { Serial.begin(9600); // Configurar la fecha / hora manualmente cada vez que se reinicia el arduino // Configurar al lunes 22 de agosto de 2016 a las 13:59:50 setTime(13, 59, 50, 22, 8, 16); // Crear las alarmas y configurar las funciones correspondientes a cada una Alarm.alarmRepeat(14, 0, 0, Alarma1400); // Evento a las 14:00 diario Alarm.alarmRepeat(14, 5, 0, Alarma1405); // Evento a las 14:05 diario Alarm.alarmRepeat(14, 10, 0, Alarma1410); // Evento a las 14:10 diario } void loop() { // Mostrar el reloj en el monitor serial digitalClockDisplay(); // Esperar 1 segundo y procesar las Alarmas mientras tanto... Alarm.delay(1000); } void Alarma1400() { Serial.println("Evento de las 14:00:00"); } void Alarma1405() { Serial.println("Evento de las 14:05:00"); } void Alarma1410() { Serial.println("Evento de las 14:10:00"); } /** Funciones para la impresion del reloj al monitor serial de arduino */ void digitalClockDisplay() { Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.println(); } void printDigits(int digits) { Serial.print(":"); if (digits < 10) Serial.print('0'); Serial.print(digits); } |
Este programa aún no utiliza la fecha / hora proveniente del RTC, en cambio configura una fecha/hora conveniente al arrancar el arduino, pero podemos configurar la librería Time para que haga uso del RTC de una manera muy sencilla. El siguiente programa que realizaremos pretende ser un ejemplo de una aplicación real con el RTC y la librería TimeAlarms, por lo que será necesario que pongamos a tiempo el reloj antes de intentarlo. Si deseamos encender una lámpara realmente en nuestra casa será necesario conectar una tarjeta de relevadores al arduino, como lo haremos en el siguiente ejemplo.
Programación del horario de una lámpara con arduino
Ahora que ya conocemos el funcionamiento de la librería TimeAlarms vayamos con un ejemplo práctico de algo que se requiere de manera cotidiana: Prender una luz a una hora determinada y apagarla en otro momento. Usando nuestra librería de TimeAlarms creamos un par de funciones que se encargarán de apagar o encender la luz en el momento oportuno. En la parte de hardware utilizamos un módulo de relevador que controla la carga de corriente alterna. El montaje de nuestro circuito se observa de la siguiente forma, incluyendo la parte de control de corriente alterna:
Esta imagen muestra más de cerca el detalle de las conexiones al arduino:
Nosotros estamos utilizando nuestro kit de laboratorio para domótica, que está diseñado para simplificar en gran medida la parte de la conexión de dispositivos de corriente alterna. Nos ahorra tener que cablear la parte de alterna cada vez que deseamos experimentar, además de permitir un mejor manejo de la corriente alterna que pudiera ser peligrosa. El sketch completo que controla el encendido de una luz en el momento deseado es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /** GeekFactory - "Construye tu propia tecnologia" Distribucion de materiales para el desarrollo e innovacion tecnologica www.geekfactory.mx Ejemplo de Programación de Eventos con Arduino con las librerias Time y TimeAlarms. En este programa se utiliza el RTC para obtener la fecha y hora actual, por lo que el RTC debe tener una fecha/hora válida para poder correr este programa. Las conexiones de SDA y SCL deben estar correctamente realizadas. Se activará el relevador conectado en el pin 3 digital segun el horario indicado. */ #include <Time.h> #include <TimeAlarms.h> #include <DS1307RTC.h> void setup() { // Preparar la interfaz serial Serial.begin(9600); // Configurar los pines de salida de relevadores desactivados al inicio // recordamos que los modulos de reles se activan con un estado bajo pinMode(3, OUTPUT); digitalWrite(3, HIGH); pinMode(4,OUTPUT); digitalWrite(4, HIGH); // Cargar la hora actual desde el RTC e indicar que esto suceda de forma automática durante loop() // Utilizamos el método RTC.get() de la libreria DS1307RTC. El RTC debe estar conectado como se // indica en el texto y debe tener la fecha y hora correctas setSyncProvider(RTC.get); if (timeStatus() != timeSet) Serial.println("Fallo de RTC"); else Serial.println("Sincronizado con RTC"); // Crear las alarmas y configurar las funciones correspondientes a cada una Alarm.alarmRepeat(18, 0, 0, EventoEnciendeLuz); // Evento a las 18:00 diario (enciende luz) Alarm.alarmRepeat(7, 0, 0, EventoApagaLuz); // Evento a las 7:05 diario (apaga luz) } void loop() { // Mostrar el reloj en el monitor serial digitalClockDisplay(); // Esperar 1 segundo y procesar las Alarmas mientras tanto... // El metodo Alarm.delay() procesa en el fondo las alarmas y llamara a las funciones indicadas Alarm.delay(1000); } /** Funcion callback que activa el relevador en el pin 3 (enciende la luz) */ void EventoEnciendeLuz() { Serial.println("Encendiendo Luz!!!"); digitalWrite(3, LOW); } /** Funcion callback que desactiva el relevador en el pin 3 (apaga la luz) */ void EventoApagaLuz() { Serial.println("Apagando Luz!!!"); digitalWrite(3, HIGH); } /** Funciones para la impresion del reloj al monitor serial de arduino */ void digitalClockDisplay() { Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.println(); } void printDigits(int digits) { Serial.print(":"); if (digits < 10) Serial.print('0'); Serial.print(digits); } |
Está de más decir que este sketch puede ampliarse para soportar incluso varios canales o patrones más complejos. Por ejemplo podemos conectar más relevadores para controlar otras cargas, por ejemplo bombas para realizar riego, motores que controlen persianas, sirenas de alarma, etc. Como podemos observar la Programación de Eventos con Arduino mediante la librería TimeAlarms es muy sencilla, aún cuando utilizamos el RTC.
Palabras finales sobre la Programación de Eventos con Arduino.
La Programación de Eventos con Arduino es una de las tareas más básicas cuando deseamos llevar a cabo alguna automatización en el hogar, el trabajo o la industria. Con los ejemplos y librerías que mostramos en esta página, es posible crear un marco de trabajo que nos permita afrontar con mucha sencillez esta tarea. Además las librerías que hemos mostrado en esta página permiten obtener información de fecha/hora no solamente desde el RTC, sino desde otras fuentes también como un servidor NTP o un GPS, por lo que seguramente tienen cabida en muchísimas aplicaciones que requieren control de tiempo preciso a largo plazo.