#include <LiquidCrystal_I2C.h> //LIBRERIAS TECLADO Y LCD CON i2c
#include <Keypad.h>
//ASIGNAR UN NOMBRE A LOS PINES PARA LOS LEDS.
#define LED1 15 // Válvula
#define LED2 4 // Bomba
#define LED3 17 // Flotador
#define LED4 18 // Sensor de nivel
#define Buzzer 23 // Alarma
#define LEDP 3 // LED indicador de paro
LiquidCrystal_I2C lcd(0x27, 16, 2); //DIRECCION i2c
const byte ROWS = 4; //FILAS
const byte COLS = 4; //COLUMNAS
char keys[ROWS][COLS] = { //MAPA DEL TECLADO
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, 14, 27}; //FILAS A PINES DEL ESP32
byte colPins[COLS] = {26, 25, 33, 32}; //COLUMNA A PINES DEL ESP32
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //ESTRUCTURA DEL KEYPAD PARA EL CÓDIGO
// Variables para el scroll
String scrollText = "1=Valvula 2=Bomba 3=Flotador 4=Sensor nivel 0=PARO "; //TEXTO QUE SE MUEVE "MENU DE OPCIONES"
int scrollIndex = 0; // Desde qué letra empieza el scroll
unsigned long lastScrollTime = 0; // Guarda el momento en que el texto fue desplazado por última vez
const unsigned long scrollDelay = 300; // Define el retardo (en milisegundos) entre cada desplazamiento del texto
// Variables de contraseña
String password = "152008"; //String es una forma de almacenar cadenas de texto, en este caso en password(VARIABLE CREADA)
String inputPassword = ""; //Almacena la cadena de numeros que ha ingresado el usuario
int attempts = 0; //int guarda números enteros, en este caso es el número de intentos de contraseña comenzando en 0 y aumenta al fallar
bool accessGranted = false; //bool es como un si o no. aqui se dice si el acceso ah sido concedido, esta en false pq en reposo no se presiona nada.
void setup() {
//DECLARAR MIS ELEMENTOS DE SALIDA
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(Buzzer, OUTPUT);
pinMode(LEDP, OUTPUT);
//INICIALIZACIÓN DE LA LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTRASENA:"); //MUESTRA ESTO AL ESTAR EN REPOSO
}
void loop() {
char key = keypad.getKey(); // LEE LO QUE SE HAYA PRESIONADO EN EL TECLADO
/*
SE EJECUTA SI -NO se ha concedido el acceso todavía-(NO HAY ACCESO) ------> inputPassword == password
si todavía NO se ha concedido el acceso Porque queremos ejecutar la parte del código que pide la contraseña
solamente cuando aún no se haya autorizado la entrada.
*/
if (!accessGranted) { // “Si el usuario aún no ha ingresado la contraseña correcta, entonces permite que la escriba”. "INTENTAR DE NUEVO"
// cuando ya se ingresa la contraseña, esto ya no es ejecutable
if (key != NO_KEY) { // si ya se presiono algo
if (key == '#') { // si el key es igual a #
if (inputPassword == password) { //SI LA CONTRASEÑA ES IGUAL A LO INSERTADO
accessGranted = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCESO CONCEDIDO");
delay(1500);
lcd.clear();
}
if (inputPassword != password) { //SI LA CONTRASEÑA ES DIFERENTE A LO INSERTADO
attempts++; //INCREMENTA EL NÚMERO DE INTENTOS
lcd.setCursor(0, 1);
lcd.print(" INCORRECTO ");
inputPassword = "";
delay(1500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTRASENA:");
}
if (attempts >= 3) { // SI LOS INTENTOS SON IGUALES O MAYORES A 3
digitalWrite(LEDP, HIGH);
digitalWrite(Buzzer, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCESO BLOQUEADO");
delay(5000);
digitalWrite(LEDP, LOW);
digitalWrite(Buzzer, LOW);
attempts = 0; // SE REESTABLECEN LOS INTENTOS
inputPassword = ""; //LIMPIA LA VARIABLE ACTUAL
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTRASENA:");
}
}
if (key == '*') { //SI SE PRESIONA * LIMPIA LA CONTRASEÑA ACTUAL
inputPassword = "";
lcd.setCursor(0, 0);
lcd.print("CONTRASENA: ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (inputPassword.length() < 6 && isDigit(key)) { //no puede ingresar más de 6 caracteres en la contraseña, y solo permite ingresar números.
inputPassword += key; // Agregar la tecla presionada a la contraseña
lcd.setCursor(inputPassword.length() - 1, 1); // Mueve el cursor
lcd.print("*"); // Muestra un asterisco para ocultar la contraseña
}
}
}
if (accessGranted) { //SI EL ACCESO ES CONCEDIDO
if (key != NO_KEY) { // SI SE PRESIONA ALGO
lcd.clear();
if (key == '1') {
digitalWrite(LED1, HIGH);
lcd.setCursor(0, 0);
lcd.print("ABRIENDO VALVULA");
delay(1500);
}
if (key == '2') {
digitalWrite(LED2, HIGH);
lcd.setCursor(0, 0);
lcd.print("ARRANQUE BOMBA");
delay(1500);
}
if (key == '3') {
digitalWrite(LED3, HIGH);
lcd.setCursor(0, 0);
lcd.print("LEYENDO FLOTADOR");
delay(1500);
}
if (key == '4') {
digitalWrite(LED4, HIGH);
lcd.setCursor(0, 0);
lcd.print("LEYENDO SENSOR");
delay(1500);
}
if (key == '0') {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LEDP, HIGH);
digitalWrite(Buzzer, HIGH);
lcd.setCursor(0, 0);
lcd.print("CORTANDO LLENADO");
delay(1500);
digitalWrite(LEDP, LOW);
digitalWrite(Buzzer, LOW);
}
if (key != '1' && key != '2' && key != '3' && key != '4' && key != '0') { // SI SE PRESIONA CUALQUIER OTRA TECLA QUE NO ESTE AQUÍ
lcd.setCursor(0, 0);
lcd.print(" SIN USO ");
delay(1000);
}
lcd.clear();
}
// TEXTO DE MENÚ DESBLOQUEADO
lcd.setCursor(0, 0);
lcd.print("LLENADO TANQUE :");
if (millis() - lastScrollTime > scrollDelay) {
lastScrollTime = millis(); // Actualiza el tiempo actual
lcd.setCursor(0, 1);
lcd.print(scrollText.substring(scrollIndex, scrollIndex + 16)); // Muestra un fragmento del texto
scrollIndex++; // Desplaza la ventana del texto
if (scrollIndex > scrollText.length() - 16) {
scrollIndex = 0; // Si hemos llegado al final del texto, volvemos a empezar
}
}
}
}
//CÓDIGO : Manuel Santiago Nava 4.-A Mecatrónica