duda con refresco de display tft [SOLUCIONADO]

Hola, mi duda es la siguiente: tengo la lectura de 3 sensores y los muestro por un display TFT, el tema es que a la hora de actualizar el valor es como que me queda dibujado aun el nro anterior de la lectura entonces se superponen los dos valores y no se puede leer con claridad...se entiende?

Queria saber si habia alguna funcion o algo para hacer una "especie" de refresh sobre el display. Saludos.

hay que volver a escribir lo mismo en el mismo sitio (antes de escribir el nuevo valor) y con letra de color blanca ( o del mismo color de fondo )

Era fácil eh!! a veces es cuestión de pensar un poco

Eso que mencionas Go_zalo perece que es lo que ya lo está haciendo. El camino para actualizar los valores de un sensor en pantalla, debe considerar un codigo mas estructurado, en lugar de un simple print.

También hay que considerar las limitaciones de la pantalla y de la librería de control, al creador del post le sugiero que nos comparta alguna foto o link para saber de que TFT se trata; nos indique la librería de control que está usando y además que nos muestre el código que ha estructurado.

Con eso se podría armar una respuesta adecuada.

Me dijeron que la única solución era colocar una máscara y sobreescribir, pero al paso del tiempo me di cuenta de que esta no es la única solución, hay mejores:

Números sin "parpadeos"

Basicamente usa sprintf() que es como suelo mostrar datos en cualquier display.

parte del código

void Temp1()
{
 do    
  {    
     int TDInt = random(95,115);
     int fracc = random (0,99);

     sprintf(TX,"%3d.%02d C", TDInt, fracc);

     tft.setCursor(85, 100); 
     tft.setTextColor(YELLOW, BLACK);  tft.setTextSize(3);
     tft.println(TX);        
     delay(500);
  }
 while(1);     
}

makly77:
me queda dibujado aun el nro anterior de la lectura entonces se superponen los dos valores y no se puede leer con claridad

TFTLCDCyg:
Eso que mencionas Go_zalo perece que es lo que ya lo está haciendo.

No se como llegas a esta conclusión. dice que esta escribiendo encima y claro se le ven los dos números.

Por otro lado, no se por que hablas de parpadeo cuando no es el problema en este caso. y haciéndolo de la manera de la que he dicho yo, no parpadea en absoluto

surbyte:
Basicamente usa sprintf() que es como suelo mostrar datos en cualquier display.

parte del código

void Temp1()

{
do   
  {   
    int TDInt = random(95,115);
    int fracc = random (0,99);

sprintf(TX,"%3d.%02d C", TDInt, fracc);

tft.setCursor(85, 100);
    tft.setTextColor(YELLOW, BLACK);  tft.setTextSize(3);
    tft.println(TX);       
    delay(500);
  }
while(1);   
}

y ya este mensaje es que directamente ni entiendo que me pegas aquí un trozo del código del vídeo.

GO_zalo:
....ya este mensaje es que directamente ni entiendo que me pegas aquí un trozo del código del vídeo.

A ti no te pego nada.

Yo le respondo a makly77 y copio un extracto de lo que puso TFTLCDCyg en su enlace para quien lo lea lo entienda rápidamente.

Hola surbyte no logro entender para que sirve la funcion sprintf() que me decis, en realidad no logro entender que tiene que ver esa funcion con el refresco de mi display.

Estoy utilizando las librerias <Adafruit_GFX.h> <Adafruit_TFTLCD.h>

La función sprintf() te encapsula el formato de todo lo imprimís en una linea de manera que no te deja rastros de nada anterior.
Tienes dos métodos o usas esta función o usas la sugerencia de Go_zalo.

Pon tu código cosa que debiste haber hecho en el post#1 y explicar con una foto como se ve en el TFT el nro anterior.

Si no sabes, lee las normas del foro y sabrás como hacerlo.

Basicamente son 3 datos que recibo por el puerto serie y que necesito que se vayan actualizando sin dejar rastros de la lectura anterior.

void loop()
 
