Problema con encoder rotativo y switch case

#include <LiquidCrystal.h> 
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2;       //variable A a pin digital 2 (DT en modulo)
int CLK = 3;        //variable B a pin digital 4 (CLK en modulo)
int anterior = 0;    // almacena valor anterior de la variable POSICION
int menu = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
 
int lectura1 = digitalRead(DT); 
int lectura2 = digitalRead(btn1);   
 
void setup() {
  pinMode(btn1, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  pinMode(DT, INPUT);     // DT como entrada
  pinMode(CLK, INPUT);    // CLK como entrada
  
  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps
  attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW             
  Serial.println("Listo");  // imprime en monitor serial Listo
  
  lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)   
  lcd.setCursor(0, 0);
  lcd.print("INICIALIZANDO..");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SELECIONE OPCION");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
 
}


void loop() {
 

  if(lectura1 == 0){
    if(menu == 5){
      menu = 0;
    }
    menu++;

    switch(menu){
      case 1: Serial.println("Apagar");
              break;
      case 2: Serial.println("Subir volumen");
              break;
      case 3: Serial.println("Bajar volumen");
              break;
      case 4: Serial.println("Subir canal");
              break;
      case 5: Serial.println("Bajar canal");
              break;
    }
    while(!digitalRead(DT));
  }

  if(lectura2 == 0){
    if(menu == 1){
      if(estadotv == true){
        Serial.println("-> Apagando televisor...");
        digitalWrite(2, HIGH);
        delay(500);
        digitalWrite(2, LOW);
        estadotv = false;
      }else{
        Serial.println("-> TV apagada.");
      }
    }
    if(menu == 2 && estadotv == true){
      Serial.println("-> Subiendo volumen...");
      digitalWrite(3, HIGH);
      delay(500);
      digitalWrite(3, LOW);
    }
    if(menu == 3 && estadotv == true){
      Serial.println("-> Bajando volumen...");
      digitalWrite(4, HIGH);
      delay(500);
      digitalWrite(4, LOW);
    }
    if(menu == 4 && estadotv == true){
      Serial.println("-> Subiendo canal...");
      digitalWrite(5, HIGH);
      delay(500);
      digitalWrite(5, LOW);
    }
    if(menu == 5 && estadotv == true){
      Serial.println("-> Bajando canal...");
      digitalWrite(13, HIGH);
      delay(500);
      digitalWrite(13, LOW);
    }

    while(!digitalRead(btn2));
  }
} 
  if (menu != anterior) { // si el valor de POSICION es distinto de ANTERIOR
   Serial.println(menu); // imprime valor de POSICION
    anterior = menu ; // asigna a ANTERIOR el valor actualizado de POSICION
  }
}

void encoder()  {
  
  static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion          
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {  // rutina antirebote desestima pulsos menores a 5 mseg.       
      if (digitalRead(CLK) == HIGH)     // si B es HIGH, sentido horario
         {
            menu++ ;        // incrementa MENU en 1
            }
              else {          // si CLK es LOW, senti anti horario
               menu-- ;        // decrementa MENU en 1
               }
                  menu = min(5, max(1,menu));  // establece limite inferior de 0 y superior de 100 para MENU
                     ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo de la interrupcion en variable static
  }         
  }
#include <LiquidCrystal.h> 
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2;       //variable A a pin digital 2 (DT en modulo)
int CLK = 3;        //variable B a pin digital 4 (CLK en modulo)
int anterior = 0;    // almacena valor anterior de la variable POSICION
int menu = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
 
int lectura1 = digitalRead(DT); 
int lectura2 = digitalRead(btn1);   
 
void setup() {
  pinMode(btn1, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  pinMode(DT, INPUT);     // DT como entrada
  pinMode(CLK, INPUT);    // CLK como entrada
  
  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps
  attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW             
  Serial.println("Listo");  // imprime en monitor serial Listo
  
  lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)   
  lcd.setCursor(0, 0);
  lcd.print("INICIALIZANDO..");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SELECIONE OPCION");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
 
}


