Problema teclado I2C envuelto en switch-case

Buenas.

Llevo unos días dándole vueltas y no funciona el enunciado que he presentado.
Se trata de un teclado conectado vía BUS I2C donde realiza en dos salidas digitales PWM el control de dos pin´s para dos diodos LED´s que van desvaneciendo su brillo y/o aumentando.

Con este código funciona correctamente;

#include <LiquidCrystal_I2C.h>
#include <Keypad_I2C.h>
#include <Wire.h>


#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

#define I2CADDR 0x21   // DIRECCION I2C TECLADO
#define I2C_ADDR  0x27  // DIRECCION I2C LCD
const byte ROWS = 4;  
const byte COLS = 4;  
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {0, 1, 2, 3};  
byte colPins[COLS] = {4, 5, 6, 7};  



LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR );


const int PIN_BRILLO = 9;        //Pin salida brillo
const int PIN_CONTRASTE = 10;    //Pin salida contraste

int brillo = 100;                //Iniciamos variable brillo 50%
int contraste = 100;             //Iniciamos variable contraste 50%

int buttonCambio = 0;  
int buttonMax = 0;
int buttonMin = 0;
int estadoCambio = 0;

int valMaxLcd = 255;
int valMinLcd = 0;

void setup() {
        lcd.begin(20, 4); 
        lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
        lcd.setBacklight(HIGH);
         Wire.begin( );
        kpd.begin( makeKeymap(keys) );
        Serial.begin(9600);
        Serial.println( "start" );
  
        analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
        analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);

       lcd.setCursor(11,1);
       lcd.print(brillo);
       lcd.setCursor(11,2);
       lcd.print(contraste);

       lcd.setCursor(14,1);
       lcd.print("%");
       lcd.setCursor(14,2);
       lcd.print("%");
       lcd.setCursor(11,1);
       lcd.cursor();
}

void loop() {

      lcd.setCursor(4, 0);
       lcd.print("MENU SETUP");
       lcd.setCursor(0, 1);
       lcd.print("Brillo:");
       lcd.setCursor(0,2);
       lcd.print("Contraste:");
       
     char key = kpd.getKey();
     buttonCambio =(key == '*');    //  PARA EL TECLADO TECLA NUMERO 2
  
           if (buttonCambio == 1) {  // HIGH

        if(estadoCambio == 0){
        estadoCambio = 1;     
        lcd.noCursor();       
        lcd.setCursor(11,2);  
        lcd.cursor();         
        delay(100);
          } 
           else
         {
     
          estadoCambio = 0;
          lcd.noCursor();
          lcd.setCursor(11,1);
          lcd.cursor();
         delay(100);
    }
  }

     buttonMax =(key == '2');    // SUPRIMIR CASO DE LOS INTERUPTORES
     buttonMin =(key == '1');    // SUPRIMIR CASO DE LOS INTERUPTORES
  
       if (buttonMax == 1) {   //HIGH
         if(estadoCambio == 0){     //Si es activo aumentamos es valor de brillo
             brillo = brillo + 1;
    
      analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
      lcd.setCursor(11,1);
      lcd.print(brillo);
       }
           else
       {                   
            contraste = contraste + 1;
        analogWrite(PIN_CONTRASTE,(contraste*valMaxLcd)/100);
        lcd.setCursor(11,2);
        lcd.print(contraste);
           }
        }
          if (buttonMin == 1) {   // HIGH
           if(estadoCambio == 0){
        brillo = brillo - 1;
        analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
        lcd.setCursor(11,1);
        lcd.print(brillo);
              }
           else
           {
      contraste = contraste - 1;
      analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);
      lcd.setCursor(11,2);
      lcd.print(contraste);
    }
  }
  
        switch (key) {
            case 'A':   
                 
               break;
            case 'B':
                menu();      // FUNCION 2
              break;
            case 'C':
                  menu_dos();    //  FUNCION 2
              break;
       }
    
  
  if (key){
    Serial.println(key);
  }
 //  delay(50);
 
}



void menu_dos(){


  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   MENU LCD 2");
    lcd.setCursor(0, 1);
  lcd.print("Brillo:");
  lcd.setCursor(0,2);
  lcd.print("Contraste:");
  lcd.setCursor(0, 3);
  lcd.print(brillo);
  lcd.setCursor(10, 3);
  lcd.print(contraste);
  }



  void menu(){


  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   MENU LCD 1");
    lcd.setCursor(0, 1);
  lcd.print("Brillo:");
  lcd.setCursor(0,2);
  lcd.print("Contraste:");

  }

En el switch-case del final que hay en el loop, lo he puesto como ejemplo y dando por hecho que funciona pulsando las teclas A, B y C respondiendo correctamente el LCD en su presentación.

