Problema de visualización en pantalla TFT

Hola a todos, escribo este post para pedir una ayuda con un proyecto que tengo, estoy visualizando un valor de un sensor de temperatura en una pantalla TFT de 2.4" que esta en un arduino Mega. Tengo dos problemas cuando visualizo el valor del sensor, el primero es que se me superpone el valor anterior con el actual y el segundo es que pareciera que se me llena el arreglar char que tengo porque llega un punto que me escribe cualquier cosa.

Vi unos post en internet para solucionar la superposición pero realmente no logre solucionarlo Link del post

Aqui va el codino donde estoy imprimiendo

include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

// Pines de conexion del LCD 
#define LCD_CS A3 // Chip Select - Pin analogico 3
#define LCD_CD A2 // Command/Data - Pin Analogico 2
#define LCD_WR A1 // LCD Write - Pin Analogico 1
#define LCD_RD A0 // LCD Read - Pin Analogico 0
#define LCD_RESET A4 // LCD Reset - Pin Analogico 4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // Instancia del LCD 

#define  BLACK   0x0000  // Definimos los colores para poder referirnos a ellos con su nombre                  
#define AZUL     0xF800  // en lugar de usar el código hexadecimal de cada uno. 
#define GREEN   0x07E0 
#define WHITE   0xFFFF  
#define ROJO   0x001F 
#define CYAN    0x07FF
#define AZULMARINO  0xFFE0
#define MAGENTA 0xF81F


uint16_t identifier = 0x9341;

float temperatura = 0.0;

char tmp[50];

void setup() {
  // put your setup code here, to run once:
  Serial1.begin(9600);  // Inicia la comunicacion por (Tx1 y Rx1)
  Serial.begin(9600); // Inicia la comunicacion por (Tx0 y Rx0) con el computador
  Serial1.flush();
  tft.reset();
  tft.begin(identifier);
  tft.fillScreen(BLACK); // Colocamos el fondo del LCD en Negro

}

void loop() {
  
  if (Serial1.available() > 7) 
  { 
    Serial1.readBytes((byte*)&temperatura, 4);
  }
  Serial.println(temperatura);
 
     tft.setRotation(90); // Establecemos la posición de la pantalla Vertical u Horizontal
  //_-------------------Humedad------------
    tft.setCursor(40, 20);  // Situamos el cursor en la posicion del LCD deseada,
                            // (X, Y) siendo X el ancho (240 px max.) e Y el alto (320 px max.)                      
    tft.setTextSize(2); // Definimos tamaño del texto. (Probado tamaños del 1 al 10)    
    tft.setTextColor(AZULMARINO); // Definimos el color del texto 
    
    tft.println("Hum"); // Escribimos nuestro texto en el LCD. Realizará un salto de linea 
                          // automatico si el texto es mayor que el tamaño del LCD
                                  
    tft.drawLine(35, 40, 80, 40, AZULMARINO); // Dibujamos una linea (Punto inicio X, Punto inicio Y, Punto final X, Punto final Y, Color)
    
  //--------------------Temperatura----------------
    tft.setCursor(150, 20);  // Situamos el cursor en la posicion del LCD deseada,
                            // (X, Y) siendo X el ancho (240 px max.) e Y el alto (320 px max.) 
                          
    tft.setTextSize(2); // Definimos tamaño del texto. (Probado tamaños del 1 al 10)
    
    tft.setTextColor(GREEN); // Definimos el color del texto 
    
    tft.println("Temp"); // Escribimos nuestro texto en el LCD. Realizará un salto de linea 
                          // automatico si el texto es mayor que el tamaño del LCD
                                  
    tft.drawLine(145, 40, 200, 40, GREEN); // Dibujamos una linea (Punto inicio X, Punto inicio Y, Punto final X, Punto final Y, Color)

    float X = temperatura;   // Almacenamos en la variable entera X el ancho del LCD en pixeles mediante tft.width();
    dtostrf(X,50,2,tmp);
    int Y = 0 ; // Almacenamos en la variable entera Y el alto del LCD en pixeles mediante tft.height();
 //------------------------Valores----------------------   
    tft.setCursor(40, 50); // Situamos el cursor en una nueva posicion del LCD
     
    tft.setTextSize(2); // Definimos tamaño del texto.
    
    tft.setTextColor(WHITE); // Definimos el color del texto 
    
    tft.println(tmp); // Imprimimos por pantalla el valor de las variables en decimal
    
    tft.setCursor(155, 50); // Situamos el cursor en una nueva posicion del LCD
     
    tft.setTextSize(2); // Definimos tamaño del texto.
    
    tft.setTextColor(WHITE);
    
    tft.println(Y, DEC);
}

(Corte la parte de las figuras del código porque era muy largo), la parte de en la cual estoy imprimiendo el valor de temperatura es

float X = temperatura;   // Almacenamos en la variable entera X el ancho del LCD en pixeles mediante tft.width();
    dtostrf(X,50,2,tmp);
    int Y = 0 ; // Almacenamos en la variable entera Y el alto del LCD en pixeles mediante tft.height();
 //------------------------Valores----------------------   
    tft.setCursor(40, 50); // Situamos el cursor en una nueva posicion del LCD
     
    tft.setTextSize(2); // Definimos tamaño del texto.
    
    tft.setTextColor(WHITE); // Definimos el color del texto 
    
    tft.println(tmp); // Imprimimos por pantalla el valor de las variables en decimal

y final mente les muestro que me aparece en el serial, donde al principio funciona de maravilla y luego comienza a tomar cualquier valor

29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
29.81
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
12.12
0.00

Bueno muchas gracias
espero me puedan ayudar de verdad se los agradecería un monto !!

Estimado:

En la parte donde tienes

if (Serial1.available() > 7) 
  { 
    Serial1.readBytes((byte*)&temperatura, 4);
  }

Crees que podría cambiarlo por un WHILE? Para empezar.

Y después poner un Delay(xx) para darle tiempo al sensor a recoger la temperatura...

No se si eso te servirá, pero podrías intentarlo.

Hola , pues amigo voy a intentar lo del while pero creo que no es el problema porque lo que he probado me funciona de igual manera lo intentare y no puedo usar Delay porque tengo muchas cosas funcionando en paralelo y por eso uso la función miles()

Gracias

lo pruebo y te comento

El problema de imprimir en un LCD de texto o gráfico siempre es el mismo y se resuelve del mismo modo.
Seteas la posición como bien has hecho pero luego usas esto

float X = temperatura;   // Almacenamos en la variable entera X el ancho del LCD en pixeles mediante 
  tft.width();

  dtostrf(X,50,2,tmp);  // <===  50 es una barbaridad!!!! no hay float con 50 digitos

  int Y = 0 ; // Almacenamos en la variable entera Y el alto del LCD en pixeles mediante tft.height();
  tft.setCursor(40, 50); // Situamos el cursor en una nueva posicion del LCD
  tft.setTextSize(2); // Definimos tamaño del texto.
  tft.setTextColor(WHITE); // Definimos el color del texto 

   char buffer[10]; // el tamaño del buffer debe poder contener lo que quieres visualizar.  
   sprintf(buffe,"%s", temp);   
   tft.println(tmp); // Imprimimos por pantalla el valor de las variables en decimal

Si buscas en google: sprintf verás como son los modificadores disponibles.

Todos funcionan menos %f porque Arduino no soporta impresion de punto flotante salvo en versiones de mas memoria como los ESP8266, Teensy y otros.

%d se usa para enteros
%c para caracteres
%s para strings o cadenas
%X para hexadecimales

etc etc