//Departamento de informatica EESTn1 Raul Scalabrini Ortiz
//Santa Teresita - Partido de la Costa
//Provincia de Buenos Aires - Argentina
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // inicializa la interfaz I2C del LCD 16x2
RTC_DS1307 RTC; // inicializa el modulo RTC
const int timbre = 7; // Pin 7 encargado de activar el timbre, se conecta al Rele
const int PULSADOR_MANUAL = 9;
const int tiempo_timbre = 10000; // Tiempo continuo que dura el timbre sonando, en milisegundos 5000 = 5 segundos
// Horarios definidos
int horarios[20][3] = {
{7, 20, 0}, {9, 20, 0}, {9, 50, 0}, {11, 50, 0},
{12, 50, 0}, {13, 0, 0}, {15, 0, 0}, {15, 30, 0},
{17, 30, 0}, {17, 40, 0}, {19, 40, 0}, {20, 0, 0},
{99, 0, 0}, {22, 0, 0}, {99, 0, 0}, {99, 0, 0},
{99, 0, 0}, {99, 0, 0}, {99, 0, 0}, {99, 0, 0}
};
// reinicio de arduino
void(* resetSoftware)(void) = 0;
void setup () {
pinMode(timbre, OUTPUT);
pinMode(PULSADOR_MANUAL, INPUT);
Wire.begin();
RTC.begin();
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
}
void loop() {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
DateTime now = RTC.now();
actualizarPantalla(now);
comprobarHorario(now);
}
comprobarPulsadorManual();
}
void actualizarPantalla(DateTime now) {
lcd.setCursor(0, 0);
lcd.print("FECHA:");
lcd.setCursor(6, 0);
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.setCursor(0, 1);
lcd.print("HORA: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0"); // Añade un cero a la izquierda si el minuto es menor a 10
}
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second() < 10) {
lcd.print("0"); // Añade un cero a la izquierda si el segundo es menor a 10
}
lcd.print(now.second(), DEC);
int contacto4 = analogRead(A3);
if (contacto4 <= 1000) {
lcd.setCursor(16, 0);
Serial.print("-e-");
} else {
lcd.setCursor(12, 0);
Serial.print("-F-");
}
}
void comprobarHorario(DateTime now) {
int r_diaSemana = dia_de_semana();
int contacto4 = analogRead(A3);
if ((r_diaSemana == 6 || r_diaSemana == 0) && (contacto4 <= 1000)) {
return;
}
for (int i = 0; i < 20; i++) {
if (horarios[i][0] == now.hour() && horarios[i][1] == now.minute() && horarios[i][2] == now.second()) {
activar_timbre();
}
}
}
void comprobarPulsadorManual() {
if (digitalRead(PULSADOR_MANUAL) == HIGH) {
digitalWrite(timbre, HIGH);
lcd.setCursor(0, 0);
lcd.print(" TIMBRE ");
lcd.setCursor(0, 1);
lcd.print(" MANUAL ");
delay(tiempo_timbre);
digitalWrite(timbre, LOW);
}
}
void activar_timbre() {
digitalWrite(timbre, HIGH);
lcd.setCursor(0, 0);
lcd.print(" SONANDO ");
Serial.println("Timbre Activo");
delay(tiempo_timbre);
digitalWrite(timbre, LOW);
resetSoftware();
}
int dia_de_semana() {
DateTime now = RTC.now();
int n_anno = (now.year() - 2000);
int d_anno = n_anno / 4;
int n_dia = now.day();
int n_mes = now.month();
int t_mes;
switch (n_mes) {
case 1: t_mes = 0; break;
case 2: t_mes = 3; break;
case 3: t_mes = 3; break;
case 4: t_mes = 6; break;
case 5: t_mes = 1; break;
case 6: t_mes = 4; break;
case 7: t_mes = 6; break;
case 8: t_mes = 2; break;
case 9: t_mes = 5; break;
case 10: t_mes = 0; break;
case 11: t_mes = 3; break;
case 12: t_mes = 5; break;
default: t_mes = 0; break;
}
int r_dia = n_dia + t_mes + n_anno + d_anno + 6; // 6 es el t_siglo
r_dia = r_dia % 7;
return r_dia;
}