Este no es el primer proyecto que desarrollo con Arduino pero es el primero que quiero documentar en forma ordenada para poder mostrarlo y compartirlo. Luego de jugar, copiar y modificar proyectos sencillos sacados en la web empecé a pensar en aquellos que sirvieran en satisfacer alguna necesidad. Ante la inminente salida de vacaciones mi esposa me preguntó si podríamos colocar algún dispositivo que simule nuestra presencia en la casa prendiendo y apagando las luces para que puedan verse desde la calle. Existen los relojes que uno puede programar pero consideré que tenía algunas desventajas. Por ejemplo es necesario un reloj por cada luz sobre la que actuar y lo segundo es que debe hacerse un programa para que cada día tenga horarios diferentes de encendido/apagado. Con Arduino se simplifica bastante. Primero con una placa que comande un módulo de relés, uno para cada circuito.Luego con programación se puede pensar fácilmente un algoritmo que varíe el horario para cada día ya sea aleatoriamente o con un array de 7 elementos. Para solucionarlo en pocas horas pensé en una primera versión que en resumen hace:
- se introducen en variables arrays la hora y minutos de encendido y de apagado de una sola luz
- elegí hacerlo en una secuencia que se repite cada tres días
- con sólo la elección de éstos tres horarios puedo modificarlos sumando o restando para tener otros grupos de horarios para encender otras luces.
- queda pendiente para la próxima versión hacer que sea aleatorio la elección de los horarios.
Los Materiales
/*VACACIONES
* Programa para encendido/apagado automático de 2 luces
* tres dias diferentes
* para dos reles
* enero 2016
* Flavio Ragazzi *
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int factor; //determinación de día 0, 1 ó 3
int HoraIn =21 ; // Hora para el encendido
int HoraOut = 23; //Hora para el apagado
int MinIn[] ={45,39,23}; // minutos para el encendido
int MinOut[] ={8,17,3}; // minutos para el apagado
int Retraso[] ={7,11,9}; //retraso para en encendido de la segunda luz
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
pinMode(10,OUTPUT); // pin para comando de rele 1
pinMode(12,OUTPUT); // pin para comando de rele 2
if (! RTC.isrunning()) {
Serial.println("RTC NO FUNCIONA!");
// setea elmodulo RTC con la fecha de la PC cuando fue compilado/cargado el sketch
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.println(now.minute(), DEC);
delay(1000);
factor= now.day()%3; //determinación si se trata de día 1,2 ò 3 factor es el resto que resulta de dividir el día por tres
Serial.print("dia:");
Serial.print(factor);
Serial.print(' ');
Serial.print("hora de encendido : ");
Serial.print(HoraIn);
Serial.print(':');
Serial.print(MinIn[factor]);
Serial.print(' ');
Serial.print("hora de apagado : ");
Serial.print(HoraOut);
Serial.print(':');
Serial.println(MinOut[factor]);
// para elencendido
if(now.hour()==HoraIn && now.minute()>=MinIn[factor]){
digitalWrite(10,LOW);
if(now.hour()==HoraIn && now.minute()>= (MinIn[factor]+Retraso[factor])){
digitalWrite(12,LOW);
}
}
//para el apagado
if(now.hour()==HoraOut && now.minute()>= MinOut[factor]){
digitalWrite(10,HIGH);
if(now.hour()==HoraOut && now.minute()>= (MinOut[factor]+Retraso[factor])){
digitalWrite(12,HIGH);
}
}
}