void loop() {
 

  if(lectura1 == 0){
    if(menu == 5){
      menu = 0;
    }
    menu++;

    switch(menu){
      case 1: Serial.println("Apagar");
              break;
      case 2: Serial.println("Subir volumen");
              break;
      case 3: Serial.println("Bajar volumen");
              break;
      case 4: Serial.println("Subir canal");
              break;
      case 5: Serial.println("Bajar canal");
              break;
    }
    while(!digitalRead(DT));
  }

  if(lectura2 == 0){
    if(menu == 1){
      if(estadotv == true){
        Serial.println("-> Apagando televisor...");
        digitalWrite(2, HIGH);
        delay(500);
        digitalWrite(2, LOW);
        estadotv = false;
      }else{
        Serial.println("-> TV apagada.");
      }
    }
    if(menu == 2 && estadotv == true){
      Serial.println("-> Subiendo volumen...");
      digitalWrite(3, HIGH);
      delay(500);
      digitalWrite(3, LOW);
    }
    if(menu == 3 && estadotv == true){
      Serial.println("-> Bajando volumen...");
      digitalWrite(4, HIGH);
      delay(500);
      digitalWrite(4, LOW);
    }
    if(menu == 4 && estadotv == true){
      Serial.println("-> Subiendo canal...");
      digitalWrite(5, HIGH);
      delay(500);
      digitalWrite(5, LOW);
    }
    if(menu == 5 && estadotv == true){
      Serial.println("-> Bajando canal...");
      digitalWrite(13, HIGH);
      delay(500);
      digitalWrite(13, LOW);
    }

    while(!digitalRead(btn2));
  }
} 
  if (menu != anterior) { // si el valor de POSICION es distinto de ANTERIOR
   Serial.println(menu); // imprime valor de POSICION
    anterior = menu ; // asigna a ANTERIOR el valor actualizado de POSICION
  }
}

void encoder()  {
  
  static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion          
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {  // rutina antirebote desestima pulsos menores a 5 mseg.       
      if (digitalRead(CLK) == HIGH)     // si B es HIGH, sentido horario
         {
            menu++ ;        // incrementa MENU en 1
            }
              else {          // si CLK es LOW, senti anti horario
               menu-- ;        // decrementa MENU en 1
               }
                  menu = min(5, max(1,menu));  // establece limite inferior de 0 y superior de 100 para MENU
                     ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo de la interrupcion en variable static
  }         
  }

hola amigos soy nuevo en el forum mis disculpas si he echo algo mal les comento que estoy haciendo un prollecto para una lavadora automatica de carga frontal y mi gran problema es usar un encoder rotativo para hacer el menu este codigo en el q estoy trabajando tiene errores los cuales no se donde estan ya les digo soy nuevo eso solo un ejemplo de como quiero que quede pero no se como espero de su ayuda saludos cordiales desde cuba

Hi
And is there a problem?

#include <LiquidCrystal.h> 
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2;       //variable A a pin digital 2 (DT en modulo)
int CLK = 3;        //variable B a pin digital 4 (CLK en modulo)
int ANTERIOR = 0;    // almacena valor anterior de la variable POSICION
int MENU = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
int lectura = digitalRead(btn1);      
void setup() {
  pinMode(btn1, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(DT, INPUT);    // DT como entrada
  pinMode(CLK, INPUT);    // CLK como entrada
  
  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps
  attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW             
  Serial.println("Listo");  // imprime en monitor serial Listo
  
  lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)   
  lcd.setCursor(0, 0);
  lcd.print("INICIALIZANDO..");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SELECIONE OPCION");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
 
}


void loop() {
  
  int lectura = digitalRead(btn1);
  
  if (MENU != ANTERIOR) { // si el valor de POSICION es distinto de ANTERIOR
   // Serial.println(POSICION); // imprime valor de POSICION
    ANTERIOR = MENU ; // asigna a ANTERIOR el valor actualizado de POSICION
  }
}

