#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
const int buzzerPin = 16; // Pin del buzzer
// Estructura para almacenar horarios
struct Horario {
int hora;
int minuto;
};
// Horarios del turno mañana
Horario turnosManana[] = {
{7, 30}, {8, 10}, {8, 50}, {9, 0}, {9, 40},
{10, 15}, {10, 30}, {11, 10}, {11, 50}, {11, 55},
{12, 30}, {13, 10}
};
// Horarios del turno tarde
Horario turnosTarde[] = {
{13, 30}, {14, 10}, {14, 50}, {15, 0}, {15, 40},
{16, 15}, {16, 30}, {17, 10}, {17, 50}, {18, 0},
{18, 40}, {19, 20}, {20, 5}
};
// Horarios con alarma larga (4.5 segundos)
Horario timbresLargos[] = {
{7, 30}, {8, 50}, {9, 0}, {10, 15}, {10, 30},
{11, 50}, {11, 55}, {13, 10}, {13, 30}, {14, 50},
{15, 0}, {16, 15}, {16, 30}, {17, 50}, {18, 0},
{19, 20}, {20, 5}
};
const int totalManana = sizeof(turnosManana) / sizeof(turnosManana[0]);
const int totalTarde = sizeof(turnosTarde) / sizeof(turnosTarde[0]);
const int totalLargos = sizeof(timbresLargos) / sizeof(timbresLargos[0]);
bool yaSono = false;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // Pines SDA y SCL para ESP32
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
if (!rtc.begin()) {
Serial.println("RTC no encontrado");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC reiniciado, ajustando hora.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
int diaSemana = now.dayOfTheWeek(); // 0 = domingo, 1 = lunes, ..., 6 = sábado
int horaActual = now.hour();
int minutoActual = now.minute();
Serial.print("Hoy es ");
mostrarDiaSemana(diaSemana);
Serial.print(" - Hora actual: ");
if (horaActual < 10) Serial.print("0");
Serial.print(horaActual);
Serial.print(":");
if (minutoActual < 10) Serial.print("0");
Serial.println(minutoActual);
if (diaSemana >= 1 && diaSemana <= 5) { // Solo lunes a viernes
if (!yaSono && esHoraDeAlarma(horaActual, minutoActual)) {
bool largo = esHorarioLargo(horaActual, minutoActual);
sonarAlarma(largo);
yaSono = true;
}
if (!esMinutoEnHorarios(minutoActual)) {
yaSono = false;
}
}
delay(1000);
}
bool esHoraDeAlarma(int hora, int minuto) {
for (int i = 0; i < totalManana; i++) {
if (turnosManana[i].hora == hora && turnosManana[i].minuto == minuto) {
return true;
}
}
for (int i = 0; i < totalTarde; i++) {
if (turnosTarde[i].hora == hora && turnosTarde[i].minuto == minuto) {
return true;
}
}
return false;
}
bool esMinutoEnHorarios(int minuto) {
for (int i = 0; i < totalManana; i++) {
if (turnosManana[i].minuto == minuto) return true;
}
for (int i = 0; i < totalTarde; i++) {
if (turnosTarde[i].minuto == minuto) return true;
}
return false;
}
bool esHorarioLargo(int hora, int minuto) {
for (int i = 0; i < totalLargos; i++) {
if (timbresLargos[i].hora == hora && timbresLargos[i].minuto == minuto) {
return true;
}
}
return false;
}
void mostrarDiaSemana(int dia) {
const char* dias[] = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};
Serial.print(dias[dia]);
}
void sonarAlarma(bool largo) {
Serial.println(largo ? "🔔 ¡ALARMA LARGA! (4.5s)" : "🔔 Alarma corta (2s)");
int duracion = largo ? 4500 : 2000; // milisegundos
digitalWrite(buzzerPin, HIGH);
delay(duracion);
digitalWrite(buzzerPin, LOW);
}