écran MI0283QT2 et interface graphique

Bonjour ,
j'utilise un écran MI0283QT2 pour mon automate a terrarium et je rencontre des soucis

1er- lorsque l'on cherche a faire une interface assez estetique (exemple bouton ou icone) et que l'on charge un fichier BMP depuis une SD card, cela prend énormément de temps , enfin on vois ce dessiner le dit fichier a l’écran .
d’après ce que j'ai vu dans des poste c'est apparemment le taux de rafraîchissement de l’écran qui est trop faible.

savez vous si l'on peut amélioré cela de manière a ne plus avoir ce temps de chargement?(mémé si j'ai une bonne idée de la réponse)

2eme- toujours d'un point de vus graphique lorsque l'on dessine un rectangle plein avec
ex: lcd.fillRect(X1,Y1,X2,Y2,couleur); et que l'on souhaite marquer dessus du texte avec : lcd.Drawtext(X1,Y1,taille,couleur,couleur fond),
on vois que sa clignote (j'imagine que c'est lier au rafraîchissement aussi), avez vous également une solution?

pour le moment la seul méthode que j'ai trouver consiste a écrire du texte en paramétrant la couleur du fond de texte et en traçant les pixel autour du texte mais c'est très rébarbatif !!

si quelqu'un a des idées et un peut de temps a donner ,on pourrait faire un tuto , car je n'ai pas trouver de réponse claire sur le net ou le forum et pour les débutant comme moi sa serai pas mal !
il y a de très bonne chose sur le net mais compliqué a mon gout et pas forcément a la porté de tous .
merci ! :slight_smile:

Bonjour,

Heloderma-kris:
1er- lorsque l'on cherche a faire une interface assez esthétique (exemple bouton ou icone) et que l'on charge un fichier BMP depuis une SD card, cela prend énormément de temps , enfin on vois ce dessiner le dit fichier a l’écran .
d’après ce que j'ai vu dans des poste c'est apparemment le taux de rafraîchissement de l’écran qui est trop faible.

Le chargement depuis un périphérique externe prend énormément de temps car il faut pré-charger l'image avant de l'afficher, l'écran et la carte sd utilisant le même bus il est impossible de réaliser les deux actions en parallèle.
La seul optimisation possible est de stocker les données suivant un format RAW et de précharger des sections de 320 pixels (une ligne).
Exemple : [Arduino/Python/GLCD] Chargement d’image depuis carte SD | Skyduino - Le DIY à la française

Heloderma-kris:
savez vous si l'on peut amélioré cela de manière a ne plus avoir ce temps de chargement?(mémé si j'ai une bonne idée de la réponse)

lcd.init(2); pour avoir la fréquence de travail la plus grande et du "bricolage" au niveau du code, ya pas d'autre solution.
Dans tout les cas le rafraichissement sera toujours visible d'une manière ou d'une autre.

Heloderma-kris:
2eme- toujours d'un point de vus graphique lorsque l'on dessine un rectangle plein avec
ex: lcd.fillRect(X1,Y1,X2,Y2,couleur); et que l'on souhaite marquer dessus du texte avec : lcd.Drawtext(X1,Y1,taille,couleur,couleur fond),
on vois que sa clignote (j'imagine que c'est lier au rafraîchissement aussi), avez vous également une solution?

pour le moment la seul méthode que j'ai trouver consiste a écrire du texte en paramétrant la couleur du fond de texte et en traçant les pixel autour du texte mais c'est très rébarbatif !!

Remplit ton rectangle une premiére fois, ensuite fait en sorte que la couleur de fond du texte soit identique à celle du rectangle.
A chaque rafraichissement du texte le fond "effacera" le texte précédant.
C'est la meilleur méthode.

Heloderma-kris:
si quelqu'un a des idées et un peut de temps a donner ,on pourrait faire un tuto , car je n'ai pas trouver de réponse claire sur le net ou le forum et pour les débutant comme moi sa serai pas mal !
il y a de très bonne chose sur le net mais compliqué a mon gout et pas forcément a la porté de tous .

Faut pas ce faire d'illusions, la création d'un GUI est la chose a plus complexe qu'il soit !
Ce n'est pas sur les forums pour débutant tout simplement parce que ce n'est pas du niveau d'un débutant :wink:

Quelque exemples de GUI :