void encoder()  {
  
  static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion          
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {  // rutina antirebote desestima pulsos menores a 5 mseg.       
      if (digitalRead(CLK) == HIGH)     // si B es HIGH, sentido horario
         {
            MENU++ ;        // incrementa MENU en 1
            }
              else {          // si CLK es LOW, senti anti horario
               MENU-- ;        // decrementa MENU en 1
               }
                  MENU = min(12, max(1, MENU));  // establece limite inferior de 0 y superior de 100 para MENU
                     ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo de la interrupcion en variable static
             
  }

switch(MENU){
      case 1:       
               Serial.println("OPCION 1"); 
               break;
               
      case 2: Serial.println("OPCION  2");
                           
               break;
              
      case 3:Serial.println("OPCION 3");
                             
                break;
              
      case 4: Serial.println("OPCION  4");
                               
               break;
              
      case 5: Serial.println("OPCION 5");
                        
               break;
              
      case 6: Serial.println("OPCION  6");
                                  
               break;
              
     
              
    }
     
        } 
   [quote="ruilviana, post:2, topic:945494, full:true"]
Hi
And is there a problem?
[/quote]

este es en el que estoy trabajando para lograr lo que les mostre en el primer codigo pero no encuentro la solucion amigo espero puedan ayudarme saludos

hola gracias por responder mi problema es que quiero logar lo que puse en el primer codigo pero no lo logro hay erores q no encuentro el segundocodigo q envie compila ferfectamete y funciona perfecto pero no me hace lecturas del boton debido creo yo a la interupcion del encoder pero este encoder q estoy usando es bien complejo solo con ese codigo me a logrado funcional al 100 pero tiene una interupcion y eso creo q es lo q me esta causando problemas con la lectura del boton lo que necesito es leer el boton para poder entar a las opciones corespondientes al menu y a su submenu espero haberme explicado bein y les reitero mis disculpas de haber echo algo mal o haver,e saltado alguna regla del forum

Hi
This forum category uses the English language.

excuse me

