Figer image écran tft

Bonjour,
j'ai un problème qui rend mon affichage sur mon écran tft pas joli .
je dispose d'un écrant tft featherwing 3.5 pouces de chez adafruit et d'un ESP32.
Donc mon problème est que j'aimerais figer mes images c'est à dire ,
par exemple pour mon capteur de gaz sgp30 .

//ECRAN

    if ((sgp.TVOC) >=350 && (sgp.TVOC) <600)
  reader.drawBMP("/jro.bmp", tft, 281, 51); 
    else if ((sgp.TVOC) > 600)
  reader.drawBMP("/jrr.bmp", tft, 283, 54); 
 

    if ((sgp.eCO2) >=450 && (sgp.eCO2) <750)
  reader.drawBMP("/jgo.bmp", tft, 0, 50); 
    else if ((sgp.eCO2) > 750)
  reader.drawBMP("/jgr.bmp", tft, -1, 52); 

si co2 >=450 & <750 j'affiche une image et si >750 une autre image.
Sauf le problème est qu'a chaque delay l'image disparait puis réaparait.
J'aimerais figer l'image le temps que le taux de co2 est compris entre 450 et 750 pas qu'elle disparaisse toute les 5 secondes avec mon delay.
mon code :

//SGP30
#include "Adafruit_SGP30.h"
Adafruit_SGP30 sgp;
uint32_t getAbsoluteHumidity(float temperature, float humidity) {
    // approximation formula from Sensirion SGP30 Driver Integration chapter 3.15
    const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3]
    const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3]
    return absoluteHumidityScaled;
}
//BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;
//Ecran
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_HX8357.h"



#ifdef ESP32
   #define STMPE_CS 32
   #define TFT_CS   15
   #define TFT_DC   33
   #define SD_CS    14
#endif


#define TFT_RST -1

// Use hardware SPI and the above for CS/DC
Adafruit_HX8357 tft = Adafruit_HX8357(TFT_CS, TFT_DC, TFT_RST);

//image
#include <SdFat.h>                // SD card & FAT filesystem library
#include <Adafruit_SPIFlash.h>    // SPI / QSPI flash library
#include <Adafruit_ImageReader.h> // Image-reading functions
#define USE_SD_CARD
#if defined(USE_SD_CARD)
  SdFat                SD;         // SD card filesystem
  Adafruit_ImageReader reader(SD); // Image-reader object, pass in SD filesys
#else
  // SPI or QSPI flash filesystem (i.e. CIRCUITPY drive)
  #if defined(__SAMD51__) || defined(NRF52840_XXAA)
    Adafruit_FlashTransport_QSPI flashTransport(PIN_QSPI_SCK, PIN_QSPI_CS,
      PIN_QSPI_IO0, PIN_QSPI_IO1, PIN_QSPI_IO2, PIN_QSPI_IO3);
  #else
    #if (SPI_INTERFACES_COUNT == 1)
      Adafruit_FlashTransport_SPI flashTransport(SS, &SPI);
    #else
      Adafruit_FlashTransport_SPI flashTransport(SS1, &SPI1);
    #endif
  #endif
  Adafruit_SPIFlash    flash(&flashTransport);
  FatFileSystem        filesys;
  Adafruit_ImageReader reader(filesys); // Image-reader, pass in flash filesys
#endif


Adafruit_Image         img;        // An image loaded into RAM
int32_t                width  = 0, // BMP image dimensions
                       height = 0;

#include <Fonts/FreeSerifBold18pt7b.h>
#include <Fonts/FreeSerif18pt7b.h>
void setup() {
   Serial.begin(57600);
  // put your setup code here, to run once:
//SGP30
  while (!Serial) { delay(10); } // Wait for serial console to open!

  Serial.println("SGP30 test");

  if (! sgp.begin()){
    Serial.println("Sensor not found :(");
    while (1);
  }
  Serial.print("Found SGP30 serial #");
  Serial.print(sgp.serialnumber[0], HEX);
  Serial.print(sgp.serialnumber[1], HEX);
  Serial.println(sgp.serialnumber[2], HEX);

  // If you have a baseline measurement from before you can assign it to start, to 'self-calibrate'
  //sgp.setIAQBaseline(0x8E68, 0x8F41);  // Will vary for each sensor!
//BME280
   while(!Serial);    // time to get serial running
    Serial.println(F("BME280 test"));
    unsigned status;
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        Serial.print("        ID of 0x60 represents a BME 280.\n");
        while (1) delay(10);
    }
    
    Serial.println("-- Default Test --");
    Serial.println();
