// NOTA: se debe cargar dos veces este programa 1. Con la linea RTC.adjust(DateTime(__DATE__, __TIME__));
// 2. Sin esa linea
#include <Wire.h>
#include "RTClib.h"
#include "LibPrintf.h"
RTC_DS3231 RTC; // inicializa el modulo RTC
int r_diaSemana; // almacena el resultado del dia de la semana calculado
const int timbre = 13; // Pin 13 encargado de activar el timbre, se conecta al Rele
int segundo;
int minuto;
int hora;
unsigned long tiempo_timbre=6000UL; // Tiempo continuo que dura el timbre sonando, en milisegundos 5000 = 5 segundos
//////////////////////////////// Horario 1 /////////////////////////
// Hora en la que suena el timbre escrito h1=Hora, m1=Minutos, s1=Segundos
// Cuando no se programa ninguna hora se debe dejar escrito el numero 99
// se pueden programar 16 timbres por cada horario, _c1 indica que es el horario 1
struct _Horario {
int hora;
int minutos;
int segundos;
};
_Horario horario1[15]= {{ 7, 30, 0}, // Horario 1
{ 8, 15, 0},
{ 8, 20, 0},
{ 9, 5, 0},
{ 9, 10, 0},
{ 9, 55, 0},
{10, 0, 0},
{10, 45, 0},
{10, 55, 0},
{11, 35, 0},
{11, 40, 0},
{12, 25, 0},
{12, 30, 0},
{13, 15, 0}, //13
{99, 0, 0}
};
_Horario horario2[15] = { {12, 45, 0}, // 15 HORARIO 2
{13, 30, 0},
{13, 35, 0},
{14, 20, 0},
{14, 25, 0},
{15, 10, 0},
{15, 15, 0},
{16, 0, 0},
{16, 5, 0},
{16, 50, 0},
{16, 55, 0},
{17, 40, 0},
{17, 45, 0},
{18, 30, 0}, // 28
{99, 0, 0}
};
////////////////////////////////// Void Setup() ///////////
// void rellenar(struct _Horarios *A, size_t len){
// for (int k=0; k < len; k++) {
// A[k].hora =
// scanf("%s", A[k].pregunta);
// printf("\n");
// }
// }
byte index = 0;
bool flagTimbre = false;
unsigned long lastMillis;
const int botonPin = 2;
int statusAnt = 0, status;
void chequeoPulsador() {
static int hora, minu, secs;
status = digitalRead(botonPin);
if (status && !statusAnt) {
if (index++ > 14)
index = 0;
hora = horario1[index].minutos == 0? horario1[index].hora-1:horario1[index].hora;
minu = horario1[index].minutos == 0? 59:horario1[index].minutos-1;
secs = 55;
printf("Prueba timbre %d Ajusto Hora:%2d Minuto:%2d seg:%2d", index, hora, minu, secs);
RTC.adjust(DateTime(2023, 10, 25, hora, minu, secs));
}
statusAnt = status;
}
void setup () {
pinMode(timbre, OUTPUT); // Configura como salida el pin 13
pinMode(botonPin, INPUT_PULLUP);
Wire.begin();
RTC.begin(); // Inicia la comunicaci¢n con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Lee la fecha y hora del PC (Solo en la primera carga)
// el anterior se usa solo en la configuracion inicial luego se pone como comentario
// y se vuelve a cargar el programa sin esa linea.
RTC.adjust(DateTime(2023, 10, 25, horario1[0].hora, horario1[0].minutos, 55));
Serial.begin(9600); // Establece la velocidad de datos del puerto serie a 9600
}
////////////////////////////////// Void loop() ///////////
void loop(){
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
printf("\n%02d:%02d:%02d %02d/%02d/%02d ", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year(), now.day(), now.month(), now.year());
segundo = now.second();
minuto = now.minute();
hora = now.hour();
chequeoPulsador();
int r_diaSemana= now.dayOfTheWeek(); // llama a la funcion que calcula el dia de la semana y lo almacena en r_diaSemana
if (r_diaSemana == 6 || r_diaSemana == 0){ // si fin de semana no hace nada
}
else {
if (hora >=7 && hora<14){
horario_1(); // llama a la funcion que activa el horario 1
}
if (hora >=12 && hora<19){
horario_1(); // llama a la funcion que activa el horario 1
}
}
if (flagTimbre)
if (millis() - lastMillis > tiempo_timbre) {
lastMillis = millis();
flagTimbre = false;
digitalWrite(timbre, HIGH);
Serial.println(" Timbre Desactivado");
}
else {
printf(" Dif tiempo %ld", (millis() - lastMillis));
}
delay(1000); // La informaci¢n se actualiza cada 1 seg.
} //////////////////////////////// Fin del void loop(), inician las Funciones/////////////////////////
/////////////////////////////// Funcion que activa el Timbre //////////////////////////////////
void activar_timbre(){
digitalWrite(timbre, LOW);
printf(" Timbre Activo");
flagTimbre = true;
}
/////////////////////Condicional del Horario 1 //////////////////////////////////
void horario_1(){
//Serial.print("Horario_1 ");
for (int i=0; i<14; i++) {
if ((hora==horario1[i].hora) &&
(minuto==horario1[i].minutos) &&
(segundo==horario1[i].segundos)) {
activar_timbre();
lastMillis = millis(); // si no ajusto esto no se cumplen el tiempo de la sirena
printf(" lastMillis = %ld", lastMillis);
}
}
}
// ////////////////////Condicional del Horario 2 //////////////////////////////////
// void horario_2(){
// Serial.print("Horario_2 ");
// if ((hora==h1_c2) && (minuto==m1_c2) && (segundo==s1_c2)) activar_timbre();
// if ((hora==h2_c2) && (minuto==m2_c2) && (segundo==s2_c2)) activar_timbre();
// if ((hora==h3_c2) && (minuto==m3_c2) && (segundo==s3_c2)) activar_timbre();
// if ((hora==h4_c2) && (minuto==m4_c2) && (segundo==s4_c2)) activar_timbre();
// if ((hora==h5_c2) && (minuto==m5_c2) && (segundo==s5_c2)) activar_timbre();
// if ((hora==h6_c2) && (minuto==m6_c2) && (segundo==s6_c2)) activar_timbre();
// if ((hora==h7_c2) && (minuto==m7_c2) && (segundo==s7_c2)) activar_timbre();
// if ((hora==h8_c2) && (minuto==m8_c2) && (segundo==s8_c2)) activar_timbre();
// if ((hora==h9_c2) && (minuto==m9_c2) && (segundo==s9_c2)) activar_timbre();
// if ((hora==h10_c2) && (minuto==m10_c2) && (segundo==s10_c2)) activar_timbre();
// if ((hora==h11_c2) && (minuto==m11_c2) && (segundo==s11_c2)) activar_timbre();
// if ((hora==h12_c2) && (minuto==m12_c2) && (segundo==s12_c2)) activar_timbre();
// if ((hora==h13_c2) && (minuto==m13_c2) && (segundo==s13_c2)) activar_timbre();
// if ((hora==h14_c2) && (minuto==m14_c2) && (segundo==s14_c2)) activar_timbre();
// if ((hora==h15_c2) && (minuto==m15_c2) && (segundo==s15_c2)) activar_timbre();
// if ((hora==h16_c2) && (minuto==m16_c2) && (segundo==s16_c2)) activar_timbre();
// }