Hola a todos, tengo un problema a la hora de tomar un carácter del teclado 4x4 y usarlo para saltar a un modulo mediante un if, lo curioso, es que solo se produce en un determinado if, la parte del código que me refiero es la comentada como "INGRESO MENU 3", no tengo idea cual es la causante del problema, ya que el resto funciona perfecto, espero que puedan ayudarme.
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
char pulsacion; // almacena la tecla pulsada
int contador = 1; // cuenta el nivel del menu en el que se esta
int decimal = 0;
int alto = 0;
int ancho;
int i = 0;
int alto_actual;
char test;
const byte ROWS = 4; //Cuatro Filas
const byte COLS = 4; //Cuatro Columnas
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}; //Puntos de conexion del teclado al arduino FILAS
byte colPins[COLS] = {5,4,3,2};
Keypad Teclado1 = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Configura el teclado
LiquidCrystal_I2C lcd(0x27,16,2); // dependiendo del fabricante del I2C el codigo 0x27 cambiar a
// 0x3F , 0x20 , 0x38 ,
////////////////////////////////// Void Setup() ///////////
void setup () {
Serial.begin(9600);
lcd.init();
lcd.backlight();
intro_0(); // muestra el intro de bienvenida
mostrar_menu(1);
}
////////////////////////// Void loop() ///////////////////////
void loop(){
char key = Teclado1.getKey();
if (key){
if (key == '#') {
if(contador!=0 or contador!=4 ){
mod_contador(1);
mostrar_menu(contador);
i = 0;
alto = 0;
}
} else if(key == '*'){
if(contador!=0 or contador!=4 ){
mod_contador(-1);
mostrar_menu(contador);
i = 0;
alto = 0;
}
} else if (contador == 1){
if (key == 'A'){
ancho = 5;
menu_1(5);
} else if(key == 'B'){
ancho = 10;
menu_1(10);
}
///////////////////INGRESO MEDIDA MENU 2 ////////////////////////////
} else if(contador == 2){
if (i<=2) {
if(key =='1'){
decimal = 1;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='2'){
decimal = 2;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='3'){
decimal = 3;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='4'){
decimal = 4;
alto_actual = alto= alto*10+decimal;;
i++;
menu_2();
} else if(key =='5'){
decimal = 5;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='6'){
decimal = 6;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='7'){
decimal = 7;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='8'){
decimal = 8;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='9'){
decimal = 9;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
} else if(key =='0'){
decimal = 0;
alto_actual = alto= alto*10+decimal;
i++;
menu_2();
///////////////////////INGRESO MENU 3 ////////////////////////////////
} else if (contador == 3) {
if (key =='A') {programaA();}
}
if ((contador == 2) and (alto_actual > 300)) {advertencia();} //// advertencia/////
if ((contador == 2) and (i >= 3)) {
i = 0;
alto = 0;
}
}
}
}
}
///////// Fin del void loop(), inician las Funciones///////////////
void mod_contador(int c){
contador = contador + c;
if (contador == 0){
contador = 1;
} else if (contador == 4){
contador = 3;
}
}
/////////////////////Intro_0 //////////////////////////////
void intro_0(){
lcd.clear(); // Borra el LCD
lcd.setCursor(3,0); // Se posiciona en la Columna 3, Fila 0
lcd.print("BIENVENIDO ");
lcd.setCursor(1,1);
lcd.print("INICIALIZANDO");
delay(1000); // espera 4 segundos mostrando el intro
lcd.clear();
}
/////////////////////Menu_1 //////////////////////////////////
void mostrar_menu(int c){
if(c==1){
menu_1(0);
} else if (c==2){
menu_2();
} else if (c==3){
menu_3();
}
}
void menu_1(int ancho_actual){
lcd.clear();
ancho = ancho_actual;
lcd.setCursor(0,0);
lcd.print("Largo Rollo:");
lcd.setCursor(13,0);
lcd.print(ancho_actual);
lcd.setCursor(15,0);
lcd.print("M");
lcd.setCursor(0,1);
lcd.print("A- 5M B- 10M ->#");
}
/////////////////////Menu_2 //////////////////////////////////
void menu_2(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Medida:");
lcd.setCursor(8,0);
lcd.print(alto);
lcd.setCursor(11,0);
lcd.print ("*");
lcd.setCursor(13,0);
lcd.print (ancho);
lcd.setCursor(15,0);
lcd.print ("m");
lcd.setCursor(0,1);
lcd.print("* <-- --> #");
}
/////////////////////Menu_3 //////////////////////////////////
void menu_3(){
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(test);
lcd.setCursor(9, 0);
lcd.print(contador);
lcd.setCursor(1, 1);
lcd.print("C-2P");
lcd.setCursor(9, 1);
lcd.print("D-2,5P");
}
/////////////////////Programa A //////////////////////////////////
void programaA() {
lcd.setCursor(1, 0);
lcd.print("Confirmar");
}
//////////////// ADVERTENCIA MEDIDA ////////////////////////////
void advertencia() {
lcd.clear();
lcd.setCursor(2,0);
lcd.print("¡ATENCION");
lcd.setCursor(0,1);
lcd.print("El limite es 3M");
delay(1500);
alto = 0;
contador = 2;
menu_2();
}