//ECRAN

  Serial.println("HX8357D Test!"); 
  tft.begin();

  // read diagnostics (optional but can help debug problems)
  uint8_t x = tft.readcommand8(HX8357_RDPOWMODE);
  Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(HX8357_RDMADCTL);
  Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(HX8357_RDCOLMOD);
  Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(HX8357_RDDIM);
  Serial.print("Image Format: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(HX8357_RDDSDR);
  Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); 
  
  Serial.println(F("Benchmark                Time (microseconds)"));

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


//image
 ImageReturnCode stat; // Status from image-reading functions
   Serial.print(F("Initializing filesystem..."));
#if defined(USE_SD_CARD)
  // SD card is pretty straightforward, a single call...
  if(!SD.begin(SD_CS, SD_SCK_MHZ(25))) { // ESP32 requires 25 MHz limit
    Serial.println(F("SD begin() failed"));
    for(;;); // Fatal error, do not continue
  }
#else*
  // SPI or QSPI flash requires two steps, one to access the bare flash
  // memory itself, then the second to access the filesystem within...
  if(!flash.begin()) {
    Serial.println(F("flash begin() failed"));
    for(;;);
  }
  if(!filesys.begin(&flash)) {
    Serial.println(F("filesys begin() failed"));
    for(;;);
  }
#endif
  Serial.println(F("OK!"));
  
  tft.setRotation(1);
  tft.fillScreen(HX8357_WHITE);
}
int counter = 0;
void loop() {
//SGP30

  float temperature = bme.readTemperature(); // [°C]
  float humidity = bme.readHumidity(); // [%RH]
  sgp.setHumidity(getAbsoluteHumidity(temperature, humidity));
  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  Serial.print("Taux VOC : "); Serial.print(sgp.TVOC); Serial.println(" ppb\t");
  Serial.print("Taux CO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");

  if (! sgp.IAQmeasureRaw()) {
    Serial.println("Raw Measurement failed");
    return;
  }
  Serial.print("Taux Brut H2 "); Serial.print(sgp.rawH2); Serial.println(" \t");
  Serial.print("Taux Brut Ethanol "); Serial.print(sgp.rawEthanol); Serial.println("");
  Serial.println();
  counter++;
  if (counter == 30) {
    counter = 0;

    uint16_t TVOC_base, eCO2_base;
    if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
      Serial.println("Failed to get baseline readings");
      return;
    }
    Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
    Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
  }
//image
  reader.drawBMP("/imagefondb2.bmp", tft, 0, 0); 

//ECRAN

    if ((sgp.TVOC) >=350 && (sgp.TVOC) <600)
  reader.drawBMP("/jro.bmp", tft, 281, 51); 
    else if ((sgp.TVOC) > 600)
  reader.drawBMP("/jrr.bmp", tft, 283, 54); 
 

    if ((sgp.eCO2) >=450 && (sgp.eCO2) <750)
  reader.drawBMP("/jgo.bmp", tft, 0, 50); 
    else if ((sgp.eCO2) > 750)
  reader.drawBMP("/jgr.bmp", tft, -1, 52); 

  //BME280
