Go Down

Topic: SOLUCIONADO: Pantalla que se bloquea y/o se queda en blanco (Read 175 times) previous topic - next topic

SanMaTi

Jan 18, 2020, 08:14 pm Last Edit: Jan 30, 2020, 06:04 pm by SanMaTi Reason: Intentar subir librerias sin exito!!!!!
Buenas Noches, hacia mucho tiempo no me pasaba por el foro.

Necesito me despejeis una duda echandome una mano porque no entiendo porque al pasar al menu no sale nada y se queda la pantalla en blanco.

Estoy usando un encoder con las resistencias de fabrica, una lcd128x64 con 3 cables por SPI (E, R/W,R/S)  y la alimentacion alimentacion de la misma.

Las librerias que estoy utilizando:

Wire.h     //libreria Arduino
EEPROM  //libreria para poder escribir y leer en la memoria no volatil de Arduino
DHT     //libreria del sensor de humedad y temperatura
RTC.h   //libreria del reloj de giltesa 1.4.7 aunque vale cualquier otra.
U8glib  //libreria de la pantalla LCD
RotaryEncoder // libreria del encoder
OneButton

Problema: el menu funciona perfectamente, pero cuando entras en el, se queda la pantalla en blanco, y ni sale la parte de ese menu al que intento entrar.
tengo que apretar el pulsador 2 veces seguidas para que me salga algo, y otras tantas para cada parte, asi hasta que sale la orden de guardar.
No deja interactuar visiblemente con el encoder, pero si que varia los datos.

En resumen, que una vez que picas en la parte del menu unas veces no refresca la pantalla y se queda congelada si quito el (clean();) y si lo dejo me deja la pantalla en blanco sin ver lo que hay en cada parte del menu.

Peticion: si alguien me puede echar una mano y asi sacarme de dudas de porque ocurre esto.
Un saludo y gracias

Code: [Select]

