Problème etrange avec myGLCD.drawBitmap

Bonjour,

Je suis en phase de travail sur un projet de station méteo avec un LCd TFT de 7 pouces chipset SDD1963, l'affichage est Ok pas de soucis tant que je fait du basique.

Je suis en train d'étudier les différentes phases de la Lune via des mini images de 90*90 pixels afin d’afficher sur le LCD la phase de la lune actuelle, j'ai converti les images .jpg en fichier .c via utilitaire pour le moment pas de soucis.

Si dans mon code je fait référence à la fonction permettant d'afficher une image pas de soucis, cela fonctionne, la fonction est :
myGLCD.drawBitmap(650,360,90,90,GD);

GD correspond à l'image jpg converti en GD.c , par contre dés que dans mon code je fais référence à plusieurs commande myGLCD.drawBitmap(650,360,90,90,....) plus aucun affichage écran noir.

Si je demande l'affichage de la même image en plusieurs fois pas de problème non plus.

Avec ce code pas de problème :

if ((frac <1 && frac > 0.5) && age > 14.7)
   {
     
     myGLCD.drawBitmap(650,360,90,90,GD);
   }
   /*
   else if ( frac = 0.5 && age > 14.7)
   {
     myGLCD.drawBitmap(650,360,90,90,DQ);
   }
  else if ( frac <0.3 && age > 14.7)
  {
    myGLCD.drawBitmap(650,360,90,90,DC);
  }

 */
  else
  {
     myGLCD.print("GD", 710, 450);
  }

Par contre avec celui-ci, ecran noir, la compilation et transfer OK

  //Serial.print("Moon Age ");
   //Serial.print(age);
   if ((frac <1 && frac > 0.5) && age > 14.7)
   {
     
     myGLCD.drawBitmap(650,360,90,90,GD);
   }
   
   else if ( frac = 0.5 && age > 14.7)
   {
     myGLCD.drawBitmap(650,360,90,90,DQ);
   }
  else if ( frac <0.3 && age > 14.7)
  {
    myGLCD.drawBitmap(650,360,90,90,DC);
  }


  else
  {
     myGLCD.print("GD", 710, 450);
  }

Le code prend 50% de la mémoire de la carte Arduino Mega.
"Le croquis utilise 128 744 octets (50%) de l'espace de stockage de programmes. Le maximum est de 253 952 octets.
Les variables globales utilisent 1 542 octets (18%) de mémoire dynamique, ce qui laisse 6 650 octets pour les variables locales. Le maximum est de 8 192 octets."

La je sèche complément, avez vous déjà eu ce genre de problème ?.
Merci
@+

Vos "minis images" doivent faire quasiment 1k chacune si elles sont noir et blanc... vous utilisez quoi comme utilitaire ? Vous pouvez poster un de ces .c ?

Bonjour,

L'utilitaire est celui qui est en ligne : Rinky-Dink Electronics

Images en N&B , elles font quasi 2 Ko.

J'ai mis en fichier joint un exemple de code, car trop gros pour apparaitre directement sur le forum.

PC.c (76.9 KB)

OK elle fait même presque 8k