printValues();
temp();
hum();
pression();
 delay(5000);
}
void temp() {
   tft.fillRect(50,250,70,50,HX8357_WHITE); //(x,y,width,heigh,color)
   tft.setFont(&FreeSerifBold18pt7b);
  tft.setCursor(55, 285);
 
  
  if ((bme.readTemperature()) >=10 && (bme.readTemperature()) <14){
  tft.setTextColor(0xFC80);
  tft.println(bme.readTemperature(),1);
  }
  else if ((bme.readTemperature()) <=10){
  tft.setTextColor(HX8357_RED);
  tft.println(bme.readTemperature(),1);
  }
  else if ((bme.readTemperature()) >=14 && (bme.readTemperature()) <24){
  tft.setTextColor(HX8357_GREEN);
  tft.println(bme.readTemperature(),1);
  }
  else if ((bme.readTemperature()) >=24 && (bme.readTemperature()) <28){
  tft.setTextColor(0xFC80);
  tft.println(bme.readTemperature(),1);
  }
  else if ((bme.readTemperature()) >=28){
  tft.setTextColor(HX8357_RED);
  tft.println(bme.readTemperature(),1);
  }
}
void hum(){
   tft.fillRect(175,250,50,50,HX8357_WHITE); //(x,y,width,heigh,color)
   tft.setFont(&FreeSerifBold18pt7b);
  tft.setCursor(182, 285);
  tft.setTextColor(HX8357_BLACK);
  tft.println(bme.readHumidity(),0);
}
void pression() {
   tft.fillRect(310,250,90,50,HX8357_WHITE); //(x,y,width,heigh,color)
   tft.setFont(&FreeSerifBold18pt7b);
  tft.setCursor(320, 285);
  tft.setTextColor(HX8357_BLACK);
  tft.println((bme.readPressure()/100.0F),0);
}
void printValues() {
    Serial.print("Température = ");
    Serial.print(bme.readTemperature());
    Serial.println(" °C");

    Serial.print("Pression = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");


    Serial.print("Humidité = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
  Serial.println("===================");
  Serial.println();
  
}

Plusieurs remarques.
1- ce serait malin de ne pas avoir à redessiner à chaque fois l'image de fond, c'est long. Pour cela il faudrait t'arranger pour que les images que tu appliquent en surimpression aient la même taille. Exemple ici

    if ((sgp.TVOC) >=350 && (sgp.TVOC) <600)
  reader.drawBMP("/jro.bmp", tft, 281, 51); 
    else if ((sgp.TVOC) > 600)
  reader.drawBMP("/jrr.bmp", tft, 283, 54); 

Si les 2 images avaient la même taille elles se superposeraient parfaitement sans laisser de marque sur le fond
2- Je doute fort que la température, l'humidité ou le taux de CO2 change en 5s. Si tu rafraîchissais l'écran toutes les 30s ce serait largement suffisant.
3- il me semble que l'on l'a déjà évoqué cela avec toi, dans un autre fil de discussion, il suffit de ne redessiner que ce qui change. Si tel image est à l'écran et que c'est la même qu'il faut afficher et bien tu ne fais rien.

Oui je comprend mais je ne peux pas faire ce que tu me dit, car mes images affiche un jauge , vert orange rouge, et j'en ai deux une à gauche et une à droite .
Mon problème est que j'aimerais que mon image reste le temps que co2> 450 tu comprends ?
actuellement elle reste mais se recharge à chaque delay donc on voit la jauge s'afficher orange , puis pendant que ça s'actualise elle redevient blanc puis redevient orange et ainsi de suite.
Moi j'aimerais que si elle est orange elle reste orange pas besoin de la recharger si les valeurs n'ont pas changé et que dès que co2 repasse inférieur à 450 ça recharge

Il suffit de dire au code de faire cela...

Je pense que tu ne lis pas ce que l'on écrit.
Je ne parle pas de couleur mais de la taille des images.
Par exemple, tu poses une image orange de taille 50 x 60 aux coordonnées 10,20.
Le coup suivant tu poses une image verte de taille 50 x 60 aux coordonnées 10,20.
Elles se superposent à la première sans besoin de redessiner le fond.
Et tu peux avoir autant de jauges (ou ce que tu voudras) sur ton écran.

C'est exactement ce que je t'ai dit dans le post #2 "il suffit de ne redessiner que ce qui change"