(J'utilise des images vectoriels pour générer le fichier point.h, le dessin d'un vecteur (ligne, rectangle, point, ...) et beaucoup plus rapide que le chargement d'une image)

2eme- toujours d'un point de vus graphique lorsque l'on dessine un rectangle plein avec
ex: lcd.fillRect(X1,Y1,X2,Y2,couleur); et que l'on souhaite marquer dessus du texte avec : lcd.Drawtext(X1,Y1,taille,couleur,couleur fond),
on vois que sa clignote (j'imagine que c'est lier au rafraîchissement aussi), avez vous également une solution?

je suis un peu surpris.
Quelques précautions:
Il faut surtout faire attention à ne redessiner que ce qui est modifié et pas plus afin de raccourcir la durée de la mise à jour.
Il faut être attentif à la période de rafraichissement de l'information. Il est inutile voir contre productif de rafraichir en permanence l'affichage si le contenu ne change pas. Attention a ne pas passer dans la routine de mise à jour de l'écran à chaque itération dans loop. Par exemple pour une température qui évolue lentement il est inutile de mettre à jour le champ 10 fois par seconde
De manière générale ne pas effacer l'écran c'est long et pendant un bon moment il n'y a plus d'info à l'écran et cela donne un affichage qui papillote.
Pour mettre à jour plusieurs champs:
effacer un champs
le mettre à jour
passer au suivant.
il ne faut pas faire
effacer tous les champs
les mettre à jour

le problème vient peut-être de mon code alors :

void MenuPrincipale(){
//lecture de la RTC
rtc.get(&sec, &min, &hour, &day, &month, &year);

//:::::::::::::::::::::::::::::::::::::::::::::::::::::Partie affichage du menu principale:::::::::::::::::::::

lcd.fillRect(1,1,320,20,COLOR_BLACK);
sprintf(buf, "%02i : %02i : %02i", hour, min, sec);//affichage heure et date
lcd.drawText(5, 5, buf, 1, COLOR_WHITE,COLOR_BLACK );
sprintf(buf, "%02i / %02i / %04i", day, month, year);
lcd.drawText(120, 5, buf, 1, COLOR_WHITE, COLOR_BLACK);
}

explication: dans mon loop il y a juste un swich case pour me déplacer dans les menus
la partie du code que je vous ais mis me créé un clignotement a environ 3 à 4hz

fdufnews je vois ce que tu veux dire mais comment dessiner un rectangle et ne pas y toucher lors du déroulement du programme?

merci pour tes liens Skywodd je les ais déjà regarder mais je n'y avais pas trouver les info ou du moins je n'ai pas encore les compétence pour en tiré ma réponse !

void MenuPrincipale(){
  //lecture de la  RTC
  rtc.get(&sec, &min, &hour, &day, &month, &year);


  //:::::::::::::::::::::::::::::::::::::::::::::::::::::Partie affichage du menu principale:::::::::::::::::::::

lcd.fillRect(1,1,320,20,COLOR_BLACK);
  sprintf(buf, "%02i : %02i : %02i", hour, min, sec);//affichage heure et date
  lcd.drawText(5, 5, buf, 1, COLOR_WHITE,COLOR_BLACK );
  sprintf(buf, "%02i / %02i / %04i", day, month, year);
  lcd.drawText(120, 5, buf, 1, COLOR_WHITE, COLOR_BLACK);
}

Tu fais exactement ce que je déconseille. Le texte n'occupe qu'une toute petite partie de l'écran et tu effaces celui-ci dans son intégralité.
En fait chaque chaine de texte n'occupe qu'une surface comprise entre son originex, origineY (5,5 pour la première chaine par exemple) et la fin de la chaine.
Pour déterminer les coordonnées de la surface occupée par la chaine:
La coordonné y max pour la chaine c'est : originey + FONT_HEIGHT
La coordonnée x max pour la chaine c'est : longueur_chaine * size * FONT_WIDTH

FONT_HEIGHT et FONT_WIDTH sont des define déclaré dans fonts.h ils dépendent de la police utilisée.
size c'est le coefficient d'échelle que tu utilises dans la méthode drawText pour donner la taille des caractères (1 dans ton cas)

Comparaison des performances

L'heure occupe une douzaine de caractères
Avec la police 8 x 12
La surface à effacer:
largeur : 12 x 8 // nombre de caractères x largeur police
hauteur : 12 // hauteur police
total = 12 * 12 * 8 = 1152 points

Effacement de l'écran
largeur : 320
hauteur : 240
total = 320 x 240 = 76800 points

Il y a un rapport d'environ 66 entre les deux.

cool j'ai trouver ma solution que voici alors je ne sait pas si c'est ce qu'il y a de mieux mais sa marche trés bien et il n'y a plus de probléme voici mon code:

void MenuPrincipale(){ 
  static byte comptAff;
  //lecture de la  RTC
  rtc.get(&sec, &min, &hour, &day, &month, &year);


  //:::::::::::::::::::::::::::::::::::::::::::::::::::::Partie affichage du menu principale:::::::::::::::::::::
switch (comptAff){
case 0 :
lcd.fillRect(1,1,320,20,COLOR_BLACK);
comptAff=1;
break;
case 1:

  sprintf(buf, "%02i : %02i : %02i", hour, min, sec);//affichage heure et date
  lcd.drawText(5, 5, buf, 1, COLOR_WHITE,COLOR_BLACK );
  sprintf(buf, "%02i / %02i / %04i", day, month, year); 
  lcd.drawText(120, 5, buf, 1, COLOR_WHITE, COLOR_BLACK);
break;};

explication je génère une premier foi la trame de fond (tout l’arrière plan) et ensuite je ne génère plus que les affichage de variable ou autre
pour ça j'ai créé une variable local statique appeler comptAff qui initialement vaux 0 au premier passage dans la boucle switch elle va donc permette de tracer l’arrière plan et a la fin du case 0 la variable prend la valeur 1 et le programme va donc s’occuper uniquement de réécrire les ligne contenue dans le case 1.

explication je génère une premier foi la trame de fond (tout l’arrière plan) et ensuite je ne génère plus que les affichage de variable ou autre

Exactement c'est l'idée.
On économise les ressources ou on gagne du temps de rafraichissement de l'écran.
Du coup l'application est plus réactive et l'affichage plus agréable.