Arduino (IoT): Simple Tutorial RTC: Parte III – Alarmas

Real Time Clock Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

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:

  1. Computadora (mac)
  2. Arduino UNO
  3. Modulo RTC DS1307
  4. Breadboard
  5. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Arduino Tutorial Real Time Clock RTC DS1307 Santiapps Marcio Valenzuela
Arduino Tutorial Real Time Clock RTC DS1307

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.

Arduino (IoT): Simple Tutorial RTC: Parte II – Configurar con DS1307RTC

Real Time Clock Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial RTC: Parte II – Configurar con DS1307RTC

En esta parte utilizamos una librería distinta, la DS1307RTC en lugar de la RTClib.  Primero haremos lo mismo, configurar la hora en nuestro modulo RTC.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO
  3. Modulo RTC DS1307
  4. Breadboard
  5. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Arduino Tutorial Real Time Clock RTC DS1307 Santiapps Marcio Valenzuela
Arduino Tutorial Real Time Clock RTC DS1307

El código:

[code]
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”,
“Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”
};

tmElements_t tm;

void setup() {
Serial.begin(9600);
bool parse=false;
bool config=false;

// obtener fecha de computadora
if (getDate(__DATE__) &amp;&amp; getTime(__TIME__)) {
parse = true;
// configurar la fecha y hora al rtc
if (RTC.write(tm)) {
config = true;
}
}

Serial.begin(9600);
while (!Serial) ; // Esperar al Arduino Serial Monitor
delay(200);
if (parse &amp;&amp; config) {
Serial.print(“DS1307 Hora configurada=”);
Serial.print(__TIME__);
Serial.print(“, Fecha=”);
Serial.println(__DATE__);
} else if (parse) {
Serial.println(“DS1307 Error de Comunicacion:-{“);
Serial.println(“Por favor revisar sus conexiones”);
} else {
Serial.print(“No se pudo interpretar info del compilador, Hora=\””);
Serial.print(__TIME__);
Serial.print(“\”, Fecha=\””);
Serial.print(__DATE__);
Serial.println(“\””);
}
}

void loop() {
}

bool getTime(const char *str)
{
int Hour, Min, Sec;

if (sscanf(str, “%d:%d:%d”, &amp;Hour, &amp;Min, &amp;Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}

bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;

if (sscanf(str, “%s %d %d”, Month, &amp;Day, &amp;Year) != 3) return false;
for (monthIndex = 0; monthIndex &lt; 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex &gt;= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}

[/code]

Ya tenemos a nuestra disposición 2 distintas librerías para lograr lo mismo.  Recordemos que las librerías son archivos de código que toman las instrucciones de nivel mas bajo que utilizan los modelos y sensores y los convierten en funciones y valores fáciles de entender a los humanos.

Es decir, recordemos que nuestros sensores lo único que interpretan son corrientes y los distintos tipos.  Estas corrientes se traducen a bits y bytes que producen senales binarias de 0 y 1, que son interpretadas por los distintos chips.  Las librerías hacen un interfaz a este nivel mas bajo y funcionan como traductor.  Las librerías toman los comandos que nosotros queremos enviar (medir intensidad de luz, medir gas CO, almacenar datos en SD, cual es la hora actual) y convierten esos comandos en lenguaje binario y corrientes que los electrónicos pueden entender.  Así mismo cuando los electrónicos contestan con corrientes, las convierten en lenguaje binario y luego en funciones con resultados que nosotros podamos entender.

Ok, podemos almacenar la hora en un modulo operado por su propia batería.  Esto es lo mismo que hace una computadora para almacenar la hora que siempre tiene aunque nosotros apaguemos la computadora al final del dia.

Veamos el uso que podemos darle a tener esta hora referencia para usar alarmas.