#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración de pines para el encoder rotatorio
const int pinCLK = 2;
const int pinDT = 3;
const int pinSW = 4;
// Crear objeto LCD 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Variable para almacenar la opción seleccionada
int opcionSeleccionada = 0;
// Arreglo con las opciones de menú
String opciones[] = {"Subenu 1", "Submenu 2", "Submenu 3", "Submenu 4", "Submenu 5"};
// Variables para almacenar los valores de las mediciones
float medicion1Valor = 0.0;
float medicion2Valor = 0.0;
float medicion3Valor = 0.0;
float medicion4Valor = 0.0;
float medicion5Valor = 0.0;
float medicion6Valor = 0.0;
float medicion7Valor = 0.0;
float medicion8Valor = 0.0;
float medicion9Valor = 0.0;
float medicion10Valor = 0.0;
float medicion11Valor = 0.0; // Nueva medición para el submenú 1
float medicion12Valor = 0.0; // Nueva medición para el submenú 2
float medicion13Valor = 0.0; // Nueva medición para el submenú 3
float medicion14Valor = 0.0; // Nueva medición para el submenú 4
float medicion15Valor = 0.0; // Nueva medición para el submenú 5
bool enMedicion = false;
int submenuActual = 0;
void setup() {
// Inicializar LCD
lcd.init();
lcd.backlight();
// Configurar pines del encoder como entrada
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
pinMode(pinSW, INPUT_PULLUP);
// Mostrar la opción inicial en el LCD
lcd.setCursor(0, 0);
lcd.print("Seleccione submenu:");
lcd.setCursor(0, 1);
lcd.print(opciones[opcionSeleccionada]);
}
void loop() {
// Leer el estado del encoder rotatorio
bool clkState = digitalRead(pinCLK);
bool dtState = digitalRead(pinDT);
// Detectar giro del encoder
if (clkState != dtState) {
if (dtState) {
opcionSeleccionada++;
} else {
opcionSeleccionada--;
}
// Mantener la opción dentro del rango válido
opcionSeleccionada = constrain(opcionSeleccionada, 0, 4);
// Mostrar la nueva opción en el LCD
lcd.setCursor(0, 1);
lcd.print(" "); // Limpiar línea
lcd.setCursor(0, 1);
lcd.print(opciones[opcionSeleccionada]);
}
// Detectar pulsación del botón del encoder
if (digitalRead(pinSW) == LOW) {
if (enMedicion) {
// Regresar al menú principal
enMedicion = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Seleccione submenu:");
lcd.setCursor(0, 1);
lcd.print(opciones[opcionSeleccionada]);
} else {
// Mostrar el submenú correspondiente
submenuActual = opcionSeleccionada;
mostrarSubmenu(submenuActual);
}
}
// Actualizar las mediciones en tiempo real
if (enMedicion) {
switch (submenuActual) {
case 0:
medicion1Valor = leerMedicion1();
medicion2Valor = leerMedicion2();
medicion11Valor = leerMedicion11(); // Nueva medición para el submenú 1
lcd.setCursor(0, 1);
lcd.print("M1: ");
lcd.print(medicion1Valor);
lcd.setCursor(0, 2);
lcd.print("M2: ");
lcd.print(medicion2Valor);
lcd.setCursor(0, 3);
lcd.print("M11: ");
lcd.print(medicion11Valor);
break;
case 1:
medicion3Valor = leerMedicion3();
medicion4Valor = leerMedicion4();
medicion12Valor = leerMedicion12(); // Nueva medición para el submenú 2
lcd.setCursor(0, 1);
lcd.print("M3: ");
lcd.print(medicion3Valor);
lcd.setCursor(0, 2);
lcd.print("M4: ");
lcd.print(medicion4Valor);
lcd.setCursor(0, 3);
lcd.print("M12: ");
lcd.print(medicion12Valor);
break;
case 2:
medicion5Valor = leerMedicion5();
medicion6Valor = leerMedicion6();
medicion13Valor = leerMedicion13(); // Nueva medición para el submenú 3
lcd.setCursor(0, 1);
lcd.print("M5: ");
lcd.print(medicion5Valor);
lcd.setCursor(0, 2);
lcd.print("M6: ");
lcd.print(medicion6Valor);
lcd.setCursor(0, 3);
lcd.print("M13: ");
lcd.print(medicion13Valor);
break;
case 3:
medicion7Valor = leerMedicion7();
medicion8Valor = leerMedicion8();
medicion14Valor = leerMedicion14(); // Nueva medición para el submenú 4
lcd.setCursor(0, 1);
lcd.print("M7: ");
lcd.print(medicion7Valor);
lcd.setCursor(0, 2);
lcd.print("M8: ");
lcd.print(medicion8Valor);
lcd.setCursor(0, 3);
lcd.print("M14: ");
lcd.print(medicion14Valor);
break;
case 4:
medicion9Valor = leerMedicion9();
medicion10Valor = leerMedicion10();
medicion15Valor = leerMedicion15(); // Nueva medición para el submenú 5
lcd.setCursor(0, 1);
lcd.print("M9: ");
lcd.print(medicion9Valor);
lcd.setCursor(0, 2);
lcd.print("M10: ");
lcd.print(medicion10Valor);
lcd.setCursor(0, 3);
lcd.print("M15: ");
lcd.print(medicion15Valor);
break;
}
}
delay(100); // Pequeño retraso para no saturar el procesador
}
void mostrarSubmenu(int submenu) {
enMedicion = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(opciones[submenu]);
lcd.setCursor(0, 3);
lcd.print("Presione para atras");
}
// Funciones para leer las mediciones (debes implementar el código correspondiente)
float leerMedicion1() {
// Código para leer la medición 1
return analogRead(A0) * (5.0 / 1023.0);
}
float leerMedicion2() {
// Código para leer la medición 2
return analogRead(A1) * (5.0 / 1023.0);
}
float leerMedicion3() {
// Código para leer la medición 3
return analogRead(A2) * (5.0 / 1023.0);
}
float leerMedicion4() {
// Código para leer la medición 4
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion5() {
// Código para leer la medición 5
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion6() {
// Código para leer la medición 6
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion7() {
// Código para leer la medición 7
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion8() {
// Código para leer la medición 8
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion9() {
// Código para leer la medición 9
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion10() {
// Código para leer la medición 10
return analogRead(A3) * (5.0 / 1023.0);
}
// Nuevas funciones para leer las mediciones adicionales
float leerMedicion11() {
// Código para leer la medición 11
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion12() {
// Código para leer la medición 12
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion13() {
// Código para leer la medición 13
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion14() {
// Código para leer la medición 14
return analogRead(A3) * (5.0 / 1023.0);
}
float leerMedicion15() {
// Código para leer la medición 15
return analogRead(A3) * (5.0 / 1023.0);
}