
Tutorial RTC: Parte III – Alarmas
En esta parte utilizamos un DS1307 para disparar alarmas. Las alarmas son muy útiles para realizar tareas en momentos específicos. Algunos módulos de RTC traen alarmas incorporadas como el DS3231 y otros. Pero el modulo DS1307 no trae alarmas incorporadas. Es decir que solo puede llevar la hora pero no configurar y disparar alarmas cuando se le programe. Para eso usaremos ayuda de las librerías Time y TimeAlarms.
Requisitos:
- Computadora (mac)
- Arduino UNO
- Modulo RTC DS1307
- Breadboard
- Arduino IDE (https://www.arduino.cc/en/Main/Software)

El código:
[code]
/** RTC Alarms without DS3231 without powering down */
#include <Wire.h>
#include “RTClib.h”
#include <Time.h>
#include <TimeAlarms.h>
RTC_DS1307 rtc;
void setup(){
Serial.begin(9600);
Wire.begin();
rtc.begin();
if (! rtc.isrunning()) {
Serial.println(“RTC is NOT running!”);
//rtc.adjust(DateTime(__DATE__, __TIME__));
Serial.print(“time set auto”);
}
//setTime(8,29,0,1,1,11); // Fecha Saturday 8:29:00am Jan 1 2011
DateTime now = rtc.now();
setTime(now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year());
// create the alarms
// Crear alarmas
Alarm.alarmRepeat(16,35,0, MorningAlarm); // 8:00am every day
Alarm.alarmRepeat(16,50,0,EveningAlarm); // 4:00pm every day
Alarm.alarmRepeat(17,05,0,EveningAlarm); // 1:00am every day
//Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday
//Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds
//Alarm.timerOnce(10, OnceOnly); // called once after 10 seconds
Serial.print(“Alarms listas!”);
}
void loop(){
digitalClockDisplay();
Alarm.delay(1000); // esperar 1 segundo entre displays
}
// Funciones de Alarma:
void MorningAlarm(){
Serial.println(“Alarm: – read CO/V & post to web”);
}
void EveningAlarm(){
Serial.println(“Alarm: – read CO/V & post to web”);
}
void DawnAlarm(){
Serial.println(“Alarm: – read CO/V & post to web”);
}
void WeeklyAlarm(){
Serial.println(“Alarm: – its Monday Morning”);
}
void ExplicitAlarm(){
Serial.println(“Alarm: – this triggers only at the given date and time”);
}
void Repeats(){
Serial.println(“15 second timer”);
}
void OnceOnly(){
Serial.println(“This timer only triggers once”);
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void printDigits(int digits)
{
Serial.print(“:”);
if(digits < 10)
Serial.print(‘0’);
Serial.print(digits);
}
[/code]
Veamos este proyecto. Estamos usando las librerías de Time & TimeAlarms para crear alarmas y forrajear fechas y hora.
Primero, tenemos la opción de programar una hora específica al modulo en lugar de leer la del computador. La linea para asignar la hora del computador como vimos anteriormente, esta comentada.
Segundo, creamos 5 alarmas. Una es para las 8:30am y otra para las 5:45pm todos los días. La otra es una alarma solo para los días Sábados a las 8:30am. Las ultimas dos son timers donde uno se repite cada 15 segundos y el otro se dispara a los 10 segundos una única vez.
Finalemente los últimos 2 métodos solo imprimen la hora actual (en base a la referencia creada) en el Monitor Serial.
Las alarmas son útiles para realizar ciertas tareas en cierto tiempo. Si, también se puede usar una alarma como una función integra de un proyecto Arduino tipo Reloj despertador”. Pero aun mas util es usarlas para hacer que nuestro proyecto utilice menos energía. Como veremos en el uso del modulo DS3231, se puede hacer dormir la UNO completa y hacer que el RTC DS3231 guarde su hora y según la alarma deseada, mande un pulso a la UNO para que aquella despierte a cierta hora todos los días y tome muestras. Esto hace que el consumo energético de nuestro proyecto sea mucho menor y así incrementamos su autonomía.
Si quisiéramos ahorrar energía tendríamos que apagar la Arduino lo cual se puede lograr con el Internal WatchDog Timer (WDT) o usando la librería LowPower. Aprenderemos a hacer esto en el siguiente tutorial.