pb affichage heure et date qui clignote

slt , suis toujours sur mon prog , la partie programmation de la machine a état étant fini
je passe a la partie affichage sur un écran TFT 3,5" ILI 9486

depuis un module RTC je veux afficher l'heure et la date j'ai donc crée plusieurs rectangles avec bord blanc et fond noir.

dans un des rectangles j'affiche l'heure et la date et pour pouvoir actualiser l'heure j'efface a chaque boucle en remplissant de nouveau le rectangle en noir , je l'ai fais intuitivement mais cela clignote un peu , environ deux ou trois fois par seconde , je vous donne mon code si quelqu'un a une idée a me soumettre pour que cela ne clignote plus merci d'avance.

#include "Adafruit_GFX.h"
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

#include <SPI.h>       //Librairie à installer
#include <SD.h>        //Librairie à installer
#include <DS3231.h>    //Librairie à installer
DS3231  monRTC(SDA, SCL);

// définition des couleurs (mot clé en anglais)
#define BLACK         0x0000
#define WHITE         0xFFFF
#define RED           0xF800

void setup() {


  Serial.begin(9600);
  monRTC.begin();

  tft.reset();
  tft.begin(0x9486);
  tft.setRotation(3);
  tft.fillScreen(BLACK);

  tft.drawRect(0, 0, 480, 50, WHITE);
  tft.drawRect(0, 50, 480, 220, WHITE);
  tft.drawRect(0, 270, 480, 50, WHITE);
  tft.drawLine(160, 270, 160, 320, WHITE);
  

  tft.setCursor(30, 15);
  tft.setTextColor(RED);
  tft.setTextSize(3);
  tft.print("STATION METEO");


}

void loop()
{


  
  tft.fillRect(1,271,158,48,BLACK);

  tft.setCursor(23, 275);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.print(monRTC.getDateStr());

  tft.setCursor(33, 300);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.print(monRTC.getTimeStr());

  String temps = String(monRTC.getTimeStr());       // On demande l'heure exacte au module Real Time Clock.
  String dates = String(monRTC.getDateStr());
  Serial.println(monRTC.getTimeStr());



}

merci a tous

idéalement il ne faut "repeindre" que les parties qui ont changé et donc ne pas tout effacer à chaque loop pour réafficher la même chose --> c'est ce qui fait clignoter

quelle librairie DS3231 utilisez vous?

De plus ta boucle loop va très vite et elle doit afficher peut être quelques centaines de fois par seconde. Il vaut mieux afficher l'heure une fois par seconde ou par minute selon ton format d'affichage.

Pour cela tu utilises millis() et tu comptes le temps qui passe avant de changer l'affichage. Tu peux ainsi faire d'autres choses en attendant.

Perso, j'aurai enregistré l'heure et contrôle le changement de minute et à cette condition, rafraichi uniquement la zone ou se trouve l'heure.

Avec la librairie Adafruit_GFX, si tu définis la couleur de fond du texte tu n'as pas besoin d'effacer avant d'écrire, la librairie le gère elle même.
par exemple au lieu d'utiliser

tft.setTextColor(RED);

il faudrait faire

tft.setTextColor(RED, BLACK);

et supprimer le tft.fillRect() associé

Merci a tous pour vos remarques et aides.

donc pour répondre dans l'ordre:

JML: j'utilise la librairie DS3231.h et effectivement je ne remplissais que la plus petite parti. mais le résultat n'était pas satisfaisant.

Lesept : j'ai aussi pour faire un essai simple mis un délai de 1000 c'était déjà mieux mais toujours un clignotement donc pas satisfaisant non plus , donc du coup je ne me suis pas cassé la tête a mettre un Millis.

Zarb 94: je tenais a avoir les secondes et de toutes manière j'airais eut un clignotement.

ET finalement la bonne solution fdufnews: le:

tft.setTextColor(RED, BLACK);

fonctionne a merveille, exactement ce que je voulais, plus de clignotement et l'égrainage des secondes.

merci a tous

vous mettez à jour quand même trop souvent :).. 1 fois par seconde ça devrait suffire (à faire avec millis() )

ok, JML

je vais rajouter cela dans mon code , en effet rien ne sert qu'il soit actualisé a chaque boucle.

cela consomme t'il quelque chose qui pourrait être économisé de cette manière?

merci.

goldoseb:
cela consomme t'il quelque chose qui pourrait être économisé de cette manière?

ça doit consommer un chouia tout petit d'électricité en plus et ça occupe le processeur pour rien. si vous n'avez rien d'autre à faire dans le code alors pourquoi pas laisser comme cela mais si vous voulez faire d'autres trucs, genre tester des boutons ou autres clignotage de LEDs vous aurez une moindre réactivité

Merci , pour ces précisions

Sébastien