Hoy les mostraré una maqueta de un panel de precios para gasolineras. En este panel, podemos ver el precio del Diesel, luego los precios de la Gasolina 95, 90 y 84. Más abajo tenemos una pantalla con tres pulsadores, que nos permiten configurar los precios de manera fácil. Para demostrar cómo funciona, haremos un ejemplo cambiando el precio de la Gasolina de 84.
Al iniciar, la pantalla solicita una clave de acceso. Una vez ingresada correctamente, podemos navegar por el menú principal para modificar los precios. Bajamos hasta la opción de la Gasolina 84 y ajustamos el precio. Mientras lo hacemos, el cambio también se refleja en el display principal. Este proyecto está construido con un ESP32 y programado en el IDE de Arduino. A lo largo del video, les explicaré el esquemático electrónico, el diseño de la PCB y la estructura del panel.
DATOS TÉCNICOS

- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………850mA
- Entradas digitales “Pulsadores” 12VDC………………3
- Puerto usb de programación……………………………..1
- Comunicación I2C…………………………………………………Sí
- Comunicación Wifi…………………………………………………Sí
- Comunicación Bluetooth…………………………………………….Sí
- Dimensiones…………………………………….…….………220x100mm
- Empotrable…………………………………………….………Sí
- Entorno de programación………………………..……..Arduino IDE
- Condiciones ambientales min………………………….-10°
- Condiciones ambientales max…………………..…….55°
LISTA DE MATERIALES

Quantity | Comment | Designator | Footprint | Value | Manufacturer Part | Manufacturer |
10 | 100nF | C1,C3,C4,C7,C8,C12,C13,C15,C16,C17 | C0603 | 100nF | CC0603KRX7R9BB104 | YAGEO(国巨) |
1 | 47uF | C2 | C1206 | 47uF | CL31A476MPHNNNE | SAMSUNG(三星) |
2 | 470uF | C5,C10 | CAP-SMD_BD10.0-L10.3-W10.3-LS11.3-FD | 470uF | VT1V471M1010 | ROQANG(容强) |
2 | 1uF | C6,C11 | C1206 | 1uF | CL31B105KBHNNNE | SAMSUNG(三星) |
1 | 220uF | C9 | CAP-SMD_BD8.0-L8.3-W8.3-LS9.3-FD-2 | 220uF | UCD1V221MNL1GS | Nichicon(尼吉康) |
1 | 220uF | C14 | CAP-SMD_BD6.3-L6.6-W6.6-LS7.2-R-RD | 220uF | RVE1C221M0607 | ROQANG(容强) |
2 | ZX-XH2.54-4PZZ | CN1,CN2 | CONN-TH_4P-P2.50_4PIN | ZX-XH2.54-4PZZ | Megastar(兆星) | |
3 | SS34 | D1,D2,D3 | SMA_L4.3-W2.6-LS5.2-RD | SS34 | MDD(辰达半导体) | |
2 | SS210 | D4,D5 | SMA_L4.3-W2.6-LS5.2-RD | SS210 | MDD | |
1 | PM254-1-06-W-8.5 | H1 | HDR-TH_6P-P2.54-H-F-W10.0-N | PM254-1-06-W-8.5 | HCTL(华灿天禄) | |
1 | PZ254R-11-06P | H2 | HDR-TH_6P-P2.54-H-M-W10.4 | PZ254R-11-06P | XFCN(兴飞) | |
2 | 68uH | L1,L2 | IND-SMD_L7.1-W6.6-1 | 68uH | PSPMAA0605H-680M-IGF | PROD(谱罗德) |
4 | SM412301N | LED1,LED2,LED3,LED4 | LED-SEG-TH_10P-L48.7-W69.7-P2.54-S60.20-BL | SM412301N | ARKLED(方舟) | |
1 | WJ128V-5.0-2P | P1 | CONN-TH_2P-P5.00_WJ128V-5.0-2P | WJ128V-5.0-2P | KANGNEX(康奈克斯电气) | |
3 | MMBT3904 | Q1,Q2,Q3 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | MMBT3904 | CJ(江苏长电/长晶) | |
5 | 10kΩ | R1,R5,R13,R26,R27 | R0603 | 10kΩ | 0603WAF1002T5E | UNI-ROYAL(厚声) |
3 | 2.2kΩ | R2,R3,R4 | R0805 | 2.2kΩ | 0805W8F2201T5E | UNI-ROYAL(厚声) |
28 | 240Ω | R6,R7,R8,R9,R10,R11,R12,R15, R16,R17,R18,R19,R20,R21,R28, R29,R30,R31,R32,R33,R34,R35, R36,R37,R38,R39,R40,R41 |
R0805 | 240Ω | 0805W8F2400T5E | UNI-ROYAL(厚声) |
5 | 1kΩ | R14,R22,R23,R24,R25 | R0603 | 1kΩ | 0603WAF1001T5E | UNI-ROYAL(厚声) |
4 | TS-1187A-B-A-B | SW1,SW2,SW3,SW4 | SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL-2 | TS-1187A-B-A-B | XKB Connectivity(中国星坤) | |
3 | Test-Point | TP1,TP2,TP3 | Test-Point-0.5mm | |||
4 | 74HC595D,118 | U1,U7,U11,U14 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | 74HC595D,118 | Nexperia(安世) | |
4 | ULN2003ADR | U2,U8,U12,U15 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | ULN2003ADR | TI(德州仪器) | |
3 | EL3H7(B)(TA)-G | U3,U4,U5 | SOP-4_L4.4-W2.8-P1.27-LS7.0-TL | EL3H7(B)(TA)-G | EVERLIGHT(亿光) | |
1 | XL1509-5.0E1 | U6 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | XL1509-5.0E1 | XLSEMI(芯龙) | |
1 | LM2594M-3.3 | U9 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | LM2594M-3.3 | UMW(广东友台半导体) | |
1 | CH340C | U10 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | CH340C | WCH(南京沁恒) | |
1 | ESP32-WROOM-32D-N4 | U13 | WIFIM-SMD_39P-L25.5-W18.0-P1.27-BL | ESP32-WROOM-32D-N4 | ESPRESSIF(乐鑫) | |
1 | USB-TYPE-C-018 | USB1 | USB-C_SMD-TYPE-C-31-M-12 | USB-TYPE-C-018 | DEALON(德艺隆) |
CODIGO ARDUINO