{
  
  if(Serial1.available()){
   
    digitos = Serial1.read();
    }
    if(digitos == '

){
      dato1 = Serial1.parseInt();
      dato2 = Serial1.parseInt();
      dato3 = Serial1.parseInt();
      Serial.println(dato1);
      Serial.println(dato2);
      Serial.println(dato3);
      tft.print(dato1);
      tft.print(dato2);
      tft.print(dato3);

Vaya al final resultó ser el "tft.print" en cuestión.

Las pantallas económicas que abundan en el mercado para arduino, no tienen los componentes necesarios para conseguir el "refresco" que quieres.

sprintf es una instrucción que te permite presentar valores en pantalla sin que se superpongan, incluso te da la posibilidad de encadenar valores diferentes en una sola linea

El ejemplo del video lo hice con las librerias que refieres

#include <Adafruit_GFX.h> 
#include <Adafruit_TFTLCD.h>

Esperemos que te auxilie en tu proyecto

TFTLCDCyg, trato de adaptar mi codigo con tu ejemplo y solo me realiza una sola lectura de los datos (obtengo 3 datos pero solo intento mostrar el dato1), en algo me estoy equivocando y no me puedo dar cuenta, el codigo es:

void loop(){
  
  if(Serial1.available()){
    delay(10);
    digitos = Serial1.read();
  }
  if (digitos == '

){
   
    dato1 = Serial1.parseInt();
    dato2 = Serial1.parseInt();
    dato3 = Serial1.parseInt();
    Serial.println(dato1);
    Serial.println(dato2);
    Serial.println(dato3);
 
 
  do
  {
   
    sprintf(TX,"%3d C",dato1);
    tft.setCursor(137,50);tft.setTextColor(YELLOW);tft.setTextSize(5);
    tft.println(TX);
    delay(500);
  }
  while(1);
}
}

Sobra el do..while() por eso te toma una sola lectura, de todas formas de esta manera no eliminas el problema que se quede el valor anterior en la pantalla haciendo imposible su lectura... Que era el problema inicial del post si no recuerdo mal

makly77:
TFTLCDCyg, trato de adaptar mi codigo con tu ejemplo y solo me realiza una sola lectura de los datos (obtengo 3 datos pero solo intento mostrar el dato1), en algo me estoy equivocando y no me puedo dar cuenta, el codigo es:

void loop(){

if(Serial1.available()){
    delay(10);
    digitos = Serial1.read();
  }
  if (digitos == '

){
   
    dato1 = Serial1.parseInt();
    dato2 = Serial1.parseInt();
    dato3 = Serial1.parseInt();
    Serial.println(dato1);
    Serial.println(dato2);
    Serial.println(dato3);

sprintf(TX,"%3d C",dato1);
    tft.setCursor(137,50);tft.setTextColor(YELLOW);tft.setTextSize(5);
    tft.println(TX);
    delay(500);
}
}

Tal cual Go_zalo sigue superponiendose las lecturas, recien probe sacando el do-while y sigue el mismo problema.
Por eso mismo preguntaba sobre la funcion sprintf, no logro entender como eso soluciona el problema de refresco...alguna sugerencia por favor? gracias.

La solución esta en mi primer mensaje, he aquí una pista más:

void loop(){
  
  if(Serial1.available()){
    delay(10);
    digitos = Serial1.read();
  }
  if (digitos == '

){
   
    dato1 = Serial1.parseInt();
    dato2 = Serial1.parseInt();
    dato3 = Serial1.parseInt();
    Serial.println(dato1);
    Serial.println(dato2);
    Serial.println(dato3);

sprintf(TX,"%3d C",dato1);
    tft.setCursor(137,50);
    tft.setTextSize(5);
//Aquí seleccionar color de texto negro o blanco (el mismo que el fondo) e imprimir TXaux

tft.setTextColor(YELLOW);

tft.println(TX);

//Aquí pasar TX a una variable auxiliar TXaux
    delay(500);
}
}

Agregue al codigo las sugerencias quedando asi:

void loop(){
  
  if(Serial1.available()){
    delay(10);
    digitos = Serial1.read();
  }
  if (digitos == '

y sigo teniendo la superposicion de los nros, :confused:){
   
    dato1 = Serial1.parseInt();
    dato2 = Serial1.parseInt();
    dato3 = Serial1.parseInt();
    Serial.println(dato1);
    Serial.println(dato2);
    Serial.println(dato3);

sprintf(TX,"%3d C",dato1);
    tft.setCursor(137,50);
    tft.setTextSize(5);
//Aquí seleccionar color de texto negro o blanco (el mismo que el fondo) e imprimir TXaux
    tft.setTextColor(BLACK);
    tft.println(TXaux);
   
    tft.setTextColor(YELLOW);

tft.println(TX);
   
//Aquí pasar TX a una variable auxiliar TXaux
    TXaux == TX;
    delay(500);
}
}


y sigo teniendo la superposicion de los nros, :confused:

Pemíteme aislar cada uno de los datos que se van a imprimir en pantalla:

    tft.setTextSize(5);

    dato1 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato1);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,20);
    tft.setTextColor(YELLOW,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);


    dato2 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato2);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,65);
    tft.setTextColor(RED,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);


    dato3 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato3);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,110);
    tft.setTextColor(GREEN,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);

De esa forma ya no tendrías problemas en visualizar correctamente los datos, recuerda que TX es solo temporal y la llamas cada vez que necesites mostrar un dato en pantalla.