const unsigned short PC[[color=red]8100[/color]] PROGMEM={...

mais mis en mémoire programme/Flash donc n'utilise pas directement la RAM et si je me souviens bien la fonction drawBitmap ne crée pas un buffer dynamique pour la charger mais lit directement en mémoire flash (et vous avez 256 KB pour jouer) avec une boucle et un pgm_read_word()

cela dit je viens de voir dans votre second code que vous faites

else if ( frac [color=red]=[/color] 0.5 && age > 14.7)
est-ce que - à tout hasard - ça ne devrait pas être [color=blue]==[/color] au lieu de

=

et ne serait-ce pas cette assignation au lieu d'un test qui met le bazar dans votre programme car vous avez modifié la valeur de frac et donc aucun test n'est valide et donc aucune demande d'affichage ne se fait et donc c'est normal d'avoir un écran noir ?

:grin: :grin:

Salut,

J'ai corrigé le soucis avec le = a la place du ==, mais toujours le même soucis, dés que j'ai plusieurs ligne de code qui font appel à myGLCD.drawBitmap , plus d'affichage .

J'ai fait un programme reduit qui affiche en bloucle 3 images de phases lunaires et la pas de soucis, il doit y avoir un BUG entre mon programme principal et l'appel à la fonction d'affichage des bitmap.

Le programme qui fonctionne :

#include <UTFT.h>
#include <avr/pgmspace.h>

int a =1;
 
UTFT myGLCD(SSD1963_800480, 38, 39, 40, 41); //(byte model, int RS, int WR, int CS, int RST, int SER)
extern unsigned int DC[];
extern unsigned int DQ[];
extern unsigned int GC[];
extern unsigned int GD[];
extern unsigned int NL[];
extern unsigned int PC[];
extern unsigned int PL[];
extern unsigned int PQ[];

void setup()
{
  Serial.begin(9600);
  
  pinMode(8, OUTPUT);  //backlight
  digitalWrite(8, HIGH);//on
  myGLCD.InitLCD();
  myGLCD.clrScr();
  
}

void loop()
{
  if (a==1)
  {
  myGLCD.drawBitmap(100,100,90,90,GD);
  a=a+1;
  delay(2000);
  }
  if (a==2)
  {
  myGLCD.drawBitmap(100,200,90,90,PL);
  a=a+1;
  delay(2000);
  }
 else
 { 
  myGLCD.drawBitmap(100,300,90,90,DQ);
  a=1;
  myGLCD.clrScr();
 }
}

Et la quasiment même code, mais plus d'affichage

 if ((frac <1 && frac > 0.5) && age > 14.7)
   {
     
     myGLCD.drawBitmap(650,360,90,90,GD);
   }
   
   else if (( frac > 0.4 && frac <0.5) && age > 14.7)
   {
     myGLCD.drawBitmap(650,360,90,90,DQ);
   }
  else if ((frac > 0.15 && frac <0.35) && age > 14.7)
  {
    myGLCD.drawBitmap(650,360,90,90,DC);
  }

  else
  {
     myGLCD.print("NL", 710, 450);
  }

vos if - else ne couvrent clairement pas l'ensemble des possibilités

le 1er c'est frac dans ]0.5 , 1.0[ et age > 14.7
le 2ème c'est frac dans ]0.4 , 0.5[ et age > 14.7
le 3ème c'est frac dans ]0.15 , 0.35[ et age > 14.7

donc si frac vaut 0.5 ou est entre [0.35, 0.4] ou <= 0.15 ou >= 1 ou si age <= 14.7 aucun bitmap ne va s'afficher et vous passer dans myGLCD.print("NL", 710, 450);
--> est-ce que 710,450 est sur l'écran ? (je suppose que oui et que vous avez un 800x480)
--> quelle est la police, votre couleur de police et de fond d'écran ? si vous écrivez en noir sur noir ça ne va pas trop se voir

Je sais que mes if ne teste pas toute les situation, en ce moment la lune est en phase descendante avec 50% de lumière et en Dernier quartier ce jour , par contre cela ne devrait pas provoquer un blocage de l'affichage complet du TFT, je vais mettre deux photos montrant la situation , car l'affichage des phases de la lune, n'occupe que 15% de mon affichage total

Cdt

meteo2.jpg

Par hasard, vu que ton code dépasse les 64k, tu n'aurais pas un problème avec ta librairie qui lirait les bitmaps avec pgm_read_byte_near() au lieu de pgm_read_byte_far()?

Salut,

Je ne vois pas ou chercher dans la lib du tft pour rechercher : pgm_read_byte_near() au lieu de pgm_read_byte_far() ?

Merci

fdufnews:
Par hasard, vu que ton code dépasse les 64k, tu n'aurais pas un problème avec ta librairie qui lirait les bitmaps avec pgm_read_byte_near() au lieu de pgm_read_byte_far()?

bon point - c'est une possibilité effectivement (les bitmap doivent utiliser un pgm_read_word)

@hameau
vous n'avez pas une carte SD associée à votre écran dans laquelle vous pourriez stocker vos images? comme cela plus de soucis de mémoire.

Merci pour l'aide , mais pour éviter les soucis, je vais passer par lecteur de SD présent sur TFT, je suis en train de chercher un tuto pour charger image depuis SD,

@+

Je viens de regarder vite fait dans la librairie, il y a effectivement plusieurs pgm_read_word() dans la fonction drawBitmap().
De même, il y a aussi des pgm_read_byte() dans la gestion des polices donc le problème peut apparaître aussi dans les print si le code devient trop gros.