void Set_Calentador() {

  // Creamos 4 variales temporales para horas y minutos
  int hh1 = TermoVar.HoraInicio / 60; // Obtener las horas de TermoVar.HoraInicio
  int mm1 = TermoVar.HoraInicio % 60; // Obtener los minutos de TermoVar.HoraInicio
  int hh2 = TermoVar.HoraFin / 60;   // Obterner las horas de TermoVar.HoraFin
  int mm2 = TermoVar.HoraFin % 60;   // Obetener los minutos de TermoVar.HoraFin


  clear();// si lo quito la pantalla se congela

  u8g.firstPage();
  do {

    u8g.setCursorStyle (144);
    u8g.enableCursor();
    u8g.setCursorPos (0, 0);
    u8g.drawStr( 2, 10, "Calefactor");

    u8g.setPrintPos(5, 22);
    if (!TermoVar.Status)
      u8g.print("Off");
    else
      u8g.print("On ");

    u8g.setPrintPos(4, 22);
    encoder.setPosition(TermoVar.Status);
    lastPos = newPos ; delay(250);

    while (enc_but != 1) {  // Ciclo ON OFF del termostato
      LeeEncoder(0, 1, 1, 1); // Lee el enconder de 0 a 1
      if (lastPos != newPos) { //  Si se gira el encoder, entonces...
        lastPos = newPos ; // Vovemos a igualar lastPos
        TermoVar.Status = newPos; // Fijamos TermoVar.Status al nuevo valor,0 o 1.

        u8g.setPrintPos(5, 22);
        if (!TermoVar.Status)
          u8g.print("Off");
        else
          u8g.print("On ");
        u8g.setPrintPos(4, 22);

      }
      read_but();  // Lee si opromimos el botón del encoder y enc_but pasa a valor 1.
    }   // Fin Ciclo ON OFF del termostato
    enc_but = 0; // Habiendo opromido el encoder se sale del while y volvemos a poner a enc_but en valor 0.

    if (!TermoVar.Status) { // Si TermoVar.Status quedó en Off interrumpe el resto y dirige hacia la etiqueta setout
      goto setout;
    }

    u8g.drawStr( 2, 30, "Dia:");
    u8g.print(TermoVar.TempHorario); //u8g.print("\337");
    u8g.print((char)176);
    u8g.print("C");

    u8g.setPrintPos(20, 30);//lcd.setCursor(3, 1);
    encoder.setPosition(TermoVar.TempHorario);
    lastPos = newPos; delay(250);

    while (enc_but != 1) { //  Ciclo fija temperatura durante el día
      LeeEncoder(1, 35, 1, 1); //  Cambiar aquí si se necesita una temperatura inferior a 10 o superior a 34.
      if (lastPos != newPos) {
        lastPos = newPos ;
        TermoVar.TempHorario = newPos;

        u8g.setPrintPos(30, 30);
        u8g.print("    ");

        u8g.setPrintPos(30, 30);
        u8g.print(TermoVar.TempHorario);

        u8g.print((char)176);
        u8g.print("C");
        u8g.setPrintPos(20, 30);
        if (TermoVar.TempResto > TermoVar.TempHorario)
          TermoVar.TempResto = TermoVar.TempHorario;

      }
      read_but();
    }
    enc_but = 0; // Fin Ciclo fija temperatura durante el día


    u8g.setPrintPos(2, 38);
    u8g.print("Hora: ");
    printDigits(hh1);
    u8g.print(":");
    printDigits(mm1);
    u8g.print(" a ");
    printDigits(hh2);
    u8g.print(":");
    printDigits(mm2);

    u8g.setPrintPos(10, 38);
    encoder.setPosition(hh1);
    lastPos = newPos ; delay(250);

    while (enc_but != 1) {
      LeeEncoder(0, (hh2 - 1), 1, 1);
      if (lastPos != newPos) {
        lastPos = newPos ;
        hh1 = newPos;

        u8g.setPrintPos(20, 38);
        u8g.print("  ");

        u8g.setPrintPos(20, 38);
        printDigits(hh1);

        u8g.setPrintPos(10, 38);
      }
      read_but();
    }
    enc_but = 0;


    u8g.setPrintPos(30, 38);
    encoder.setPosition(mm1);
    lastPos = newPos ; delay(250);

    while (enc_but != 1) {
      LeeEncoder(0, 59, 1, 0);
      if (lastPos != newPos) {
        lastPos = newPos ;
        mm1 = newPos;

        u8g.setPrintPos(40, 38);
        u8g.print("  ");

        u8g.setPrintPos(40, 38);
        printDigits(mm1);

        u8g.setPrintPos(30, 38);
      }
      read_but();
    }
    enc_but = 0;


    u8g.setPrintPos(45, 38);
    encoder.setPosition(hh2);
    lastPos = newPos ; delay(250);

    while (enc_but != 1) {
      LeeEncoder((hh1 + 1), 23, 1, 1);
      if (lastPos != newPos) {
        lastPos = newPos ;
        hh2 = newPos;

        u8g.setPrintPos(50, 38);
        u8g.print("  ");

        u8g.setPrintPos(50, 38);
        printDigits(hh2);
        u8g.setPrintPos(45, 38);

      }
      read_but();
    }
    enc_but = 0;


    u8g.setPrintPos(55, 38);
    encoder.setPosition(mm2);
    lastPos = newPos ; delay(250);

    while (enc_but != 1) {
      LeeEncoder(0, 59, 1, 0);
      if (lastPos != newPos) {
        lastPos = newPos ; mm2 = newPos;

        u8g.setPrintPos(60, 38);
        u8g.print("  ");

        u8g.setPrintPos(60, 38);
        printDigits(mm2);

        u8g.setPrintPos(55, 38);
      }
      read_but();
    }
    enc_but = 0;


    u8g.drawStr( 2, 60, "Noche:");
    u8g.print(TermoVar.TempResto);

    u8g.print((char)176);
    u8g.print("C");
    // lcd.setCursor(5, 3);
    u8g.setPrintPos(20, 60);
    encoder.setPosition(TermoVar.TempResto);
    lastPos = newPos; delay(250);

    while (enc_but != 1) {
      LeeEncoder(1, TermoVar.TempHorario, 1, 1);
      if (lastPos != newPos) {
        lastPos = newPos ;
        TermoVar.TempResto = newPos;

        u8g.setPrintPos(30, 60);
        u8g.print("    ");

        u8g.setPrintPos(20, 60);
        u8g.print(TermoVar.TempResto);

        u8g.print((char)176);
        u8g.print("C");

        u8g.setPrintPos(20, 60);
      }
      read_but();
    }
    enc_but = 0;
  }
  while ( u8g.nextPage() );
setout:

  TermoVar.HoraInicio = (hh1 * 60) + mm1;
  TermoVar.HoraFin    = (hh2 * 60) + mm2;
  EEPROM.put(10, TermoVar);

  if (!TermoVar.Status) {
    digitalWrite(ReleTermo, HIGH);
  }

  Hecho();
}