El problema viene que quiero controlar otros 4 diodos LED´s mas y entonces pensé (creo que mal, porque no funciona…) ponerlos en función y que el switch-case obligue a la función. El resultado es que lo lee el teclado. Concretamente este sería el código del cual no salgo y no funciona.

Adjunto el fichero que no funciona, y lo hago porque me dice que excedo de los 9000 caracteres del mensaje.

y de aquí no salgo, estoy en loop… he llegado a pensar si es problema de la librería keypad_I2C que no funcione con switch-case y la versión que tengo es la ultima de github del autor.
go.

No entiendo como con pulsadores llamando a la función se ejecuta pero con el teclado no. Espero una ayuda de todos. Saludos.

NoFunciona.ino (4.2 KB)

A todo informo que no da error alguno.
Hoy pongo el código que no funciona;

#include <LiquidCrystal_I2C.h>
#include <Keypad_I2C.h>
#include <Wire.h>



#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

#define I2CADDR 0x21   // DIRECCION I2C TECLADO
#define I2C_ADDR  0x27  // DIRECCION I2C LCD
const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {0, 1, 2, 3}; 
byte colPins[COLS] = {4, 5, 6, 7}; 



LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR );


const int PIN_BRILLO = 9;       
const int PIN_CONTRASTE = 10;   

int brillo = 100;             
int contraste = 100;           

int buttonCambio = 0; 
int buttonMax = 0;
int buttonMin = 0;
int estadoCambio = 0;

int valMaxLcd = 255;
int valMinLcd = 0;

void setup() {
        lcd.begin(20, 4);
        lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
        lcd.setBacklight(HIGH);
         Wire.begin( );
        kpd.begin( makeKeymap(keys) );
        Serial.begin(9600);
        Serial.println( "start" );
 
        analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
        analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);

       lcd.setCursor(11,1);
       lcd.print(brillo);
       lcd.setCursor(11,2);
       lcd.print(contraste);

       lcd.setCursor(14,1);
       lcd.print("%");
       lcd.setCursor(14,2);
       lcd.print("%");
       lcd.setCursor(11,1);
       lcd.cursor();
}

void loop() {
  char key = kpd.getKey();
 
        switch (key) {
            case 'A':   
                  menu_uno();   // FUNCION 1
               break;
            case 'B':
                  menu();      // FUNCION 2
              break;
            case 'C':
                  menu_dos();
              break;
       }
    }


void menu_uno(){


       lcd.setCursor(4, 0);
       lcd.print("MENU SETUP");
       lcd.setCursor(0, 1);
       lcd.print("Brillo:");
       lcd.setCursor(0,2);
       lcd.print("Contraste:");
          char key = kpd.getKey();
          buttonCambio =(key == '*');   
 
           if (buttonCambio == 1) {  // HIGH

        if(estadoCambio == 0){
        estadoCambio = 1;     
        lcd.noCursor();       
        lcd.setCursor(11,2); 
        lcd.cursor();         
        delay(100);
          }
           else
         {
     
          estadoCambio = 0;
          lcd.noCursor();
          lcd.setCursor(11,1);
          lcd.cursor();
         delay(100);
            }
          }

         buttonMax =(key == '2');   
         buttonMin =(key == '1');   
 
       if (buttonMax == 1) { 
         if(estadoCambio == 0){   
             brillo = brillo + 1;
   
      analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
      lcd.setCursor(11,1);
      lcd.print(brillo);
       }
           else
       {                   
            contraste = contraste + 1;
        analogWrite(PIN_CONTRASTE,(contraste*valMaxLcd)/100);
        lcd.setCursor(11,2);
        lcd.print(contraste);
           }
        }
          if (buttonMin == 1) { 
           if(estadoCambio == 0){
        brillo = brillo - 1;
        analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
        lcd.setCursor(11,1);
        lcd.print(brillo);
              }
           else
           {
      contraste = contraste - 1;
      analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);
      lcd.setCursor(11,2);
      lcd.print(contraste);
    }
  }
 
}

void menu_dos(){

   char key = kpd.getKey();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   MENU LCD 2");
    lcd.setCursor(0, 1);
  lcd.print("Brillo:");
  lcd.setCursor(0,2);
  lcd.print("Contraste:");
  lcd.setCursor(0, 3);
  lcd.print(brillo);
  lcd.setCursor(10, 3);
  lcd.print(contraste);
  }



  void menu(){

   char key = kpd.getKey();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   MENU LCD 1");
    lcd.setCursor(0, 1);
  lcd.print("Brillo:");
  lcd.setCursor(0,2);
  lcd.print("Contraste:");

  }