Pantalla LCD 20x4 y BS18B20 [SOLUCIONADO]

Buenas noches,

Había dado por solucionado Otras funciones DS18B20 control de temperatura, pero al pasar de los días ocurre que aparecen más decimales en las medidas de los DS18B20.
La escritura de la pantalla está limitada a 2 decimales "lcd.print (Temperatura,2);
Sería simple esconder estos errores rellenando de espacios en blanco.
Si se sigue el hilo anterior había problema de ruido de unos variadores de voltaje y se puso cable estructurado apantallado y se solucionó.
Este problema ocurre en cualquier momento sin estar funcionando los variadores.


Foto del caso

Saludos,

La escritura de la pantalla está limitada a 2 decimales "lcd.print (Temperatura,2);

La escritura puede estar limitada a 2 decimales pero mantienes el orden de donde ubicas el cursor?
Si no usas sprintf() es muy dificil contemplar todas las situaciones.

Porque no pusiste el código que usas?

Agrego el código de esa parte:

Podría ser por que en algún instante se envía a pantalla -127.00 que es cuando no hay sensor conectado, por alguna razón y quedan llenos esos espacios de la pantalla?

//////////////////////Subrutina PANTALLA///////////////////////////////

void Pantalla(){

      float temp1cf=temp1c;
      float temp2cf=temp2c; 
   
  // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:0)
     lcd.setCursor(0, 1);
     lcd.print("1C= ");
     lcd.print(temp1cf);
     lcd.setCursor(9, 1);
     lcd.print(" R= ");
     lcd.print(temp1r,2);
     lcd.setCursor(19, 1);
     if (digitalRead(coilPin1) ){lcd.print ("I");} else {lcd.print ("O");}
     lcd.setCursor(0, 2);
     lcd.print("2C= ");
     lcd.print(temp2cf);
     lcd.setCursor(9, 2);
     lcd.print(" R= ");
     lcd.print(temp2r,2);
     lcd.setCursor(19, 2);
     if (digitalRead(coilPin2) ){lcd.print ("I");} else {lcd.print ("O");}
     lcd.setCursor(0, 3);
     lcd.print("Agua Helada");
     lcd.setCursor(13, 3);
     lcd.print(tempLr,2);
     lcd.setCursor(19, 3);
     if (digitalRead(coilPin3) ){lcd.print ("I");} else {lcd.print ("O");} 
}

Como dije ocurre por no usar sprintf()

que es esto o mejor que se supone que hace?

 if (digitalRead(coilPin2) ){lcd.print ("I");} else {lcd.print ("O");}

salvo algun ajuste prueba esto

//////////////////////Subrutina PANTALLA///////////////////////////////

void Pantalla() {

    float temp1cf = temp1c;
    float temp2cf = temp2c; 
    char  outstr1[6], outstr2[6], buffer[20];

    dtostrf(temp1cf,5, 2, outstr1);
    dtostrf(temp2cf,5, 2, outstr2);
   // Ubicamos el cursor en la primera posición(columna:0) de la primera línea(fila:0)
    lcd.setCursor(0, 1);
    //sprintf(buffer,"1C= %s R= %s %c", outstr1, outstr2,digitalRead(coilPin1)?"I":"0");
    sprintf(buffer,"1C= %s R= %s", outstr1, outstr2);
    lcd.print(buffer);
    
    dtostrf(temp2cf,5, 2, outstr1);
    dtostrf(temp2r,5, 2, outstr2);

    lcd.setCursor(0, 2);
    //sprintf(buffer,"2C= %s R= %s", outstr1, outstr2,digitalRead(coilPin2)?"I":"0");
    sprintf(buffer,"2C= %s R= %s", outstr1, outstr2);
    lcd.print(buffer);

    dtostrf(tempLr,5, 2, outstr2);
    lcd.setCursor(0, 3);
    sprintf(buffer,"Agua Helada %s", outstr2);
    lcd.print(buffer);
    
}

Gracias Surbyte,

if (digitalRead(coilPin2) ){lcd.print ("I");} else {lcd.print ("O");}

es para saber si está activada la salidas de las electroválvulas y bomba.

Me pongo con los cambios.

Saludos,

bueno ahi te comenté una opción, cambia la que vas a usar.
en lugar de la opción que di

sprintf(buffer,"1C= %s R= %s %c", outstr1, outstr2,digitalRead(coilPin1)?"I":"0");

y que tu usaste sería mas lógico esto

sprintf(buffer,"1C= %s R= %s %c", outstr1, outstr2,digitalRead(coilPin1)?'I':'0');

no le preste atención a las longitudes, corrige eso por tu cuenta.

Hi,
En el sketch noto que no haces un lcd.clear() para empezar el display. Yo simpre lo hago para limpiar el display de caracteres que se puedan quedar fuera de posicion del display anterior. Sino lo haces entonces se van a quedar en el display.

No hace falta si usas un buffer de 20 caracteres y cada linea la imprimes usando dicho buffer.
Si quiers lo usas en el setup() pero luego con sprintf() y un buffer de 20 caracteres el uso de lcd.clear() es inutil.

defines un

char buffer[20];

luego haces esto para diseñar tu lcd

// 20 caracteres
// 01234567890123456789
//    Temp. fermentacion
// 1C= 20.00 R = 13.70 O
// 2C= 20.00 R = 13.70 O
// Agual helada      6.38 O

ya lo hice asi que no lo voy a repetir. pero con esto u otras pantallas donde siempre se mantengan los 20 caracteres, no hace falta el uso de ningún extra.
En cambio se logra que todo se escriba donde debe.

El único problema es imprimir float ya que Arduino no dispone de capacidad para imprimir floats sino a traves del truoco de dtostrf()