Un fragmento del codigo donde causa ese error en la lcd

SanMaTi

Con mas de 30 visitas y 1 descarga del codigo no hay nadie capaz de decir el problema porque no sale en pantalla los submenus cuando le das la orden al encoder.
Veo que el grupo en estos años no cambio!!!!!!

He pensado en cambiar a la libreria u8g2 y a M2tklib, alguna sugerencia????

surbyte

Tu viste el programa? Yo si.
Es muy dificil responderte sin el hardware que estas usando. Cuantos tienen tu hardware o mejor dicho cuantos los tienen disponible como para darte una respuesta? Contados con los dedos de las manos y si agregamos que LatinoAmerica esta de vacaciones entonces te queda solo España.

Entonces no te enojes porque nadie te responde. No es fácil hacerlo.

Yo miré el programa y me perdí. Lo veo muy caótico. Asi que decirte porque se pone en blanco sin el display es dificil para mi.

Mira tu pregunta:
Quote
el menu funciona perfectamente, pero cuando entras en el, se queda la pantalla en blanco, y ni sale la parte de ese menu al que intento entrar.
Funciona pero se queda en blanco. Entonces?
Que tal si comienzas de nuevo y en lugar de tener todo lo que tienes haces una versión simplificada del menú y revisas paso a paso cada accion.


El siguiente punto:
Quote
tengo que apretar el pulsador 2 veces seguidas para que me salga algo, y otras tantas para cada parte, asi hasta que sale la orden de guardar.
Eso es simple de resolver. Programa aparte ves como funciona el enconder haciendo cosas simples, si lo hace bien, el problema esta en la integración.


SanMaTi

Señor administrador puede cerrar el tema, porque ya esta solucionado.

surbyte

Muchas gracias por informarme pero ya que lo has resuelto porque no indicas como lo has hecho porque de lo contrario si alguien intenta correr tu mismo programa se encontrará con el mismo inconveniente.

SanMaTi

Vamos por partes:


Es muy dificil responderte sin el hardware que estas usando. Cuantos tienen tu hardware o mejor dicho cuantos los tienen disponible como para darte una respuesta? Contados con los dedos de las manos...
Para que quieres un codigo sin el hardware que estoy usando, si lo tienen contados con los dedos de la mano

Yo miré el programa y me perdí. Lo veo muy caótico.
Si tan caotico es, para que quieres el codigo si te pierdes??

Creo que como no te pregunte en privado sobre el error, es caotico y se pierde uno, pero si te pregunto en privado pasa a ser trabajo y claro el trabajo se paga.......

Hay que leer mas como tu bien dices cuando preguntan

esto es sin animo de molestar ni ofender a nadie........................


surbyte

Pero no hablo de mi, hablo de cualquier otra persona que vea tu código, considere que pueda servirle y se encuentre con tu mismo problema o acaso eso no puede ocurrir?

Vienes al foro a buscar soluciones pero si no te hemos podido ayudar y la encuentras por tu cuenta entonces corresponde que publiques como lo has resuelto.

Ahora si no lo quieres hacer, es que no has comprendido la naturaleza de este o cualquier foro de AYUDA.

Finalmente cito el punto 14 de las normas del foro

Quote
14.  Interpretar las respuestas

Probablemente obtengas respuestas pronto. Lee las con calma y cuidado

• Si una respuesta menciona algo que no entiendes (ej. "Puente H"), trata de buscar por tu cuenta el significado, usando google.
• Si no entiendes una parte de la respuesta, dilo. Menciona que parte no entiendes, no solo lo ignores.
• Aplica las soluciones sugeridas, incluso si no te parecen relevantes a ti. Aparentemente cambios insignificantes podrían de hecho resolver el problema.
• Mira en los consejos que te piden. Por ejemplo: "¿Cual código?" significa: "Por favor pon tu código".
• Si has hecho cambios, y las cosas aun no funcionan, señala los cambios tanto electrónicos como código apropiado (en una nueva respuesta).
• Responde a las preguntas.  Es frustrante tener que leer tres páginas del hilo para obtener el
• Excepto para agregar etiquetas de código, por favor no modifiques post anteriores para hacer correcciones. Eso hace que los siguientes post parezcan inconsistentes. Postea el nuevo código en una nueva respuesta.
• Si has encontrado la solución por tu cuenta, como cortesía a otras personas que leerán el hilo más tarde, explica que has cambiado que resolvió el problema. ( ej. Cambio del tipo de una variable, cambio de un cable).

Go Up