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.