#include <Wire.h> // incluye libreria para interfaz I2C
#include <RTClib.h> // incluye libreria para el manejo del modulo RTC
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
const int buttonUpPin = 5; // Pin del botón para aumentar
const int buttonDownPin = 18; // Pin del botón para disminuir
const int buttonModePin = 21; // Botón para alternar entre variables
bool buttonUpState = LOW; // Estado del botón para aumentar
bool buttonDownState = LOW; // Estado del botón para disminuir
bool buttonModeState = LOW; // Estado del botón para alternar
bool lastButtonModeState = HIGH; // Estado anterior del botón de modo
bool evento_inicio = true; // variable de control para inicio de evento con valor true
bool evento_fin = true; // variable de control para finalizacion de evento con valor true
int BHora = 14;
int BMinuto = 32;
int BHora2 = 14;
int BMinuto2 = 33;
int LHora = 20;
int LMinuto = 16;
int LHora2 = 22;
int LMinuto2 = 10;
# define RELE 4 // constante RELE con valor 3 que corresponde a pin digital 3
# define RELE 22
// donde se encuentra conectado el modulo de rele
void setup () {
pinMode(buttonUpPin, INPUT_PULLUP); // Configura el pin con resistencia pull-up interna
pinMode(buttonDownPin, INPUT_PULLUP);
pinMode(buttonModePin, INPUT_PULLUP);
Serial.begin(9600); // inicializa comunicacion serie a 9600 bps
pinMode(RELE, OUTPUT); // pin 3 como salida
if (! rtc.begin()) { // si falla la inicializacion del modulo
Serial.println("Modulo RTC no encontrado !"); // muestra mensaje de error
while (1); // bucle infinito que detiene ejecucion del programa
}
lcd.init();
lcd.backlight();
horarios();
}
void loop () {
DateTime fecha = rtc.now(); // funcion que devuelve fecha y horario en formato
// DateTime y asigna a variable fecha
buttonUpState = digitalRead(buttonUpPin); // Lee el estado del botón para aumentar
buttonDownState = digitalRead(buttonDownPin); // Lee el estado del botón para disminuir
buttonModeState = digitalRead(buttonModePin);
// Alterna entre variables al presionar el botón de modo
if (buttonModeState == LOW && lastButtonModeState == HIGH) {
mode = (mode + 1) % 8; // Cambia el modo cíclicamente entre 0, 1, 2 y 3
printCurrentMode(); // Muestra el modo actual
delay(200); // Evita rebotes
}
lastButtonModeState = buttonModeState;
// Incrementa o decrementa la variable seleccionada
if (buttonUpState == LOW) {
changeValue(1); // Incrementa el valor
delay(200); // Evita rebotes
}
if (buttonDownState == LOW) {
changeValue(-1); // Decrementa el valor
delay(200); // Evita rebotes
}
// Función para incrementar o decrementar según el modo activo
void changeValue(int delta) {
switch (mode) {
case 0: // Editar hora1
BHora += delta;
if (hora1 > 23) hora1 = 0;
if (hora1 < 0) hora1 = 23;
break;
case 1: // Editar minuto1
BMinuto += delta;
if (minuto1 > 59) minuto1 = 0;
if (minuto1 < 0) minuto1 = 59;
break;
case 2: // Editar hora2
BHora2 += delta;
if (hora2 > 23) hora2 = 0;
if (hora2 < 0) hora2 = 23;
break;
case 3: // Editar minuto2
BMinuto2 += delta;
if (minuto2 > 59) minuto2 = 0;
if (minuto2 < 0) minuto2 = 59;
break;
case 4: // Editar minuto2
LHora += delta;
if (minuto2 > 59) minuto2 = 0;
if (minuto2 < 0) minuto2 = 59;
break;
case 5: // Editar minuto2
LMinuto += delta;
if (minuto2 > 59) minuto2 = 0;
if (minuto2 < 0) minuto2 = 59;
break;
case 6: // Editar minuto2
LHora2 += delta;
if (minuto2 > 59) minuto2 = 0;
if (minuto2 < 0) minuto2 = 59;
break;
case 7: // Editar minuto2
LMinuto2 += delta;
if (minuto2 > 59) minuto2 = 0;
if (minuto2 < 0) minuto2 = 59;
break;
}
printTime(); // Imprime los valores actualizados
}
// Función para imprimir la variable activa
void printCurrentMode() {
switch (mode) {
case 0: Serial.println("Editando hora1"); break;
case 1: Serial.println("Editando minuto1"); break;
case 2: Serial.println("Editando hora2"); break;
case 3: Serial.println("Editando minuto2"); break;
case 4: Serial.println("Editando hora1"); break;
case 5: Serial.println("Editando minuto1"); break;
case 6: Serial.println("Editando hora2"); break;
case 7: Serial.println("Editando minuto2"); break;
}
}
// Función para imprimir el tiempo completo
void printTime() {
Serial.print("Hora 1: ");
if (hora1 < 10) Serial.print("0");
Serial.print(hora1);
Serial.print(":");
if (minuto1 < 10) Serial.print("0");
Serial.print(minuto1);
Serial.print(" | Hora 2: ");
if (hora2 < 10) Serial.print("0");
Serial.print(hora2);
Serial.print(":");
if (minuto2 < 10) Serial.print("0");
Serial.println(minuto2);
}
/////////////juntar con lo de abajo7777777777777777777
if ( fecha.hour() == BHora2 && fecha.minute() == BMinuto2 ){ // si hora = 15 y minutos = 30
if ( evento_fin == true ){ // si evento_fin es verdadero
digitalWrite(RELE, LOW); // desactiva modulo de rele con nivel bajo
Serial.println( "Rele apagado" ); // muestra texto en monitor serie
lcd.setCursor(0,0 ); //Detalles mas importantes del motor2 // linea1
lcd.print(" ");
lcd.setCursor(0,0 );
lcd.print("AB: ");
lcd.print(LHora);
lcd.print(":");
lcd.print(LMinuto);
lcd.print("-");
lcd.print(LHora2);
lcd.print(":");
lcd.print(LMinuto2);
evento_fin = false; // carga valor falso en variable de control
} // para evitar ingresar mas de una vez
}
if ( fecha.hour() == LHora && fecha.minute() == LMinuto ){ // si hora = 14 y minutos = 30
if ( evento_inicio == true ){ // si evento_inicio es verdadero
digitalWrite(RELE, HIGH); // activa modulo de rele con nivel alto
Serial.println( "Lam prendida" ); // muestra texto en monitor serie
lcd.setCursor(0, 1); //Detalles mas importantes del motor2 // linea1
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Encendido");
evento_inicio = false; // carga valor falso en variable de control
} // para evitar ingresar mas de una vez
}
if ( fecha.hour() == LHora2 && fecha.minute() == LMinuto2 ){ // si hora = 15 y minutos = 30
if ( evento_fin == true ){ // si evento_fin es verdadero
digitalWrite(RELE, LOW); // desactiva modulo de rele con nivel bajo
Serial.println( "Rele apagado" ); // muestra texto en monitor serie
lcd.setCursor(0, 1); //Detalles mas importantes del motor2 // linea1
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Lam apagada");
evento_fin = false; // carga valor falso en variable de control
} // para evitar ingresar mas de una vez
}
Serial.print(fecha.day()); // funcion que obtiene el dia de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.month()); // funcion que obtiene el mes de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.year()); // funcion que obtiene el año de la fecha completa
Serial.print(" "); // caracter espacio en blanco como separador
Serial.print(fecha.hour()); // funcion que obtiene la hora de la fecha completa
Serial.print(":"); // caracter dos puntos como separador
Serial.print(fecha.minute()); // funcion que obtiene los minutos de la fecha completa
Serial.print(":"); // caracter dos puntos como separador
Serial.println(fecha.second()); // funcion que obtiene los segundos de la fecha completa
delay(1000); // demora de 1 segundo
if ( fecha.hour() == 2 && fecha.minute() == 0 ){ // si hora = 2 y minutos = 0 restablece valores de
evento_inicio = true; // variables de control en verdadero
evento_fin = true;
}
}
void horarios() {
lcd.setCursor(0, 0); //Detalles mas importantes del motor1 // linea0
lcd.print("AB: ");
if (BHora < 10) {
lcd.print("0");
}
lcd.print(BHora);
lcd.print(":");
if (BMinuto < 10) {
lcd.print("0");
}
lcd.print(BMinuto);
lcd.print("-");
lcd.print(BHora2);
lcd.print(":");
if (BMinuto2 < 10) {
lcd.print("0");
}
lcd.print(BMinuto2);
lcd.setCursor(0, 1); //Detalles mas importantes del motor2 // linea1
lcd.print("AL: ");
lcd.print(LHora);
lcd.print(":");
if (LMinuto < 10) {
lcd.print("0");
}
lcd.print(LMinuto);
lcd.print("-");
lcd.print(LHora2);
lcd.print(":");
if (LMinuto2 < 10) {
lcd.print("0");
}
lcd.print(LMinuto2);
}