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);
}




