Je recherche un écran TFT pour connecter à un Arduino Nano ou Mega, afin de finaliser la partie affichage d'une station météo.
J'ai lu, sur un post du forum que je ne retrouve plus, que le délai d'affichage est supérieur à 1 seconde sur ce type d'écran, ce qui serait apparemment incompatible avec l'affichage des secondes d'une horloge numérique (DCF77).
Deux modèles ont été repérés : Celui-ci. Sa bibliothèque est disponible ici.
Toutefois, les commentaires notent la lenteur de l'afficheur et des problèmes de mise en place du code.
Après, il y a celui-là...
...mais il est clairement indiqué "pour Raspberry Pi".
Celui que tu indiques est compatible d'un Arduino, mais il est annoncé compatible Raspberry à cause de son connecteur, qui permet de l'enficher directement sur la carte.
Pour Arduino, je te propose celui-ci :
Le lien est extraordinaire: la résolution n'est pas mentionnée sauf erreur de ma part et le driver non plus. Dommage qu'ils ne donne pas le chapelet avec pour prier que cela fonctionne!
A moins qu'il soit équipé d'un driver exotique qu'ils n'arrivaient pas à vendre si ils donnaient le nom du driver.
Et le port de Shangaï est corona-bloqué, tu as le temps pour te décider.
Pour moi, ce n'est pas pareil nano ou mega. Su une nano, je préconiserai un tft avec un dialogue SPI, car sinon soit il faut multiplexer les broches, soit on n'en a plus que 3 de disponible avec les écrans parallèle 8 bits. Avec une Mega, comme on a plus de broches, on peut se permettre d'en utiliser 15 pour l'afficheur, et profiter de la vitesse du dialogue pour que cela traîne moins.
Et à la question combien de temps met une voiture de 5 chevaux fiscaux pour aller d'une ville à une autre tu dirais combien?
C'est pareil pour l'afficheur. Si tu affiches l'heure en copiant des images de la carte SD vers l'écran, c'est sans doute plus près de 4s. Mais si tu affiche l'heures avec des lettres, c'est nettement inférieur. Et si tu veux aller vite, le mieux est l'affichage 7 segments qui ne dessine que les segments qui changent.
Sur la page de PecheuxGraph la première vidéo peut te donner une idée de la vitesse. Attention l'affichage du texte du Petit Prince a été très ralentie. Eventuellement il faut peut être plus regarder la vidéo "DemoPossibilites". De mémoire un effacement d'écran complet c'est 70ms en 320x240 (c'est proportionnel au nombre de pixels).
Faut pas croire tout ce qui est écrit. Soit le programme suivant:
#include <PecheuxGraph_ILI9486_8bits.h> // http://arduino.dansetrad.fr/PecheuxGraph
void setup()
{
Serial.begin(115200);
setGraphMode(PAYSAGE); // Initialisation de l'écran
fillRect(234, 133, 245, 144, WHITE);
fillRect(234, 175, 245, 186);
}
// Un chiffre est défini par 7 segments dont les poids sont: 1
// 2 4
// 8
// 16 32
// 64
// Pour être dans vraiment dans le pire des cas:
// - j'allume tous les segments qui doivent l'être
// - j'éteind tous les autres segments.
// Ainsi le temps est constant quel que soit le nombre.
const byte tableDesSegments[10] = {
1+2+4+16+32+64, // 0
4+32, // 1
1+4+8+16+64, // 2
1+4+8+32+64, // 3
2+4+8+32, // 4
1+2+8+32+64, // 5
1+2+8+16+32+64, // 6
1+4+32, // 7
127, //8
1+2+4+8+32+64 //9
};
void afficheChiffre(byte position, byte valeur)
{
byte segments = tableDesSegments[valeur];
int decalage = -102 * position - 36 * (position > 1);
fillRect(384 + decalage, 88, 384 + decalage + 53, 88 + 11, (segments & 1) ? WHITE : BLACK); // segment 1
fillRect(372 + decalage, 100, 372 + decalage + 11, 100 + 53, (segments & 2) ? WHITE : BLACK); // segment 2
fillRect(438 + decalage, 100, 438 + decalage + 11, 100 + 53, (segments & 4) ? WHITE : BLACK); // segment 4
fillRect(384 + decalage, 154, 384 + decalage + 53, 154 + 11, (segments & 8) ? WHITE : BLACK); // segment 8
fillRect(372 + decalage, 166, 372 + decalage + 11, 166 + 53, (segments & 16) ? WHITE : BLACK); // segment 16
fillRect(438 + decalage, 166, 438 + decalage + 11, 166 + 53, (segments & 32) ? WHITE : BLACK); // segment 32
fillRect(384 + decalage, 220, 384 + decalage + 53, 220 + 11, (segments & 64) ? WHITE : BLACK); // segment 64
}
void affiche(word valeur)
{
for (byte chiffre = 0; chiffre < 4; chiffre++) // Pour les 4 digits en commençant par le LSB
{
afficheChiffre(chiffre, valeur % 10);
valeur /= 10;
}
}
word valeur;
void loop()
{
if (valeur++ == 0) Serial.println(); // Chronométrage et incrémentation du compteur
// if (valeur % 100 == 60) valeur += 40; // Passer se 59s à 0s
// if (valeur / 60 == 60) valeur = 0; // Passer de 59mn à 0mn
if (valeur == 9999) valeur = 0; // Pour compter de 0 à 9999
affiche(valeur);
}
Il affiche sans s'arrêter les nombres à 4 chiffres sur un écran du type de celui du post #2. Il envoie sur la console un retour chariot toutes les 10000 affichage, er la console donne:
Comme je suis un peu fainéant informaticien, je garde les lignes
23:00:00.311 ->
23:03:23.399 ->
qui me donne 3mn et 23s soit 203s pour 10000 affichage. Il faut donc 20ms par affichage. Il reste 98% du temps pour faire le reste. Ou bien tu peux afficher sans problèmes les 1/10 de secondes
Pour compter mn et s, il faut supprimer les // devant les derniers if.
Pour éviter les papillotements, je n'efface que ce qui doit être effacé. C'est un grand classique.
Le programme n'est pas optimisé, j'affiche tous les chiffres, même ceux qui ne changent pas... c'est un premier jet.
Je prends également connaissance des vidéos mentionnées.
Egalement bien noté le temps de réponse pour les secondes.
Je continue donc ce projet en toute quiétude, projet pour lequel il ne reste plus que la partie affichage avec mémorisation des informations et barographe à réaliser.
L'écran que j'ai utilisé est du même type que celui que tu as choisi (c'est pas la même marque, mais c'est les mêmes drivers). Quelques remarques:
− J'utilise ma propre bibliothèque qui permet d'avoir les accents et une gestion par évènements lors des appuis sur l'écran. On peut trouver cela pour une Mega, mais la gestion prenait trop de place sur une Uno. Comme j'utilise les deux, j'ai écris ma bibliothèque qui est donc moins volumineuse. Pour l'instant, avec un ILI9486, j'ai deux lignes blanches de chaque côté de l'écran qu je ne comprends pas. Il faudrait que je vois avec une bibliothèque officielle si cela fait pareil car cela pourait venir de l'écran. C'est pour cela que je ne propose pas encore le téléchargement de la version ILI9486. Mais je peux bien évidemment te la passer.
− L'écran dialogue avec un port de donnée de 8 bits, et il n'y en a pas sur la Uno (en fait l'écran est 100% compatible et étudié pour la Uno, pas pour la Méga). Du coup pour passer une donnée sur 8 bits, il faut couper la donnée de 8 bits en deux morceaux et envoyer les deux morceaux sur 3 ports différents, ce qui prend un peu plus de temps.
Quand on met l'afficheur sur une Mega, on pourrait avoir un port entier de 8 bits, mais comme l'afficheur est fait, il utilise les broches qui viennent. Et ce n'est plus deux morceaux mais trois qu'il faut et il faut en plus 5 décalages (0 avec une Uno). Avec une carte Mega les transferts sont donc nettement plus longs (la vidéo est faire avec une Mega, on pourrait atteindre les 15ms avec une Uno).
Mais la Mega à des ports de 8 bits entiers. Si on n'enfiche pas l'afficheur, mais que l'on choisit le câblage, on peut faire les transferts en une fois, sans décalages. C'est ce que j'utilise avec une carte fond de panier qui reçoit un afficheur et une Mega. Mais, bon, avec20ms, cela doit te suffire.
− Attention aussi l'afficheur est prévu pour une Uno, et la carte afficheur utilise correctement MOSI, MISO... qui est utile pour la SD. Quand on utilise la Mega, MOSI and Co ne sont plus au même endroit et si on veut utiliser la carte SD, il faut par exemple ponter 3 broches. On en reparle si tu utilise la SD, mais il faut savoir qu'elle ne fonctionne pas en l'état.
Un utilisateur a également eu un problème avec des lignes parasites qu'il a apparemment résolu.
(lien) ; voir paragraphe Use the Web Startup, Ecran Screen 2: Looks right, except for the blue-line at the top (who knows).
Merci pour la proposition de partage de code ; je vais tout d'abord commander l'afficheur !
Je reviendrai ensuite avec intérêt.
C'est un problème de configuration, mais il n'a pas du tout le même pilote? et pis mes lignes sont blanches... Je verrais cela quand j'aurais le temps, j'ai un autre projet en cours.
J'en attends un qui vient de chine, mais ils ont bloqué le port et mon écran est toujours pas parti! Faut être riche ou patient.