Clignotement du texte sur l'écran TFT

Hello,

Je réalise un contrôleur de T° et d'humidité avec avec un Arduino, une sonde DHT22 et une DS18B20 ( NTC100k pour le moment ).

Sur un écran LCD1602 tout fonctionne parfaitement mais je suis passé sur un écran TFT 1.8 avec la bibliothèque TFT.h pour un affichage plus sympa.

Malgré tous mes efforts il y a toujours un clignotement des variables ( humidité, températures et relais activés ) à l'écran :

En premier j'ai utilisé TFTscreen.background(0, 0, 0); pour 'effacer l'écran' mais l'ensemble de l'écran clignotait.

Dans un 2ième temps j'ai utilisé l'exemple de la bibliothèque TFT ('TFTDisplayText) qui consiste à faire une sorte de boucle et j'ai mis les éléments d'affichage dans le setup;

// set the font color
  TFTscreen.stroke(255, 255, 255);
  // print the sensor value
  TFTscreen.text(sensorPrintout, 0, 20);
  // wait for a moment
  delay(250);
  // erase the text you just wrote
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text(sensorPrintout, 0, 20);

Le résultat est un peu mieux car il n'y a plus que les variables qui clignotent.

J'aimerais quand même savoir si il existe un moyen quelconque d'éviter le clignotement des variables et si oui, un bon tuto m'aiderait beaucoup.

Merci par avance
Bonne journée !
Rémi

n'affichez pas ce qui ne change pas. Il faut conserver les anciennes valeurs affichées et si l'affichage est identique alors ne pas faire d'effacement puis ré-affichage. dans votre vidéo on voit que 18.20°C est ré-affiché par exemple alors qu'il n'y a aucune raison.

tous les texte (étiquettes) qui ne changent pas ne doivent pas non plus être ré-affichés (par exemple le °C ne devrait pas bouger)

enfin minimisez la précision de l'affichage. l'humidité pourrait être juste 66% (votre capteur est il précis 2 chiffres après la virgule ?, est-ce utile d'avoir cette information ?). ce qui fait qu'il n'y a pas besoin d'affichage si vous passez de 66.50 à 66.51% par exemple. Idem pour la T°, peut -être que un chiffre après la virgule ou même arrondir à 0.5° le plus proche serait suffisant

si vous voulez pousser plus loin, il faut gérer au niveau du caractère, si la température passe de 17.5 °C à 17.6 °C vous n'avez qu'à effacer le 5 pour afficher un 6... ça demande un peu plus de code pour comparer les caractères qui ont changé dans la chaîne et bien sûr ça ne fonctionne que si la police est non proportionnelle (tous les caractères occupent la même place en horizontal)

1 Like

Merci de m'avoir répondu aussi rapidement !

J'ai modifié les textes / étiquettes, bien vu je n'y avais pas pensé ^^

Je suis d'accord pour l'affichage des décimales mais je dois encore apprendre / comprendre je vais faire.

Même chose pour la mise à jour conditionnelle de l'affichage des variables ..

Je vais creuser dans ce sens et essayer d'apprendre quelques trucs.

Merci
Rémi

pour chaque variables affichée vous conservez dans un buffer le texte exact qui est affiché

imaginons que vous gériez la température

vous avez un buffer de texte correspondant à l'affichage réel en variable globale

char  temperatureTxt[10];= "" // assez long pour contenir la température

dans le code

float temperatureCourante = ...; // lecture de la température
char courTempTxt[10]; // un buffer pour l'affichage 
snprintf(courTempTxt, "%.1f", temperatureCourante); // conversion en texte (ou dtostrf() sur AVR)
if (strcmp(temperatureTxt, courTempTxt) != 0) {
  // la température à afficher à changé, on effectue l'affichage 
  ••• // positionner le curseur et écrire en couleur du fond temperatureTxt
  ••• // positionner le curseur et écrire en couleur blanche courTempTxt
  strcpy(courTempTxt, temperatureTxt) ; // on mémorise le nouvel affichage
} 

il n'y a pas de delay à mettre non plus

1 Like

La librairie TFT s'appuie sur la librairie AdafruitGFX. Si tu définies une couleur de fond, il n'est pas nécessaire d'effacer avant d'écrire. La fonction qui dessine les caractères le gère directement.
La seule contrainte étant d'avoir toujours des chaines ayant la même longueur. Si tu écris une nouvelle chaine plus courte que la précédente, tu auras des caractères non effacés à la fin.

1 Like

Merci pour vos réponses

@fdufnews en fait j'ai déjà creusé de ce côté là..

Si je déclare une couleur de fond seulement dans le setup :

TFTscreen.background(0, 0, 0);

ça ne clignote pas mais les caractères se superposent :

Si je déclare une couleur de fond au début dans le loop ça clignote car TFTscreen.background 'efface' l'écran ( met du noir partout ) puis mes variables sont réaffichées ensuite :

Si j'affiche les valeurs seulement quant elles changent ça 'clignotera' moins souvent mais ça clignotera toujours et je ne vois pas comment résoudre ce problème.

C'est si simple avec les écrans LCD et la bibliothèque LiquidCrystal_I2C.h..

l'écran est lent donc il faut minimiser les affichages. un clignotement lors de la mise à jour d'une valeur est OK, de toutes façons vous ne pouvez pas aller plus vite à moins comme je le disais de traiter caractère par caractère pour minimiser ces affichages

postez tout votre code pour voir si on ne peut pas améliorer les choses

1 Like

Bonjour,

C'est dans TFTscreen.setTextColor() qu'il faut définir la couleur du fond comme deuxième argument pour effacement de l'écriture précédente lors de la réécriture.

1 Like

Les LCD doivent être plus rapides car on a pas du tout cet effet là ( voir au début de cette autre vidéo que j'ai postée )

j'ai posté mon code dans le premier message mais je l'ai effacé car j'ai un peu honte de moi et comme pour le moment c'est pour un usage personnel je n'ai pas mentionné les auteurs.

Je vais creuser dans votre sens @J-M-L et j'espère arriver à quelque chose de satisfaisant.

Merci

il y a beaucoup moins de pixels à "allumer". votre nouvel écran a une matrice 128x160 sans doute et sur un LCD le dessin des caractère est stocké dans le LCD et donc vous envoyez juste un octet par case pour peindre un caractère

1 Like

TFTscreen.background réalise un effacement de tout l'écran, c'est très lent.

Pour ne pas avoir à effacer, il faut utiliser setTextColor(uint16_t c, uint16_t b)

  • le premier argument c'est la couleur de premier plan
  • le second argument c'est la couleur de fond

Une fois qu'une couleur de fond est définie, la fonction d'affichage des caractères prend en charge leur tracé avec le remplissage du fond.

Un moment de honte est vite passé et au moins on est certain de parler de la même chose.
Et surtout, on peut pointer plus rapidement une erreur et proposer une correction.

1 Like

aaaahhhh merci beaucoup c'était bien ça !!
J'ai quand même cherché pendant 3 jours et lu X guides sans comprendre pff lol
Vous êtes géniaux ! merci à tous pour vos réponses et votre implication :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.