Error variable sin motivo

Hola!

Estoy trabajando en un proyecto para controlar con un tft los niveles de unos depositos con menus con iconos graficos y demas.

El proyecto lo tengo casi terminado, pero tengo un error y ya no se como solucionarlo, a ver si alguien me puede dar alguna ida :frowning:

El funcionamiento es el siguiente:

Tengo unos niveles con valor analogico.Estos se lleen sin problemas.
Guardo en la eeprom el valor de “tara” de cada una de las sondas, ya que el nivel maximo, no es el maximo de entrada de analogica.
Para cambiar este valor de tara, para evitar cambiarlo por error, tengo una flag boolean “memoria_cambio_tara” que me desbloque el guardado.

El problema es que declaro esta variable global, la pongo en false al entrar en la pantalla, pero cuando cambio de bloque para dibujar el candado en rojo o verde, resulta que ese valor ya no es 0.

He revisado una y mil veces y esta variable solo se usa en esta parte del codigo, pero al cambiar de segmento se me borra…

ya no se que hacer, el resto de sondas funcionan, uso el mismo codigo en otras pantallas y funciona, pero en esto no…

a ver si alguien ve algo raro!

Muchas gracias

este es el codigo:

void menu_config_sucia() {

  //Menu de Agua sucia

  //TAMAÑO TFT 320 X 240

  tft.setFont(&FreeSerif9pt7b);
  memoria_cambio_tara = false;
  //Serial.print(F("memoria cambio tara: "));
  //Serial.println(memoria_cambio_tara);

  tft.fillScreen(BLACK);
  tft.drawRoundRect(20, 20, 280, 30, 5, BLUE);
  tft.setCursor(45, 40);
  tft.setTextSize(1);
  tft.println(F("Calibrado sondas agua sucia"));

  memoria_tara[3] = 1000;

  dibuja_tara2();

  dibuja_sensor2();

  dibuja_flechas2();

  //boton regresar
  tft.drawRoundRect(12, 195, 68, 40, 5, BLUE);
  tft.drawBitmap(25, 195, flecha_izquierda, 40 , 40, GREEN);



  base_menu();

}

void configura_botones_sucia() {
  
  //Serial.println(memoria_cambio_tara);


  if ( (xpos > 113 && xpos < 189) && ( ypos > 57 && ypos < 108) && memoria_cambio_tara) {
    
    tara3 = valorSensor3;
    eeAddress = 64;
    EEPROM.put(eeAddress, tara3);
    dibuja_tara2();

  }


  if ( (xpos > 230 && xpos < 320) && ( ypos > 200 && ypos < 240)) {

   memoria_cambio_tara = !memoria_cambio_tara;
   dibuja_flechas2();
    
  }

  if ( (xpos > 5 && xpos < 85) && ( ypos > 200 && ypos < 240)) {

    menu = 6;

  }

}

void dibuja_tara2() {

  tft.setFont(&FreeSerif9pt7b);
  tft.setTextColor(GREEN);
  tft.setCursor(20, 70);
  tft.println(F("Tara Nivel 1"));
  tft.fillRoundRect(15, 75, 95, 35, 5, BLACK);
  tft.drawRoundRect(20, 75, 90, 30, 5, BLUE);
  tft.setCursor(45, 95);
  tft.println(tara3);


}

void dibuja_sensor2() {
  tft.setFont(&FreeSerif9pt7b);

  if (valorSensor3 != memoria_tara[3]) {

    tft.setTextColor(WHITE);
    tft.fillRoundRect(215, 82, 80, 25, 5, BLACK);
    tft.drawRoundRect(210, 75, 90, 30, 5, BLUE);
    tft.setCursor(245, 95);
    tft.println(valorSensor3);
    memoria_tara[3] = valorSensor3;
  }
}

void dibuja_flechas2() {
  //Serial.print(F("memoria cambio tara(flechas): "));
  //Serial.println(memoria_cambio_tara);

  if (memoria_cambio_tara) {

    tft.drawBitmap(140, 70, flecha_izquierda, 40 , 40, GREEN);
    tft.fillRect(245, 185, 48, 48, BLACK);
    tft.drawBitmap(245, 185, candado_abierto, 48, 48, GREEN);
  }
  else {
    tft.drawBitmap(140, 70, flecha_izquierda, 40 , 40, RED);
    tft.fillRect(245, 185, 48, 48, BLACK);
    tft.drawBitmap(245, 185, candado_cerrado, 48, 48, RED);

  }

}

Por favor edita tu hilo de forma tal que el código (aprovecha para colocar todo el código) este con etiquetas.
Te paso instrucciones por privado.
Algo mas. Ya que vas a colocar todo el código, tómate un instante para comentarlo, y usar la función autoformato para su mejor visualizacion CONTROL+F

Hola!

Cierto, falta codigo, el problema es que es muy extenso.

Ups… :o se nota que no suelo escibir en foros jejejeje. corregido y perdonad :smiley:

No, la funcion solo se llama una vez para no estar redibujando la pantalla constantemente

 if (menu == 12) {

    if (m_impreso != 12) {
      menu_config_sucia();
      imprime_fecha();
      m_impreso = 12;
    }
  }

La idea es que al cargar la pantalla, reseteo la memoria ya que lo que quiero hacer es una configuracion en dos pasos, primero habilito la edicion y en un segundo boton en otra parte de la pantalla guardo los cambios.

Así cuando salgo de esta pantalla y regreso, vulve a estar bloqueada la edicion.

Lo del monitor serie lo utilizo(en el codigo esta comentado), y eso es lo que me vuelve loco… pongo un serial.print al resetear, y me devuelve un 0… correcto y luego pongo otro al inicio del bloque y me sale un valor sin sentido puede devolverme un 160 como un 8 o un 9 :o

pero esta variable solo se utiliza en la parte de codigo que he puesto…

incluso el mismo codigo, o muy similar, lo uso en varias partes del programa, pero solo me falla aqui…

Pense, me quedo is ram y se estan machacando datos… he puesto los textos con la funcion F y las imagenes con progmem… sketch 35% dinamica 19%…

Y nada…

Si, evidentemente todo tiene un motivo, pero en este caso no le encuentro el motivo de forma logica… :smiley:

Muchas gracias por las respuestas!

@killpaff cuando el código es grande se sube como adjunto y asunto solucionado.