hola amigos disculpen si estoy ahciendo algo mal soy nuevo en el forum este es mi primer post haber me explico mi problema es qu estoy desarrollando un proyecto para una lavdora automatica de carga frontal ya todo esta casi listo e echo las pruevas corespondientes a todo los sensores ,electrovalvulas etc todo el codico q desarrolle para controlar cada una de estos componentes esta perfecto ahora a lo q boy mi problema es desarrollar en menu ya llevo barios dias semanas diria yo intentandolo y ningun resultado favorable para mir todo son complicaciones el problemas es que quiero desarrolar un menu con un encoder rotativo q es el q trae por defecto la lavadora y un Switch case pero este encoder es un poco complicado con el unico codigo q funciona perfecto es con el q les motare a continuacion pero este codigo tiene una interupcion y ese creo q es el problema q no me deja leer el estado del boton para con este poder seleccionar la opcion corespondiente al menu y entar a su submenu o estoy poniendo algo mal en el codigo no se ustedes me diran q estoy haciendo mal les muestro el codigo boy a subir 2 codigo el primero es asta donde e llegado yo y el segundo es lo que quiero logarar espero haberme explicado bien y reitero mis disculpas de haverme saltado alguna regla del forum por favor corrijanme . saludos cordiales desde cuba`

#include <LiquidCrystal.h> 
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2;       //variable A a pin digital 2 (DT en modulo)
int CLK = 3;        //variable B a pin digital 4 (CLK en modulo)
int ANTERIOR = 0;    // almacena valor anterior de la variable POSICION
int MENU = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
int lectura = digitalRead(btn1);      
void setup() {
  pinMode(btn1, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(DT, INPUT);    // DT como entrada
  pinMode(CLK, INPUT);    // CLK como entrada
  
  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps
  attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW             
  Serial.println("Listo");  // imprime en monitor serial Listo
  
  lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)   
  lcd.setCursor(0, 0);
  lcd.print("INICIALIZANDO..");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SELECIONE OPCION");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.noDisplay();
  delay(500);
  lcd.display();
 
}


void loop() {
  
  int lectura = digitalRead(btn1);
  
  if (MENU != ANTERIOR) { // si el valor de POSICION es distinto de ANTERIOR
   // Serial.println(POSICION); // imprime valor de POSICION
    ANTERIOR = MENU ; // asigna a ANTERIOR el valor actualizado de POSICION
  }
}

void encoder()  {
  
  static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion          
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {  // rutina antirebote desestima pulsos menores a 5 mseg.       
      if (digitalRead(CLK) == HIGH)     // si B es HIGH, sentido horario
         {
            MENU++ ;        // incrementa MENU en 1
            }
              else {          // si CLK es LOW, senti anti horario
               MENU-- ;        // decrementa MENU en 1
               }
                  MENU = min(12, max(1, MENU));  // establece limite inferior de 0 y superior de 100 para MENU
                     ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo de la interrupcion en variable static
             
  }

switch(MENU){
      case 1:       
               Serial.println("OPCION 1"); 
               break;
               
      case 2: Serial.println("OPCION  2");
                           
               break;
              
      case 3:Serial.println("OPCION 3");
                             
                break;
              
      case 4: Serial.println("OPCION  4");
                               
               break;
              
      case 5: Serial.println("OPCION 5");
                        
               break;
              
      case 6: Serial.println("OPCION  6");
                                  
               break;
              
     
              
    }
     
        } 

y este es el seTexto preformateadogundo codigo q es lo que quiero logarar corrijo el boton 1 no lo usare ya que sera el encoder rotativo el q se desplace por el menu y las distintas iopciones

int categoria = 0;
int menu = 0;
int submenu = 0;
int btn1 = A0;
int btn2 = A2;

void setup() {
  pinMode(btn1, INPUT);
  pinMode(btn2, INPUT);
  Serial.begin(9600);
}

void loop() {
  int lectura1 = digitalRead(btn1);
  int lectura2 = digitalRead(btn2);

  if(lectura1 == 0){
    if(categoria == 0){
      if(menu == 3){
        menu = 0;
      }
      menu++;
      switch(menu){
        case 1: Serial.println("Placa"); break;
        case 2: Serial.println("Procesador"); break;
        case 3: Serial.println("Puerto"); break;
      }
    }
    if(categoria == 1){
      if(submenu == 4){
        submenu = 0;
      }
      submenu++;
      if(menu == 1){
        switch(submenu){
          case 1: Serial.println("Placa > UNO"); break;
          case 2: Serial.println("Placa > nano"); break;
          case 3: Serial.println("Placa > micro"); break;
          case 4: Serial.println("Placa > volver"); break;
        }
      }
      if(menu == 2){
        switch(submenu){
          case 1: Serial.println("Procesador > 328"); break;
          case 2: Serial.println("Procesador > 328(older)"); break;
          case 3: Serial.println("Procesador > 168"); break;
          case 4: Serial.println("Procesador > volver"); break;
        }
      }
      if(menu == 3){
        switch(submenu){
          case 1: Serial.println("Puerto > COM1"); break;
          case 2: Serial.println("Puerto > COM2"); break;
          case 3: Serial.println("Puerto > COM3"); break;
          case 4: Serial.println("Puerto > volver"); break;
        }
      }
    }
    
    while(!digitalRead(btn1));
  }

  if(lectura2 == 0){
    if(categoria == 0) categoria++;     //Nuevo metodo
    if(categoria == 1 && submenu == 4){ //Nuevo metodo
      submenu = 0;                      //Nuevo metodo
      categoria = 0;                    //Nuevo metodo
    }                                   //Nuevo metodo
    while(!digitalRead(btn2));
  }
}