Reloj alarma con Arduino


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.

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.

rtc alarma 01
Módulo Tiny RTC I2C.

rtc alarma 02
Esquema eléctrico Arduino Mega.

rtc alarma 03
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.

rtc alarma 04
Puerto serie.

rtc alarma 05
Resultado final.

Descargar Sketch


1 comentario en «Reloj alarma con Arduino»

Deja un comentario