Error de actualización de pagina con libreria u8glib

Estoy usando una pantalla SSD1306 OLED y la libreria u8glib, estoy haciendo un menu y estoy teniendo problemas al navegar por el mismo, hay veces en la que al cambiar de pagina(cambiar de submenu), como que no termina de actualizar y no entiendo porque, para solucionarlo, vuelvo a presionar el boton de set pero no puedo incluir esto a un proyecto. estoy usando el simulador de wokwi:

sino aca tienen el codigo:

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

int tempActual = 40;

int arriba = 31;
int abajo = 35;
int set = 33;

int p; //contador de pagina
int p1; //contador pagina1
int p2; //contador pagina2
int p3; //contador pagina3
int p4; //contador pagina4
int p6;

void menuIni(); //pagina1
void menuTemp(); //pagina2
void menuDes(); //pagina3
void menuAjustes(); //pagina4
void temp(); //pagina5
void des(); //pagina6
//void ajustes(); //pagina7


void (*pages[])() = { menuIni, menuTemp, menuDes, menuAjustes, temp, des } ; //, ajustes

void setup() {
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  p = 0;
  p1 = 0;
  p2 = 0;
  p3 = 0;
  p4 = 0;
  p6 = 0;
  Serial.begin(9600);
}

void loop() {
  u8g.firstPage();
  do {  
    (*pages[p])();
  } while( u8g.nextPage());
    Serial.println(p);
}

void moverseMenu(int &cont, int cant){
  if(digitalRead(arriba)==HIGH){
    if(cont>0){
      cont = cont - 1;
    delay(300);
    }
  }else if(digitalRead(abajo)==HIGH){
    if(cont<cant){
      cont = cont + 1;
    delay(300);
    }
  }
    return cont;
}

void temp(){
  int textWidth1 = u8g.getStrWidth("Temperatura"); // Obtener la longitud del texto
  int textWidth2 = u8g.getStrWidth(String(tempActual).c_str()); // Obtener la longitud del texto
  int xPos = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
  u8g.drawStr(xPos, 30, "Temperatura"); // Imprimir el texto centrado
  u8g.drawStr(xPos, 55, String(tempActual).c_str()); // Imprimir el texto centrado
  if(digitalRead(set)==HIGH){
    p = 1;
    delay(200);
  }
  if(digitalRead(arriba)==HIGH){
    tempActual = tempActual + 1;
    delay(200);
  }else if(digitalRead(abajo)==HIGH){
    tempActual = tempActual - 1;
    delay(200);
  }
  return 0;
}

void des(){
  moverseMenu(p6, 1);
  int textWidth1 = u8g.getStrWidth("Activar?"); // Obtener la longitud del texto
  int xPos = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
  u8g.drawStr(xPos, 30, "Activar?"); // Imprimir el texto centrado

  if(p6==0){
    int textWidth = u8g.getStrWidth("No"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 55, "  ");
    u8g.drawStr(xPos, 55, "No"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 2;
      delay(200);
    }
  }else if(p6==1){
    int textWidth1 = u8g.getStrWidth("Si"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 55, "  ");
    u8g.drawStr(xPos1, 55, "Si"); // Imprimir el texto centrado
  }
  return 0;
}

void menuAjustes(){
  moverseMenu(p4, 3);
  if(p4==0){
    int textWidth = u8g.getStrWidth("Config. Term."); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "Config. Term."); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 1;
      delay(200);
    }
  }else if(p4==1){
    int textWidth1 = u8g.getStrWidth("Fecha y Hora"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Fecha y Hora"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 2;
      delay(200);
    }
  }else if(p4==2){
    int textWidth2 = u8g.getStrWidth("Config. Wi-Fi"); // Obtener la longitud del texto
    int xPos2 = (u8g.getWidth() - textWidth2) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos2, 50, "Config. Wi-Fi"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 3;
      delay(200);
    }
  }else if(p4==3){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 0;
      delay(200);
    }
  }
  return 0;
}

void menuDes(){
  moverseMenu(p3, 1);
  if(p3==0){
    int textWidth = u8g.getStrWidth("Activar?"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "Activar?"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 5;
      delay(200);
    }
  }else if(p3==1){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 0;
      delay(200);
    }
  }
  return 0;
}

void menuTemp(){
  moverseMenu(p2, 1);
  if(p2==0){
    String txtTemp = "T. Actual: ";
    txtTemp.concat(tempActual);
    int textWidth = u8g.getStrWidth(String(txtTemp).c_str()); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, String(txtTemp).c_str()); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 4;
      delay(200);
    }
  }else if(p2==1){
    int textWidth1 = u8g.getStrWidth("Volver"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "Volver"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 0;
      delay(200);
    }
  }
  return 0;
}

void menuIni(){
  moverseMenu(p1, 2);
  if(p1==0){
    int textWidth = u8g.getStrWidth("MENU1"); // Obtener la longitud del texto
    int xPos = (u8g.getWidth() - textWidth) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos, 50, "MENU1"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 1;
      delay(200);
    }
  }else if(p1==1){
    int textWidth1 = u8g.getStrWidth("MENU2"); // Obtener la longitud del texto
    int xPos1 = (u8g.getWidth() - textWidth1) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos1, 50, "MENU2"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 2;
      delay(200);
    }
  }else if(p1==2){
    int textWidth2 = u8g.getStrWidth("MENU3"); // Obtener la longitud del texto
    int xPos2 = (u8g.getWidth() - textWidth2) / 2; // Calcular la posición horizontal centrada
    u8g.drawStr(xPos2, 50, "MENU3"); // Imprimir el texto centrado
    if(digitalRead(set)==HIGH){
      p = 3;
      delay(200);
    }
  }
  return 0;
}

Lo primero delay(200) y delay(300) no van!!! Es grosero poner tantos delay. Lo que he hecho es modificarlos a 20 y 30 mseg como para entender.
Veo repetición de cosas, los botones actuan muchas veces en diferentes partes.
Tienes que organizar el código. Los botones son de control.
Algo avance o sube, algo retrocede o baja y algo fija o setea.

Aunque no es lo que yo haría modifiqué las cosas como para que funcione.

No se si es correcto, el comportamiento.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.