Ya vimos cómo usar un módulo RTC con Arduino, exactamente el reloj DS1307, ahora veremos en este artículo como usarlo en una aplicación más práctica y útil. Es algo muy sencillo y muy interesante, una alarma con Arduino que nos permitirá en una fecha y hora establecida encender, apagar, indicar…, cualquier cosa que nuestra imaginación nos permita. Esta alarma se podrá repetir cada día, hora, minuto y segundo por si necesitamos realizar algún proceso de manera periódico.
El programa, dispone también de un temporizador para resetear la alarma, de esta manera podremos establecer un inicio y un fin de un evento.
Índice de Contenido
Material necesario
- 1 Arduinos. (Comprar Arduino UNO o comprar Arduino MEGA)
- 1 Módulo DS1307. (Comprar RTC DS1307)
- Cables. (Comprar cables)
Artículos recomendados
Para poder seguir este artículo le recomendamos que vea antes Reloj RTC I2C con Arduino, artículo en el que se explica el funcionamiento básico del módulo RTC que usaremos.
Módulo Tiny RTC I2C.
Esquema eléctrico Arduino Mega.
Esquema gráfico Arduino Mega.
Código reloj alarma con Arduino
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; DateTime future = 0; // Variable para calcular cuando se debe desactivar la alarma // CONFIGURACIÓN DE USUARIO int seconds_alarm = 0; // Segundos alarma int minutes_alarm = 57; // Minutos alarma int hour_alarm = 18; // Horas alarma. Formato 24h int day_alarm = 9; // Dia alarma int month_alarm = 7; // Mes alarma int year_alarm = 2014; // Año alarma int weekday_alarm = 1; // Dia de la semana alarma. L(1), M(2), MX(3), J(4), V(5), S(6), D(7) int alarm_duration = 10; // Tiempo activo de la alarma. Debe ser menor que la próxima alarma. boolean all_seconds = false; // Alarma para todos los segundos boolean all_minutes = true; // Alarma para todos los minutos boolean all_hour = true; // Alarma para todas las horas boolean all_weekday = true; // Alarma para todos los dias de la semana boolean all_day = true; // Alarma para todos los dias boolean all_month = true; // Alarma para todos los meses boolean all_year = true; // Alarma para todos los años int LedPin = 13; // ------------- void setup () { Wire.begin(); // Inicia el puerto I2C RTC.begin(); // Inicia la comunicación con el RTC //RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora) pinMode(LedPin, OUTPUT); // Establece el pin LedPin como salida Serial.begin(9600); // Establece la velocidad de datos del puerto serie } void loop(){ DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC Serial.print(now.year(), DEC); // Año Serial.print('/'); Serial.print(now.month(), DEC); // Mes Serial.print('/'); Serial.print(now.day(), DEC); // Dia Serial.print(' '); Serial.print(now.hour(), DEC); // Horas Serial.print(':'); Serial.print(now.minute(), DEC); // Minutos Serial.print(':'); Serial.print(now.second(), DEC); // Segundos Serial.println(); if (year_alarm == now.year() || all_year ) { if (month_alarm == now.month() || all_month) { if (day_alarm == now.day() || all_day) { if (weekday_alarm == now.dayOfWeek() || all_weekday) { if (hour_alarm == now.hour() || all_hour) { if (minutes_alarm == now.minute() || all_minutes) { if (seconds_alarm == now.second() || all_seconds) { digitalWrite(LedPin, HIGH); future = now.unixtime() + alarm_duration; Serial.println("------------"); Serial.println("ALARMA"); Serial.println("------------"); } } } } } } } if (now.unixtime() >= future.unixtime() && digitalRead(LedPin)){ digitalWrite(LedPin, LOW); Serial.println("------------"); Serial.println("RESET ALARMA"); Serial.println("------------"); } delay(1000); // La información se actualiza cada 1 seg. }
Descripción del código reloj alarma con Arduino
Existen dos grupos de variables que el usuario deberá modificar según sus necesidades. Las variables xxx_alarm son empleadas para especificar en qué fecha y hora debe activarse la alarma, mientras que las variables booleanas all_xxx indican si es indiferente alguno de los datos de fecha o tiempo. Es decir, imaginemos que seconds_alarm= 0 y all_xxx = true excepto all_seconds= false. Con esta configuración, la alarma se activará cuando el reloj esté en 0 segundos, para todos los minutos, horas, días de la semana, días, meses y años.
Un segundo ejemplo seria, hour_alarm=12, weekday_alarm=1 y all_xxx = true excepto all_weekday = false, all_hour = false. De esta manera, la alarma se activará todos los lunes a las 12 horas.
La comprobación de la fecha se hace de manera escalonada mediante el anidado de sentencias if, desde años hasta segundos, de tal forma que si la fecha /tiempo actual no cumple con un parámetro de la fecha/tiempo configurada para activar la alarma, el programa no seguirá comprobando el siguiente. Por ejemplo, tenemos configurada la alarma para el 2014-07-20 12:00, y la fecha actual es 2014-07-10 16:00, el programa comprueba que año y mes son iguales, pero el día no, este ya no seguirá con la comprobación.
Una variable importante que debemos configurar es alarm_duration , con esta variable podremos configurar durante cuánto tiempo (en segundos) estará activa la alarma antes de que se resetee. Hay que tener cuidado de que su valor no sea superior al tiempo que hay entre una alarma y otra, por lo contrario, la alarma estaría siempre activa.
now.unixtime()
Esta función devuelve la fecha actual en segundos.
Si cargamos el código anterior en nuestro Arduino, veremos que cada vez que el reloj pasa por 0 segundos se activa la alarma (LED integrado en la placa), y transcurridos 10 segundo se resetea.
Puerto serie.
Resultado final.
me aparece un error que dice ‘class DateTime’ has no member named ‘dayOfWeek’