#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <LiquidMenu.h>
#include <RTClib.h>
#include <Servo.h>
// Definiciones de hardware para los LEDs
RTC_DS1307 rtc;
Servo myservo;
int buzzer = A2;
int ledR = 13, ledG = 12, ledB = 11;
// Definición del LCD y la librería LiquidMenu
LiquidCrystal_I2C lcd(0x27, 16, 2);
LiquidMenu menu(lcd);
// Configuración del teclado Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Variable para rastrear el LED seleccionado
//int led_seleccionado = 0;
//Menú Principal
LiquidLine linea1_pant0(1, 0, "1. Abrir Buzon");
LiquidLine linea2_pant0(1, 1, "2. Ingresar al Menu");
//lineas pantalla 1
LiquidLine linea1_pant1(1, 0, "Pant1 lin1");
LiquidLine linea2_pant1(1, 1, "Pant1 lin2");
LiquidLine linea3_pant1(1, 0, "Pant1 lin3");
LiquidLine linea4_pant1(1, 1, "Pant1 lin4");
//LiquidLine linea5_pant1(1, 0, "< atras");
//lineas pantalla 2
//LiquidLine linea1_pant2(1, 1, "Pant2 lin1");
//LiquidLine linea2_pant2(1, 0, "Pant2 lin2");
//LiquidLine linea3_pant2(1, 1, "Pant2 lin3");
//LiquidLine linea4_pant2(1, 0, "Pant2 lin4");
//LiquidLine linea5_pant2(1, 1, "< atras");
//lineas pantalla 3
//LiquidLine linea1_pant3(1, 0, "Pant3 lin1");
//LiquidLine linea2_pant3(1, 1, "Pant3 lin2");
//LiquidLine linea3_pant3(1, 0, "Pant3 lin3");
//LiquidLine linea4_pant3(1, 1, "Pant3 lin4");
//LiquidLine linea5_pant3(1, 0, "< atras");
//lineas pantalla 4
//LiquidLine linea1_pant4(1, 0, "Pant4 lin1");
//LiquidLine linea2_pant4(1, 1, "Pant4 lin2");
//LiquidLine linea3_pant4(1, 0, "Pant4 lin3");
//LiquidLine linea4_pant4(1, 1, "Pant4 lin4");
//LiquidLine linea5_pant4(1, 0, "< atras");
//lineas pantalla 5
//LiquidLine linea1_pant5(1, 0, "Pant5 lin1");
//LiquidLine linea2_pant5(1, 1, "Pant5 lin2");
//LiquidLine linea3_pant5(1, 0, "Pant5 lin3");
//LiquidLine linea4_pant5(1, 1, "Pant5 lin4");
//LiquidLine linea5_pant5(1, 0, "< atras");
//declaracion de pantallas
LiquidScreen pantalla0;
LiquidScreen pantalla1;
//LiquidScreen pantalla2;
//LiquidScreen pantalla3;
//LiquidScreen pantalla4;
//LiquidScreen pantalla5;
//LiquidMenu menu(lcd);
bool menuActive = false; // Estado del menú, true cuando el menú está activo
unsigned long lastInteractionTime = 0; // Última vez que se interactuó con el sistema
const unsigned long backlightTimeout = 20000; // Tiempo para apagar la luz después de inactividad (20 segundos)
const unsigned long menuTimeout = 10000; // Tiempo para regresar a la pantalla inicial (10 segundos)
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
rtc.begin();
myservo.attach(10);
myservo.write(0);
pinMode(buzzer, OUTPUT);
// Configuración de los pines del LED RGB
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);
// Inicializar el LED en verde
digitalWrite(ledR, HIGH); // Rojo apagado
digitalWrite(ledG, LOW); // Verde encendido
digitalWrite(ledB, HIGH); // Azul apagado
//añadir lineas a Menú Principal
pantalla0.add_line(linea1_pant0);
pantalla0.add_line(linea2_pant0);
//añadir lineas a pantalla 1
pantalla1.add_line(linea1_pant1);
pantalla1.add_line(linea2_pant1);
pantalla1.add_line(linea3_pant1);
pantalla1.add_line(linea4_pant1);
//pantalla1.add_line(linea5_pant1);
//añadir lineas a pantalla 2
// pantalla2.add_line(linea1_pant2);
// pantalla2.add_line(linea2_pant2);
// pantalla2.add_line(linea3_pant2);
// pantalla2.add_line(linea4_pant2);
// pantalla2.add_line(linea5_pant2);
//añadir lineas a pantalla 3
// pantalla3.add_line(linea1_pant3);
// pantalla3.add_line(linea2_pant3);
// pantalla3.add_line(linea3_pant3);
// pantalla3.add_line(linea4_pant3);
// pantalla3.add_line(linea5_pant3);
//añadir lineas a pantalla 4
// pantalla4.add_line(linea1_pant4);
// pantalla4.add_line(linea2_pant4);
// pantalla4.add_line(linea3_pant4);
// pantalla4.add_line(linea4_pant4);
// pantalla4.add_line(linea5_pant4);
//añadir lineas a pantalla 5
// pantalla5.add_line(linea1_pant5);
// pantalla5.add_line(linea2_pant5);
// pantalla5.add_line(linea3_pant5);
// pantalla5.add_line(linea4_pant5);
// pantalla5.add_line(linea5_pant5);
//definir posicion del selector lineas de patalla 0
linea1_pant0.set_focusPosition(Position::LEFT);
linea2_pant0.set_focusPosition(Position::LEFT);
//definir posicion del selector lineas de patalla 1
linea1_pant1.set_focusPosition(Position::LEFT);
linea2_pant1.set_focusPosition(Position::LEFT);
linea3_pant1.set_focusPosition(Position::LEFT);
linea4_pant1.set_focusPosition(Position::LEFT);
// linea5_pant1.set_focusPosition(Position::LEFT);
//definir posicion del selector lineas de patalla 2
// linea1_pant2.set_focusPosition(Position::LEFT);
// linea2_pant2.set_focusPosition(Position::LEFT);
// linea3_pant2.set_focusPosition(Position::LEFT);
// linea4_pant2.set_focusPosition(Position::LEFT);
// linea5_pant2.set_focusPosition(Position::LEFT);
//definir posicion del selector lineas de patalla 3
// linea1_pant3.set_focusPosition(Position::LEFT);
// linea2_pant3.set_focusPosition(Position::LEFT);
// linea3_pant3.set_focusPosition(Position::LEFT);
// linea4_pant3.set_focusPosition(Position::LEFT);
// linea5_pant3.set_focusPosition(Position::LEFT);
//definir posicion del selector lineas de patalla 4
// linea1_pant4.set_focusPosition(Position::LEFT);
// linea2_pant4.set_focusPosition(Position::LEFT);
// linea3_pant4.set_focusPosition(Position::LEFT);
// linea4_pant4.set_focusPosition(Position::LEFT);
// linea5_pant4.set_focusPosition(Position::LEFT);
//definir posicion del selector lineas de patalla 5
// linea1_pant5.set_focusPosition(Position::LEFT);
// linea2_pant5.set_focusPosition(Position::LEFT);
// linea3_pant5.set_focusPosition(Position::LEFT);
// linea4_pant5.set_focusPosition(Position::LEFT);
// linea5_pant5.set_focusPosition(Position::LEFT);
//declaración de funciones
linea1_pant0.attach_function(1, fn_ir_a_pantalla1);
linea2_pant0.attach_function(1, fn_ir_a_pantalla1);
linea1_pant1.attach_function(1, fn_vacio);
linea2_pant1.attach_function(1, fn_vacio);
linea3_pant1.attach_function(1, fn_vacio);
linea4_pant1.attach_function(1, fn_vacio);
// linea5_pant1.attach_function(1, fn_atras);
// linea1_pant2.attach_function(1, fn_vacio);
// linea2_pant2.attach_function(1, fn_vacio);
// linea3_pant2.attach_function(1, fn_vacio);
// linea4_pant2.attach_function(1, fn_vacio);
// linea5_pant2.attach_function(1, fn_atras);
// linea1_pant3.attach_function(1, fn_vacio);
// linea2_pant3.attach_function(1, fn_vacio);
// linea3_pant3.attach_function(1, fn_vacio);
// linea4_pant3.attach_function(1, fn_vacio);
// linea5_pant3.attach_function(1, fn_atras);
// linea1_pant4.attach_function(1, fn_vacio);
// linea2_pant4.attach_function(1, fn_vacio);
// linea3_pant4.attach_function(1, fn_vacio);
// linea4_pant4.attach_function(1, fn_vacio);
// linea5_pant4.attach_function(1, fn_atras);
// linea1_pant5.attach_function(1, fn_vacio);
// linea2_pant5.attach_function(1, fn_vacio);
// linea3_pant5.attach_function(1, fn_vacio);
// linea4_pant5.attach_function(1, fn_vacio);
// linea5_pant5.attach_function(1, fn_atras);
menu.add_screen(pantalla0);
menu.add_screen(pantalla1);
// menu.add_screen(pantalla2);
// menu.add_screen(pantalla3);
// menu.add_screen(pantalla4);
// menu.add_screen(pantalla5);
pantalla0.set_displayLineCount(2);
pantalla1.set_displayLineCount(2);
// pantalla2.set_displayLineCount(2);
// pantalla3.set_displayLineCount(2);
// pantalla4.set_displayLineCount(2);
// pantalla5.set_displayLineCount(2);
menu.init();
menu.set_focusedLine(0);
menu.update();
lastInteractionTime = millis(); // Establece el tiempo inicial de interacción
}
void loop() {
unsigned long currentTime = millis();
// Comprueba si el sistema ha estado inactivo demasiado tiempo
if (!menuActive && (currentTime - lastInteractionTime > backlightTimeout)) {
lcd.noBacklight(); // Apaga la luz del LCD
}
if (menuActive && (millis() - lastInteractionTime > menuTimeout)) {
lcd.clear(); // Limpia la pantalla antes de volver a mostrar la hora y la fecha
menu.change_screen(1); // Cambia a la pantalla de hora/fecha
menu.set_focusedLine(0);
menuActive = false; // Establece el menú como inactivo
}
if (!menuActive) {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print("Hora: ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
lcd.setCursor(0, 1);
lcd.print("Fecha:");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
}
char key = keypad.getKey();
if (key) {
lcd.backlight();
if (!menuActive) {
digitalWrite(ledG, HIGH); // Enciende la luz del LED
}
menuActive = true; // Activa el menú cuando se presiona una tecla
lastInteractionTime = currentTime; // Actualiza el tiempo de la última interacción
switch (key) {
case 'A':
menu.call_function(1);
break;
case 'B':
menu.switch_focus(false);
break;
case 'C':
menu.switch_focus(true);
break;
case 'D':
menu.change_screen(1);
menu.set_focusedLine(0);
menuActive = false;
break;
}
menu.update();
}
}
// Funciones para el menú
void fn_ir_a_pantalla1(){
menu.change_screen(2);
menu.set_focusedLine(0);
}
//void fn_ir_a_pantalla2(){
// menu.change_screen(3);
// menu.set_focusedLine(0);
//}
//void fn_ir_a_pantalla3(){
// menu.change_screen(4);
// menu.set_focusedLine(0);
//}
//void fn_ir_a_pantalla4(){
// menu.change_screen(5);
// menu.set_focusedLine(0);
//}
//void fn_ir_a_pantalla5(){
// menu.change_screen(6);
// menu.set_focusedLine(0);
//}
void fn_atras(){
menu.change_screen(1);
menu.set_focusedLine(0);
}
void fn_vacio(){
}