Te dejo un ejemplo con tres variables como las que pretendes imprimir, solo que son generadas como números aleatorios

#include <Adafruit_GFX.h> 
#include <Adafruit_TFTLCD.h>

#define LCD_CS A3 
#define LCD_CD A2 
#define LCD_WR A1 
#define LCD_RD A0 
#define LCD_RESET A4 

#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

char TX[50];  

void setup() {
  Serial.begin(9600);

#ifdef USE_ADAFRUIT_SHIELD_PINOUT
  Serial.println(F("Using Adafruit 2.8\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Adafruit 2.8\" TFT Breakout Board Pinout"));
#endif

  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());
  tft.reset();
  uint16_t identifier = tft.readID();

  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be #defined!"));
    Serial.println(F("Also if using the breakout, double-check that all wiring"));
    Serial.println(F("matches the tutorial."));
    return;
  }

  tft.begin(identifier);
  tft.setRotation(3);
  tft.fillScreen(BLACK);

  tft.setCursor(0, 0);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  tft.println("Hello World!");

  Serial.println(F("Done!"));
  Temp3datos();
}

void Temp3datos()
{
 tft.setTextSize(5);
 do    
  {    
     int dato1 = random(0,150);
     sprintf(TX,"%3d C", dato1);
     tft.setCursor(137, 45); 
     tft.setTextColor(YELLOW, BLACK);  tft.setTextSize(3);
     tft.println(TX);     

     int dato2 = random(75,120);
     sprintf(TX,"%3d C", dato2);
     tft.setCursor(137, 85); 
     tft.setTextColor(RED, BLACK);  tft.setTextSize(3);
     tft.println(TX);     

     int dato3 = random(75,120);
     sprintf(TX,"%3d C", dato3);
     tft.setCursor(137, 125); 
     tft.setTextColor(GREEN, BLACK);  tft.setTextSize(3);
     tft.println(TX);     

     delay(500);
  }
 while(1);     
}
void loop(){}    //No todo se puede meter en el loop

TXaux== TX es una operación de comparación, que devuelve true o false, no una operación de asignación sería TXaux = TX (nótese el uso de un solo signo =)

De todas formas esa no es la manera correcta de copiar cadenas de caracteres. Puedes buscar info sobre eso a ver si lo consigues

Usar dos colores en la función settextcolor puede funcionar la mayoría de veces, pero a la que salga un dato más largo que otro (1000,09 contra 10.12 por ejemplo)ya fallará dejando rastros de otros números en la pantalla

Es más no necesitas ni copiar el Sting, como el Sting lo generas de un dato puedes general dos veces una para almacenarlo hasta el siguiente ciclo

makly77:
Agregue al codigo las sugerencias quedando asi:

void loop(){

if(Serial1.available()){
    delay(10);
    digitos = Serial1.read();
  }
  if (digitos == '




y sigo teniendo la superposicion de los nros, :confused:

){
   
    dato1 = Serial1.parseInt();
    dato2 = Serial1.parseInt();
    dato3 = Serial1.parseInt();
    Serial.println(dato1);
    Serial.println(dato2);
    Serial.println(dato3);

sprintf(TX,"%3d C",dato1);
    tft.setCursor(137,50);
    tft.setTextSize(5);
//Aquí seleccionar color de texto negro o blanco (el mismo que el fondo) e imprimir TXaux
    tft.setTextColor(BLACK);
    tft.println(TXaux);
   
    tft.setTextColor(YELLOW);

tft.println(TX);
   
//Aquí pasar TX a una variable auxiliar TXaux
  // TXaux == TX;
    sprintf(TXaux,"%3d C",dato1);
    delay(500);
}
}




y sigo teniendo la superposicion de los nros, :confused:

Hola al final con la ayuda de TFTLCDC pude armar mi codigo y el refresco de la pantalla TFT funciona a la perfeccion...muchas gracias (aTODOS para que nadie se ofenda).

tft.setTextSize(5);

    dato1 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato1);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,20);
    tft.setTextColor(YELLOW,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);


    dato2 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato2);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,65);
    tft.setTextColor(RED,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);


    dato3 = Serial1.parseInt();
    sprintf(TX,"%3d C",dato3);  //aquí ya le das un formato a tus datos y se almacena en la variable temporal TX
    tft.setCursor(137,110);
    tft.setTextColor(GREEN,BLACK);  //En una sola instrucción le das todos los colores a tu presentación: el primero es el color de la fuente y el segundo es el color del fondo de la fuente
    tft.println(TX);

Yo hubiera agradecido también a Go_zalo ya que junto a TFTLCDCyg te brindaron dos opciones factibles.