Proyecto de llenado de deposito, Problemas varios :( Ayudaa

Buenas tardes, estoy intentando crear un proyecto para realizar el llenado de un deposito mediante electrovalvulas con agua de osmosis y agua normal con una mezcla al 50%.

El problema principal viene dado por la parte de código del llenado (función llenar) aparte de no cumplir la función algo falla, ya que aveces al terminar el proceso y volver a mostrar el menu principal la pantalla lcd de 16x2 muestra caracteres irreconocibles.

Os adjunto el codigo y os comento un poco. La mayoria de este es reciclado de otros que encontre por internet.

Las dos funciones que intervienen en el proceso que falla son estas.
En esta primera se calcula la distancia a la que esta el agua y se devuelve la resta entre la capacidad del deposito y el nivel hasta la distancia del agua. Dando como resultado la distancia que se ha llenado si no me equivoco.

float c_litros()
{
  
 float niv = ultrasonic.Ranging(CM);
 return  niv_max - niv;
//    float Acum = 0;
//    for (int r = 0; r < 10; r++) {
//      Acum = Acum + c_litros_20();
//    }
//
//    return niv_max - (Acum / 10); // promediar lecturas
}

y en esta se llena de agua de normal mientras el agua llenada sea menos de la mitad del total activando ECNOR (electrovalvula agua normal).
Despues se llena de agua osmosis. mientras sea mas de la mitad y hasta el final activando ECOSM

void llenar()
{
    if (limpiador == true) clean(1, 1);
  boolean osm , norm;
  osm = false;
  norm = false;

  while ( c_litros() < (niv_max/2)){

  print_lcd_t(0, 0, "Llenado AGUA");
  print_lcd_t(1, 0, "NORMAL ......");
  print_i2c_t(0,0, "LLenado:   cm");
  print_i2c_v(0,8, c_litros());
  digitalWrite(ECNOR, LOW);
  digitalWrite(ECOSM, HIGH);

  norm = true;

  }
      digitalWrite(ECOSM, HIGH);
    digitalWrite(ECNOR, HIGH);
    
  while ( c_litros()  >= (niv_max/2) && c_litros() < niv_max ){
  print_lcd_t(0, 0, "Llenado AGUA");
print_lcd_t(1, 0, "OSMOSIS ......");
 print_i2c_t(0,0, "LLenado:   cm");
 print_i2c_v(0,8, c_litros());
  digitalWrite(ECNOR, HIGH);
  digitalWrite(ECOSM, LOW);

  osm = true;
 }


        digitalWrite(ECOSM, HIGH);
    digitalWrite(ECNOR, HIGH);
  if (limpiador == true) clean(1, 1);
   while( norm == true && osm == true && StrPuls != "LEF" ){
         V_LeerLineaPulsadores();
  print_lcd_t(0, 0, "Deposito lleno");
    print_i2c_t(0, 0, "Completado"); 
          digitalWrite(ECOSM, HIGH);
    digitalWrite(ECNOR, HIGH);
     }
}

Muchas gracias por todo y en todo lo que me podais ayudar os lo agradeceria. Otro tema es la funcion para cargar caracteres en la pantalla lcd o i2c, en la lcd no i2c carga bien algunos simbolos y otros no. Muchas gracias

prueba_arduino_forum.ino (13.6 KB)

Me parece un programa muy complicado de seguir.
Podrias explicar un par de cosas?

  1. porque usas LCD y LCD_I2C o sea usas dos LCD uno paralelo y otro I2C eso ya me sorprende
  2. Hablas de un menu pero no veo mas que Menu0 y Menu1, Menu2 Menu3 donde están??? No existen o solo por ser copias de otro sitio estan ahi. Si no existen para que los pones en el Menú.
  3. Las funcion llenar tiene while s que como mucho deben consumir mucho tiempo hasta devolver el control, de modo que eso no esta bien.
    Ejemplo: 1er while
  while ( c_litros() < (niv_max/2)) {
        print_lcd_t(0, 0, "Llenado AGUA");
        print_lcd_t(1, 0, "NORMAL ......");
        print_i2c_t(0,0, "LLenado:   cm");
        print_i2c_v(0,8, c_litros());
        digitalWrite(ECNOR, LOW);
        digitalWrite(ECOSM, HIGH);

        norm = true;
  }

En un programa con botonera y menúes que atender no puedes esperar… minutos hasta que se cumpla

while ( c_litros() < (niv_max/2))
  1. lo de los lcd es fácil de resolver. Lo que ocurre que tal como esta es muy complicado de seguir el programa.

Deberías tratar de escribir un diagama de flujo del funcionamiento y luego reescribirlo.
Al darle una vuelta de rosca a toda la idea y hacerlo mas leíble, y respetando que no haya atascos o cosas como estos delay de llenar() porque esos while terminan comportandose como delay…
Y si presionas la botonera dime como hace para enterarse?

Buenas surbyte. muchas gracias por contestar te respondo rapido, pero como tu bien as dicho reescribire el programa de nuevo.

  1. Lo de las dos pantallas es por que son las dos unicas que dispongo y como la paralela tiene una botonera utilizo las dos.

  2. Los menus: solo esta definido el menu0 principal y el menu1 , el resto seran desarollados cuando controle la función de llenado. Aunque hay mas solo estos dos estan bien definidos.

  3. Durante los while no espero ninguna acción del usuario hasta que se llene por completo el deposito. Si se te ocurre alguna forma mejor de desarrollarlo te lo agradeceria enormemente. La funcion que se encarga de acerlo es V_LeerLineaPulsadores(); pero como te e comentado durante el llenado no se espera ninguna accion del usuario.

  4. Lo de la pantalla en si es lo menos importante. Voy a intentar reescribir. Y vuelvo a colgar.

Lo que más me interesaria es lo referente a los while. Pero tienes razon voy a reescribirlo y ya me dices