sobreescribe los datos al leer del serial1

Hola

No tengo mucha experiencia y al leer del serial1 los datos que lee se superponen, por ejemplo al leer VPV, PPV , V etc... me ocurre con todos los datos, aunque en la foto solo se aprece en uno, porque porque los otros no han variado.
arduino mega 2560 + display ILI9486

#include <MCUFRIEND_kbv.h>
#include <Adafruit_GFX.h>

Lee el voltaje de la placa solar, pero como varia la tension escribe un numero encima de otro y no se puede leer.

Alguna idea del problema?

Muchas gracias

llevo poco tiempo con arduino y el codigo es de un proyecto de internet, que he usado otro display y he conseguido hacerlo funcionar, pero me ocurre este pequeño problema.

funciona_test_24_ok.ino (8.98 KB)

Moderador
Por favor edita tu post haciendo visible tu código usando etiquetas.
Normas del foro

void loop()
{
  if (Serial1.available())
  {
    
    label = Serial1.readStringUntil('\t');                // this is the actual line that reads the label from the MPPT controller
    val = Serial1.readStringUntil('\r\r\n');              // this is the line that reads the value of the label
     
     
    if (label == "FW")
    {
      val.toCharArray(buf, sizeof(buf));                    // version firmware
      valormedido = atof(buf);
      valormedido = valormedido / 100;
      dtostrf(valormedido, len, 2, firmware);
      firmware[len] = ' '; firmware[len + 1] = 0;
      tft.setTextColor(GREENYELLOW, BLACK);
      tft.setTextColor(ORANGE);
      tft.setCursor(245, 50);
      tft.print(firmware);
    }
    else if (label == "VPV")
    {
      val.toCharArray(buf, sizeof(buf));                    // By studying these small routines, you can modify to reading the parameters you want,
      float valormedido = atof(buf);
      valormedido = valormedido / 1000;                       // calculating the correct value, see the Victron whitepaper for details. The value of label I is communicated in milli amps.
      dtostrf(valormedido, len, 2, panel);          // setting color scheme etc.
      panel[len] = ' '; panel[len + 1] = 0;
      tft.setTextColor(GREENYELLOW, BLACK);
      tft.setTextColor(YELLOW);
      tft.setCursor(245, 80);
      tft.println(panel);

    }
    else if (label == "PPV")
    {
      val.toCharArray(buf, sizeof(buf));                    // conversion of val to a character array. Don't ask me why, I saw it in one of the examples of Adafruit and it works.
      float valormedido = atof(buf);                         // conversion to float
      valormedido = valormedido / 1000;                       // calculating the correct value, see the Victron whitepaper for details. The value of label I is communicated in milli amps.
      dtostrf(valormedido, len, 2, intpanel);              // conversion of calculated value to string
      intpanel[len] = ' '; intpanel[len + 1] = 0;
      tft.setTextColor(GREENYELLOW, BLACK);
      tft.setTextColor(GREEN);
      tft.setCursor(315, 110);
      tft.println(panel);
    }

    else if (label == "V")
    {
      val.toCharArray(buf, sizeof(buf));
      float valormedido = atof(buf);
      valormedido = valormedido / 1000;
      dtostrf(valormedido, len, 2, BatteryA);
      BatteryA[len] = ' '; BatteryA[len + 1] = 0;
      tft.setTextColor(GREENYELLOW, BLACK);
      tft.setTextColor(YELLOW);
      tft.setCursor(245, 140);
      tft.print(BatteryA);
    }

Por favor, nunca coloques un código parcial, siempre en el foro se postea todo el código porque de ese modo vemos como has definido variables, objetos, etc.

A ver como se comporta esto.

Ajusta el %4s al tamaño que tu desees. eso controla la cantidad de caracteres esperable en cada caso. Como tu manejas una variable len, no se que tamaño máximo pueda tener

void loop(){
  char buffer[10]
  if (Serial1.available() > 0) {
      label = Serial1.readStringUntil('\t');                // this is the actual line that reads the label from the MPPT controller
      val = Serial1.readStringUntil('\r\r\n');              // this is the line that reads the value of the label
      if (label == "FW")   {
        val.toCharArray(buf, sizeof(buf));                    // version firmware
        valormedido = atof(buf);
        valormedido = valormedido / 100;
        dtostrf(valormedido, len, 2, firmware);
        //firmware[len] = ' '; firmware[len + 1] = 0;
        tft.setTextColor(GREENYELLOW, BLACK);
        tft.setTextColor(ORANGE);
        tft.setCursor(245, 50);
        sprintf(buffer, "%4", firmware);
        tft.print(buffer);
      }
      else if (label == "VPV")  {
        val.toCharArray(buf, sizeof(buf));                    // By studying these small routines, you can modify to reading the parameters you want,
        float valormedido = atof(buf);
        valormedido = valormedido / 1000;                       // calculating the correct value, see the Victron whitepaper for details. The value of label I is communicated in milli amps.
        dtostrf(valormedido, len, 2, panel);          // setting color scheme etc.
        //panel[len] = ' '; panel[len + 1] = 0;
        tft.setTextColor(GREENYELLOW, BLACK);
        tft.setTextColor(YELLOW);
        tft.setCursor(245, 80);
        sprintf(buffer, "%4", panel);
        tft.print(buffer);
      }
      else if (label == "PPV")  {
        val.toCharArray(buf, sizeof(buf));                    // conversion of val to a character array. Don't ask me why, I saw it in one of the examples of Adafruit and it works.
        float valormedido = atof(buf);                         // conversion to float
        valormedido = valormedido / 1000;                       // calculating the correct value, see the Victron whitepaper for details. The value of label I is communicated in milli amps.
        dtostrf(valormedido, len, 2, intpanel);              // conversion of calculated value to string
        //intpanel[len] = ' '; intpanel[len + 1] = 0;
        tft.setTextColor(GREENYELLOW, BLACK);
        tft.setTextColor(GREEN);
        tft.setCursor(315, 110);
        sprintf(buffer, "%4", panel);
        tft.print(buffer);
      }
  
      else if (label == "V")  {
        val.toCharArray(buf, sizeof(buf));
        float valormedido = atof(buf);
        valormedido = valormedido / 1000;
        dtostrf(valormedido, len, 2, BatteryA);
        //BatteryA[len] = ' '; BatteryA[len + 1] = 0;
        tft.setTextColor(GREENYELLOW, BLACK);
        tft.setTextColor(YELLOW);
        tft.setCursor(245, 140);
        sprintf(buffer, "%5", BatteryA);
        tft.print(buffer);
      }
  }

Explico este pero todos los casos son similares

dtostrf(valormedido, len, 2, BatteryA);

Esto convierte un float a una cadena.

sprintf(buffer, "%4", BatteryA);

esto formatea esa cadena BatteryA a 4 caracteres x eso digo, si 4 no son suficientes aumenta a 5.
Considera que si reservas espacio para 99.99 eso son 5 caracteres.
Veo un caso donde hay justo 5 pero otros con 4.
Dejaré 5 para la batería y 4 para los demas.
Ajusta la posición X e Y para que sea la adecuada.
Tambien poner todos a 5 asegura que quedarán alineados por derecha.

Muchas gracias, lo probare para mejorar el codigo,

el problema en este caso era que estaba repetido tft.setTextColor he eliminado tft.setTextColor(YELLOW); y funciona

probare con el codigo que has publicado a ver si va mejor

estoy empezado y hay varias cosas que aun me pierdo.
muchas gracias

 tft.setTextColor(GREENYELLOW, BLACK);
        tft.setTextColor(YELLOW);

Lo que te he propuesto hará que tus presentaciones siempre queden ordenadas y no se sobreescriban.
Lo que planteas es otro tema.