Teclado 4x4 no toma valor en un determinado if.

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

Creo que tienes una gran confunción entre las variables y las condiciones planteadas.
Ejemplo. key controla lo que ingresas por la matriz 4x4
Luego tiene contador para supuestamente entrar en el menú de 1 a 3
y ademas una variable i que no se que controla.
Hay momentos que las 3 se siguen sin encontrar diferencia entre ellas. Claro que las hay per se mezclan y terminan haciendo cosas que no quieres.
Algo mejor ordenado sería que por un lado uses un switch case con las teclas del teclado matricial

  switch(key) {

    case '#':
                break;
   // y aasi con cada caso.
    case '1': // ahorro de muchas líneas
    case '2':
   // no puse los que faltan
    case '8':
    case '9': decimal = key-'0';
                 alto_actual = alto= alto*10+decimal;
                 i++;
                 break;
   }

Luego de delimitar todas las teclas ingresadas por teclado entonces decide que hacer con lo demás.
Pero no antes.

Ahora recuerdo que se puede poner algo asi
case '0' ... '9':
// cubres de 0 a 9 en ascii.

1 Like