//librerias #define EEPROM_SIZE 64 #include <EEPROM.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ //PINES DE ENTRADA DE LOS PULSADORES █ const int in_A = 34; //ADD █ const int in_B = 32; //LESS █ const int swPin = 35; //OK █ bool btnpress = false; //memoria boton OK █ //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ //PINES DE SALIDA PARA CONTROLAR LOS Displays byte clockpin = 27; //Cuando ay que leer los bit SH byte data = 12; //Envio datos DS byte latch = 14; //indica pin de salida en el chip ST //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ //======================== DATOS CONVERSION ENTEROS A BINARIOS ================================= const int NUM[] = { 191, //Numero 0 en binario es : 10111111 = 0 134, //Numero 1 en binario es : 10000110 = 1 219, //Numero 2 en binario es : 11011011 = 2 207, //Numero 3 en binario es : 11001111 = 3 230, //Numero 4 en binario es : 11100110 = 4 237, //Numero 5 en binario es : 11101101 = 5 253, //Numero 6 en binario es : 11111101 = 6 135, //Numero 7 en binario es : 10000111 = 7 255, //Numero 8 en binario es : 11111111 = 8 239, //Numero 9 en binario es : 11101111 = 9 191, //Numero 0 en binario es : 10111111 = 10 }; //============================================================================================== ///////////////////////////////////// VARIABLES PARA CONTEO DE DISPLAYS ///////////////////////////// //Display de precios byte contador_fatal = 0; // se usa directo al display byte contador_dieselPro_DISPLAY[4] = { 0, 0, 0, 0 }; byte contador_gasolina95_DISPLAY[4] = { 0, 0, 0, 0 }; byte contador_gasolina90_DISPLAY[4] = { 0, 0, 0, 0 }; byte contador_gasolina84_DISPLAY[4] = { 0, 0, 0, 0 }; //MEMORIA int contador_dieselPro_M = 0; //Memoria incapacitantes int contador_gasolina95_M = 0; //Memoria leve int contador_gasolina90_M = 0; //Memoria incidentes int contador_gasolina84_M = 0; //Memoria subestandard // Variables para almacenar el estado de la contraseña int password[4] = { 0, 0, 0, 0 }; int currentDigit = 0; int currentPosition = 0; // Contraseña correcta const int correctPassword[4] = { 0, 0, 0, 0 }; bool isCorrect = false; ////////////////////////DIRECCION PARA ALMACENAR EN LA MENORIA EEPROM unsigned int direc_dieselPro = 0; // Direccion EEPROM para almacenar precio Diesel pro unsigned int direc_gasolina95 = 8; // Direccion EEPROM para almacenar gasolina 95 unsigned int direc_gasolina90 = 16; // Direccion EEPROM para almacenar gasolina 90 unsigned int direc_gasolina84 = 32; // Direccion EEPROM para almacenar gasolina 84 //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ //----------------------------------------------------------------------MENUS------------------------------------------------------------------------------- String menu1[] = { "DIESEL PRO", "GASOLINA 95", "GASOLINA 90", "GASOLINA 84", "Atras" }; //Palabras del menu principal int sizemenu1 = sizeof(menu1) / sizeof(menu1[0]); String linea1, linea2; //lines o filas del lcd 16x2 int level_menu = 0; // para ubicarnos en un menú int contador = 0; // CONTADOR PARA EL DESPLAZAMIENTO ENTRE LOS MENUS byte flecha[] = { B10000, B11000, B11100, B11110, B11100, B11000, B10000, B00000 }; //Creamos un array de 8 posiciones para la flecha del menu //▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ void setup() { EEPROM.begin(EEPROM_SIZE); // Serial.begin(9600); pinMode(in_A, INPUT); pinMode(in_B, INPUT); pinMode(swPin, INPUT); // OUTPUTS to 74HC959 pinMode(clockpin, OUTPUT); pinMode(data, OUTPUT); pinMode(latch, OUTPUT); lcd.init(); lcd.backlight(); lcd.createChar(0, flecha); //Caracter personalizado contador_dieselPro_M = EEPROM.read(direc_dieselPro); contador_gasolina95_M = EEPROM.read(direc_gasolina95); contador_gasolina90_M = EEPROM.read(direc_gasolina90); contador_gasolina84_M = EEPROM.read(direc_gasolina84); init_displays(); cont(); updateLCD(); } void loop() { selectOption(); //Funcion para detectar cuando se Presionar el pusador de OK //███████████████████████████████████ PANTALLA PRINCIPAL ██████████████████████████████████████████ if (level_menu == 0) { if (digitalRead(in_B) == HIGH) { if (password[currentPosition] > 0) { password[currentPosition]--; } else { password[currentPosition] = 9; } updateLCD(); delay(250); // Debouncing } if (btnpress) { if (currentPosition < 3) { currentPosition++; } else { verifyPassword(); currentPosition = 0; // Resetear para ingresar una nueva contraseña } updateLCD(); btnpress = false; } if (digitalRead(in_A) == HIGH) { if (password[currentPosition] < 9) { password[currentPosition]++; } else { password[currentPosition] = 0; } updateLCD(); delay(250); // Debouncing } if (isCorrect == true) { // si se presiona el pulsador de OK nos llevará al menu principal level_menu = 1; fn_menu(contador, menu1, sizemenu1); } } //███████████████████████████████████████████████████████████████████████████████████████████████ //███████████████████████████████████ MENU 1 PRINCIPAL ██████████████████████████████████████████ if (level_menu == 1) { //Esta variable corresponde al nivel principal del menu. level_menu = 1. if (fnSwitch(sizemenu1)) { //Esta funcion muestra en el LCD el menu en el que estamos fn_menu(contador, menu1, sizemenu1); //Esta funcion muestra la posicion dentro de ese menu segun el valor de la variable contador } if (btnpress) { //Verificamos si el boton del encoder fue oprimido. btnpress == true // DIESEL PRO if (contador == 0) { //contador = contador_dieselPro_M; lcd.clear(); // Variables para manejar los dígitos int digitoActivo = 0; // Dígito actual (0: unidades, 1: decenas, 2: centenas, 3: millares) bool salir = false; // Control para salir del bucle do { // Actualizamos los dígitos en el arreglo según el contador contador_dieselPro_DISPLAY[0] = contador_dieselPro_M % 10; // Unidades contador_dieselPro_DISPLAY[1] = (contador_dieselPro_M / 10) % 10; // Decenas contador_dieselPro_DISPLAY[2] = (contador_dieselPro_M / 100) % 10; // Centenas contador_dieselPro_DISPLAY[3] = (contador_dieselPro_M / 1000); // Millares lcd.setCursor(0, 0); lcd.print("DIESEL PRO"); // Mostrar el precio completo en el LCD lcd.setCursor(0, 1); lcd.print("Precio: "); lcd.print(contador_dieselPro_DISPLAY[3]); // Millares lcd.print(contador_dieselPro_DISPLAY[2]); // Centenas lcd.print(contador_dieselPro_DISPLAY[1]); // Decenas lcd.print(contador_dieselPro_DISPLAY[0]); // Unidades // Mostrar el dígito activo en el LCD lcd.setCursor(0, 2); lcd.print("Digito: "); lcd.print(digitoActivo); // Incrementar o decrementar el dígito activo if (digitalRead(in_A) == HIGH) { // Incrementar if (contador_dieselPro_DISPLAY[digitoActivo] < 9) { contador_dieselPro_DISPLAY[digitoActivo]++; } else { contador_dieselPro_DISPLAY[digitoActivo] = 0; // Reinicia si llega a 9 } delay(200); // Pequeña espera para evitar múltiples incrementos } if (digitalRead(in_B) == HIGH) { // Decrementar if (contador_dieselPro_DISPLAY[digitoActivo] > 0) { contador_dieselPro_DISPLAY[digitoActivo]--; } else { contador_dieselPro_DISPLAY[digitoActivo] = 9; // Reinicia si llega a 0 } delay(200); // Pequeña espera para evitar múltiples decrementos } // Cambiar el dígito activo if (digitalRead(swPin) == HIGH) { // Selección de dígito if (digitoActivo < 3) { digitoActivo++; // Cambia al siguiente dígito } else { salir = true; // Salimos del bucle al confirmar el último dígito } delay(200); } // Actualizamos el contador según los valores de los dígitos contador_dieselPro_M = contador_dieselPro_DISPLAY[3] * 1000 + contador_dieselPro_DISPLAY[2] * 100 + contador_dieselPro_DISPLAY[1] * 10 + contador_dieselPro_DISPLAY[0]; // Mostrar los dígitos en el display de 7 segmentos cont(); } while (!salir); // Se repite mientras no se confirme el último dígito delay(500); // Guardamos el valor final en la EEPROM EEPROM.put(direc_dieselPro, contador_dieselPro_M); EEPROM.commit(); // Regresamos al menú principal contador = 0; fn_menu(contador, menu1, sizemenu1); level_menu = 1; } // > GASOLINA 95 if (contador == 1) { //contador = contador_gasolina95_M; lcd.clear(); int digitoActivo = 0; // Dígito actual (0: unidades, 1: decenas, 2: centenas, 3: millares) bool salir = false; // Control para salir del bucle do { // Actualizamos los dígitos en el arreglo según el contador contador_gasolina95_DISPLAY[0] = contador_gasolina95_M % 10; // Unidades contador_gasolina95_DISPLAY[1] = (contador_gasolina95_M / 10) % 10; // Decenas contador_gasolina95_DISPLAY[2] = (contador_gasolina95_M / 100) % 10; // Centenas contador_gasolina95_DISPLAY[3] = (contador_gasolina95_M / 1000); // Millares lcd.setCursor(0, 0); lcd.print("DIESEL PRO"); // Mostrar el precio completo en el LCD lcd.setCursor(0, 1); lcd.print("Precio: "); lcd.print(contador_gasolina95_DISPLAY[3]); // Millares lcd.print(contador_gasolina95_DISPLAY[2]); // Centenas lcd.print(contador_gasolina95_DISPLAY[1]); // Decenas lcd.print(contador_gasolina95_DISPLAY[0]); // Unidades // Mostrar el dígito activo en el LCD lcd.setCursor(0, 2); lcd.print("Digito: "); lcd.print(digitoActivo); // Incrementar o decrementar el dígito activo if (digitalRead(in_A) == HIGH) { // Incrementar if (contador_gasolina95_DISPLAY[digitoActivo] < 9) { contador_gasolina95_DISPLAY[digitoActivo]++; } else { contador_gasolina95_DISPLAY[digitoActivo] = 0; // Reinicia si llega a 9 } delay(200); // Pequeña espera para evitar múltiples incrementos } if (digitalRead(in_B) == HIGH) { // Decrementar if (contador_gasolina95_DISPLAY[digitoActivo] > 0) { contador_gasolina95_DISPLAY[digitoActivo]--; } else { contador_gasolina95_DISPLAY[digitoActivo] = 9; // Reinicia si llega a 0 } delay(200); // Pequeña espera para evitar múltiples decrementos } // Cambiar el dígito activo if (digitalRead(swPin) == HIGH) { // Selección de dígito if (digitoActivo < 3) { digitoActivo++; // Cambia al siguiente dígito } else { salir = true; // Salimos del bucle al confirmar el último dígito } delay(200); } // Actualizamos el contador según los valores de los dígitos contador_gasolina95_M = contador_gasolina95_DISPLAY[3] * 1000 + contador_gasolina95_DISPLAY[2] * 100 + contador_gasolina95_DISPLAY[1] * 10 + contador_gasolina95_DISPLAY[0]; // Mostrar los dígitos en el display de 7 segmentos cont(); } while (!salir); // Se repite mientras no se confirme el último dígito delay(500); EEPROM.put(direc_gasolina95, contador_gasolina95_M); // Se agrega a EEPROM con la dirección primero y valor de la variable después EEPROM.commit(); contador = 1; fn_menu(contador, menu1, sizemenu1); level_menu = 1; } //> GASOLINA 90 if (contador == 2) { contador = contador_gasolina90_M; lcd.clear(); int digitoActivo = 0; // Dígito actual (0: unidades, 1: decenas, 2: centenas, 3: millares) bool salir = false; // Control para salir del bucle do { // Actualizamos los dígitos en el arreglo según el contador contador_gasolina90_DISPLAY[0] = contador_gasolina90_M % 10; // Unidades contador_gasolina90_DISPLAY[1] = (contador_gasolina90_M / 10) % 10; // Decenas contador_gasolina90_DISPLAY[2] = (contador_gasolina90_M / 100) % 10; // Centenas contador_gasolina90_DISPLAY[3] = (contador_gasolina90_M / 1000); // Millares lcd.setCursor(0, 0); lcd.print("DIESEL PRO"); // Mostrar el precio completo en el LCD lcd.setCursor(0, 1); lcd.print("Precio: "); lcd.print(contador_gasolina90_DISPLAY[3]); // Millares lcd.print(contador_gasolina90_DISPLAY[2]); // Centenas lcd.print(contador_gasolina90_DISPLAY[1]); // Decenas lcd.print(contador_gasolina90_DISPLAY[0]); // Unidades // Mostrar el dígito activo en el LCD lcd.setCursor(0, 2); lcd.print("Digito: "); lcd.print(digitoActivo); // Incrementar o decrementar el dígito activo if (digitalRead(in_A) == HIGH) { // Incrementar if (contador_gasolina90_DISPLAY[digitoActivo] < 9) { contador_gasolina90_DISPLAY[digitoActivo]++; } else { contador_gasolina90_DISPLAY[digitoActivo] = 0; // Reinicia si llega a 9 } delay(200); // Pequeña espera para evitar múltiples incrementos } if (digitalRead(in_B) == HIGH) { // Decrementar if (contador_gasolina90_DISPLAY[digitoActivo] > 0) { contador_gasolina90_DISPLAY[digitoActivo]--; } else { contador_gasolina90_DISPLAY[digitoActivo] = 9; // Reinicia si llega a 0 } delay(200); // Pequeña espera para evitar múltiples decrementos } // Cambiar el dígito activo if (digitalRead(swPin) == HIGH) { // Selección de dígito if (digitoActivo < 3) { digitoActivo++; // Cambia al siguiente dígito } else { salir = true; // Salimos del bucle al confirmar el último dígito } delay(200); } // Actualizamos el contador según los valores de los dígitos contador_gasolina90_M = contador_gasolina90_DISPLAY[3] * 1000 + contador_gasolina90_DISPLAY[2] * 100 + contador_gasolina90_DISPLAY[1] * 10 + contador_gasolina90_DISPLAY[0]; // Mostrar los dígitos en el display de 7 segmentos cont(); } while (!salir); // Se repite mientras no se confirme el último dígito delay(500); EEPROM.put(direc_gasolina90, contador_gasolina90_M); // Se agrega a EEPROM con la dirección primero y valor de la variable después EEPROM.commit(); contador = 2; fn_menu(contador, menu1, sizemenu1); level_menu = 1; } //> GASOLINA 84 if (contador == 3) { contador = contador_gasolina84_M; lcd.clear(); int digitoActivo = 0; // Dígito actual (0: unidades, 1: decenas, 2: centenas, 3: millares) bool salir = false; // Control para salir del bucle do { // Actualizamos los dígitos en el arreglo según el contador contador_gasolina84_DISPLAY[0] = contador_gasolina84_M % 10; // Unidades contador_gasolina84_DISPLAY[1] = (contador_gasolina84_M / 10) % 10; // Decenas contador_gasolina84_DISPLAY[2] = (contador_gasolina84_M / 100) % 10; // Centenas contador_gasolina84_DISPLAY[3] = (contador_gasolina84_M / 1000); // Millares lcd.setCursor(0, 0); lcd.print("DIESEL PRO"); // Mostrar el precio completo en el LCD lcd.setCursor(0, 1); lcd.print("Precio: "); lcd.print(contador_gasolina84_DISPLAY[3]); // Millares lcd.print(contador_gasolina84_DISPLAY[2]); // Centenas lcd.print(contador_gasolina84_DISPLAY[1]); // Decenas lcd.print(contador_gasolina84_DISPLAY[0]); // Unidades // Mostrar el dígito activo en el LCD lcd.setCursor(0, 2); lcd.print("Digito: "); lcd.print(digitoActivo); // Incrementar o decrementar el dígito activo if (digitalRead(in_A) == HIGH) { // Incrementar if (contador_gasolina84_DISPLAY[digitoActivo] < 9) { contador_gasolina84_DISPLAY[digitoActivo]++; } else { contador_gasolina84_DISPLAY[digitoActivo] = 0; // Reinicia si llega a 9 } delay(200); // Pequeña espera para evitar múltiples incrementos } if (digitalRead(in_B) == HIGH) { // Decrementar if (contador_gasolina84_DISPLAY[digitoActivo] > 0) { contador_gasolina84_DISPLAY[digitoActivo]--; } else { contador_gasolina84_DISPLAY[digitoActivo] = 9; // Reinicia si llega a 0 } delay(200); // Pequeña espera para evitar múltiples decrementos } // Cambiar el dígito activo if (digitalRead(swPin) == HIGH) { // Selección de dígito if (digitoActivo < 3) { digitoActivo++; // Cambia al siguiente dígito } else { salir = true; // Salimos del bucle al confirmar el último dígito } delay(200); } // Actualizamos el contador según los valores de los dígitos contador_gasolina84_M = contador_gasolina84_DISPLAY[3] * 1000 + contador_gasolina84_DISPLAY[2] * 100 + contador_gasolina84_DISPLAY[1] * 10 + contador_gasolina84_DISPLAY[0]; // Mostrar los dígitos en el display de 7 segmentos cont(); } while (!salir); // Se repite mientras no se confirme el último dígito delay(500); EEPROM.put(direc_gasolina84, contador_gasolina84_M); // Se agrega a EEPROM con la dirección primero y valor de la variable después EEPROM.commit(); contador = 3; fn_menu(contador, menu1, sizemenu1); level_menu = 1; } //>Atras if (contador == 4) { contador = 0; level_menu = 0; isCorrect = false; password[0] = 0; password[1] = 0; password[2] = 0; password[3] = 0; updateLCD(); } btnpress = false; // Nos aseguramos que esta variable de retorno de la funcion selectOption() vuelva a su estado inicial } } //██████████████████████████████████████████████████████████████████████████████████████████████████████████████ } //██████████████████████████████████████████████████████████████████████████████████████████████████████████████ void updateLCD() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ingrese Contra:"); lcd.setCursor(0, 1); for (int i = 0; i < 4; i++) { if (i == currentPosition) { lcd.print(password[i]); } else { lcd.print("*"); // Mostrar asteriscos para los dígitos confirmados } lcd.print(" "); } } void verifyPassword() { isCorrect = true; for (int i = 0; i < 4; i++) { if (password[i] != correctPassword[i]) { isCorrect = false; break; } } lcd.clear(); lcd.setCursor(0, 0); if (isCorrect) { lcd.print("Contra correct"); } else { lcd.print("Contra Incorrect"); } delay(2000); // Esperar 2 segundos antes de resetear } void selectOption() { //funcion para leer el pulsador de ok if (digitalRead(swPin) == HIGH) { delay(500); btnpress = true; } } void fn_contador_INC_DEC() { // FUNCION INCREMENTAR Y DECREMENTAR if (digitalRead(in_A) == HIGH) { contador++; delay(250); } else if (digitalRead(in_B) == HIGH) { contador--; delay(250); } /*if (contador > 9) { contador = 9; }*/ if (contador < 0) { contador = 0; } } void fn_menu(int pos, String menus[], byte sizemenu) { // funcion de desplazamiento de los menús lcd.clear(); linea1 = ""; linea2 = ""; if ((pos % 2) == 0) { lcd.setCursor(0, 0); lcd.write(byte(0)); linea1 = menus[pos]; if (pos + 1 != sizemenu) { linea2 = menus[pos + 1]; } } else { linea1 = menus[pos - 1]; lcd.setCursor(0, 1); lcd.write(byte(0)); linea2 = menus[pos]; } lcd.setCursor(1, 0); lcd.print(linea1); lcd.setCursor(1, 1); lcd.print(linea2); } bool fnSwitch(byte sizemenu) { //Lee las señales de los pulsadores, exepto el de ok bool retorno = false; if (digitalRead(in_A) == HIGH || digitalRead(in_B) == HIGH) { if (digitalRead(in_A) == HIGH) { contador++; delay(250); } else if (digitalRead(in_B) == HIGH) { contador--; delay(250); } if (contador <= 0) { contador = 0; } if (contador >= sizemenu - 1) { contador = sizemenu - 1; } retorno = true; } return retorno; } void init_displays() { contador_gasolina84_DISPLAY[0] = contador_gasolina84_M % 10; //unidades contador_gasolina84_DISPLAY[1] = (contador_gasolina84_M / 10) % 10; //decenas contador_gasolina84_DISPLAY[2] = (contador_gasolina84_M / 100) % 10; //centenas contador_gasolina84_DISPLAY[2] = (contador_gasolina84_M / 100); //centenas contador_gasolina90_DISPLAY[0] = contador_gasolina90_M % 10; //unidades contador_gasolina90_DISPLAY[1] = (contador_gasolina90_M / 10) % 10; //decenas contador_gasolina90_DISPLAY[2] = (contador_gasolina90_M / 100) % 10; //centenas contador_gasolina90_DISPLAY[2] = (contador_gasolina90_M / 100); //centenas contador_gasolina95_DISPLAY[0] = contador_gasolina95_M % 10; //unidades contador_gasolina95_DISPLAY[1] = (contador_gasolina95_M / 10) % 10; //decenas contador_gasolina95_DISPLAY[2] = (contador_gasolina95_M / 100) % 10; //centenas contador_gasolina95_DISPLAY[2] = (contador_gasolina95_M / 100); //centenas contador_dieselPro_DISPLAY[0] = contador_dieselPro_M % 10; contador_dieselPro_DISPLAY[1] = (contador_dieselPro_M / 10) % 10; contador_dieselPro_DISPLAY[2] = (contador_dieselPro_M / 100) % 10; contador_dieselPro_DISPLAY[2] = (contador_dieselPro_M / 1000); } void cont() { //funncion salidas para los displays digitalWrite(latch, LOW); //gasolina84 shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina84_DISPLAY[0]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina84_DISPLAY[1]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina84_DISPLAY[2]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina84_DISPLAY[3]]); //gasolina90 shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina90_DISPLAY[0]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina90_DISPLAY[1]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina90_DISPLAY[2]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina90_DISPLAY[3]]); //gasolina95 shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina95_DISPLAY[0]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina95_DISPLAY[1]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina95_DISPLAY[2]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_gasolina95_DISPLAY[3]]); //dieselPro shiftOut(data, clockpin, MSBFIRST, NUM[contador_dieselPro_DISPLAY[0]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_dieselPro_DISPLAY[1]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_dieselPro_DISPLAY[2]]); shiftOut(data, clockpin, MSBFIRST, NUM[contador_dieselPro_DISPLAY[3]]); digitalWrite(latch, HIGH); }