Utilisation d'un écran TFT+ SD card bug

Bonjour à tous,

Voilà, après de longues journées passées à essayer d’utiliser un écran TFT , je m’en remet à vous.

(Au départ, je voulais un écran tactile. D’abord j’avais commandé un écran soit disant tactile mais aliexpress m’a mis une quenelle, puis un autre qui ne fonctionne pas sur 5V et sans shield, enfin bref :smiley: )

C’est la dernière marche avant que je puisse finir la première partie de mon projet ( hydroponie).

L’utilisation de mon écran TFT ne me pose aucun problème, tout fonctionne en utilisant la libraire UTFT

Seulement, afficher des images sur l’écran à partir d’une carte SD est une vraie galère !
La libraire tinyfat ne fonctionnant que pour des cartes mémories de 2 Go je préfère m’en passer.

Je me suis reporté sur la UTFT_SDraw mais rien ne va.
En pièce jointe, vous pouvez voir les images d’origine et comment elles sont affichées sur l’écran

  • les images sont affichées dans des couleurs différentes ( sauf le thermomètre)
  • impossible de multiplier leur taille
  • le background de l’image est mis en blanc à la place du noir.

Ce sont des détails importants pour moi pour avoir quelque chose d’ergonomique.

Voici le code test utilisé ;

include <SPI.h>

#include <SdFat.h>
#include <UTFT.h>
#include <URTouch.h>
#include <UTFT_SdRaw.h>
extern uint8_t SmallFont[];
extern uint8_t BigFont[];

#define SD_CHIP_SELECT  53  // SD chip select pin
// file system object
SdFat sd;
// print stream
//ArduinoOutStream cout(Serial);


UTFT myGLCD(ILI9486, 38, 39, 40, 41);

UTFT_SdRaw myFiles(&myGLCD);


void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println(F("Initialising SD card..."));
  bool mysd = 0;
  // see if the card is present and can be initialized:
  while (!mysd)
  {
    if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) {
      Serial.println(F("Card failed, or not present"));
      Serial.println(F("Retrying...."));
    }
    else
    {
      mysd = 1;
      Serial.println(F("Card initialised."));
    }
  }
  Serial.println(F("Initialising LCD."));
  myGLCD.InitLCD();
  myGLCD.clrScr();
   myGLCD.fillScr(255,255,255);
  myGLCD.setFont(SmallFont);

  Serial.println(F("LCD initialised."));

myFiles.load(0, 0, 48, 63,"1image48x63.RAW",1,0);
myFiles.load(100, 100, 60, 51,"Thermometre.RAW",1,1);
myFiles.load(200, 200, 30, 30, "Clock.raw",4,0); //myFiles.load(x coordinate, y coordinate, image-x-size, image-y-size, fname[, buffer-size-multiplier, invert colour]);



}

void loop()
{
}

Merci pour votre aide, je commence à désespérer !

4dosing.png

6clock.png

As-tu essayé les exemples de la bibliothèque UTFT_SDraw ? L'auteur de cette bibli est membre du forum ghlawrence2000 (Graham Lawrence), tu peux trouver des posts auxquels il participe (voir par exemple ici) et aide les personnes en difficulté avec sa bibli, ou même lui envoyer un PM pour demander de l'aide.

Salut lesept,

Merci de ta réponse.

J'avais déjà envoyé un mp, aucune réponse malheureusement.
Et il y a eu beaucoup d'évolution sur sa librairie, j'ai lu un maximum, y a eu des bugs de couleurs mais tous ont été réparés à ce que j'ai lu par un changement de code sur le "inverter color" malheureusement chez moi il y a tjs les mêmes soucis énoncés plus haut.

J'ai vu ton post sur le forum "display" et la réponse bizarre que tu as obtenue...
Peux-tu modifier ton premier message ci-dessus en utilisant les balises CODE au lieu de QUOTE ? C'est plus facile à lire.

L'image de ton écran :

On dirait que l'écran affiche les images avec des couleurs complémentaires.

  • Rouge - Cyan
  • Bleu - Jaune
  • Vert - Magenta
    En codage RVB, ça se traduit par sur les trois composantes :
couleur complémentaire = 255 - couleur initiale

Il faudrait vérifier si c'est la lecture du fichier depuis la carte SD qui fait ça, ou si c'est l'écran. Mais de toutes façons, dans les deux cas il suffirait d'afficher chaque pixel de tes icônes en complémentaire.

Pas simple...

Pour savoir si le problème vient de l'affichage, tu peux changer de bibliothèque. Moi je fais souvent de la pub pour la bibli TFT_eSPI de Bodmer qui fonctionne avec ton type d'écran (ILI9486). Pour l'utiliser, tu édites le fichier user_setup_select.h pour sélectionner ce type d'écran. Il t'indique directement dans le fichier les pins de branchement. Tu as 4 possibilités : les numéros 5, 6, 10 ou 11. Je ne sais pas laquelle correspond à ton écran, il te faudra les tester l'une après l'autre...

Sinon, il est peut-être plus simple d'utiliser les bibli d'Adafruit

NOTE : sur le site d'Adafruit, il est écrit :

Its really easy to draw bitmaps. However, this is only supported when talking to the display in SPI mode, not 8-bit mode!

Or il semble que tu sois connecté en mode 8 bits. Ça se voit dans cette ligne de ton code :
UTFT myGLCD(ILI9486, 38, 39, 40, 41);Les pins 38 à 41 sont les pins (voir l'image plus haut)

  • CS (Chip Select)
  • C/D (Command/Data)
  • WR (Write)
  • RD (Read)Ce sont celles qui sont utilisées en mode 8 bits.
    [/list]Donc tu devrais tester le mode bus SPI. Soit avec la bibli TFT_eSPI, soit avec celle d'Adafruit. Je pense que ton problème disparaitra alors.

Génial, je vais essayer ca !

Je pense que tu as raison, la bibli UTFT_Sdraw me dessine les images en couleurs inversées... Pourtant quand je les inverse le blanc de fond ( qui devrait être noir) reste blanc, et pour la plupart des images, les couleurs ne correspondent pas du tout.

Je vais donc tenter ta solution avec le SPI, je suppose que l'affichage sera plus lent ?

Merci lesept

Pas forcément. pour plus d'infos sur le SPI, voir ici. Sur un ESP32, le SPI fonctionne à 80 MHz

Salut Lesept,

J'ai regardé ces deux librairies ;

TFT_eSPI : "An Arduino IDE compatible graphics and fonts library for ESP8266 and ESP32 processors", ce ne serait donc pas compatible avec un MEGA ? Je ne l'avais pas mentionné, je travailla sur arduino MEGA.

Je pars donc pour Adafruit GX grapfics ;

lesept:
NOTE : sur le site d'Adafruit, il est écrit :
Or il semble que tu sois connecté en mode 8 bits. Ça se voit dans cette ligne de ton code :
UTFT myGLCD(ILI9486, 38, 39, 40, 41);Les pins 38 à 41 sont les pins (voir l'image plus haut)

  • CS (Chip Select)
  • C/D (Command/Data)
  • WR (Write)
  • RD (Read)Ce sont celles qui sont utilisées en mode 8 bits.
    Donc tu devrais tester le mode bus SPI. Soit avec la bibli TFT_eSPI, soit avec celle d'Adafruit. Je pense que ton problème disparaitra alors.

LCD_RST serait donc égal à D/C ? ( pcq il n'y aucun point C/D ou D/C sur l'image, difficile de s'y retrouver, et pour moi RST= reset)
LCD_RS serait donc égal à Read ?

Je vois souvent pourtant LCD_RS et LCD_RD, comme ici https://www.amazon.fr/Kuman-Tactile-Arduino-Module-Fonction/dp/B075CXXL1M/ref=sr_1_5?ie=UTF8&qid=1538241339&sr=8-5&keywords=tft+touch+screen

Pourrais-tu aussi me dire à quoi correspond FLASH_CS?

Désolé pour toutes ces questions mais j'essaie de m'y retrouver :slight_smile:

J'essaie déjà, je te tiens au courant des avancées,

Encore merci !

Si tu te mets en SPI, tu dois utiliser les pins SPI_MOSI, SPI_MIO, SPI_CLK et une pin CS. SD_CS doit être pour lire la carte SD en SPI donc peut-être que c'est FLASH_SD pour l'écran

Salut, je ne sais pas si tu as réussi à avancer sur ton écran : voici un lien qui te donnera ce que tu cherches, avec des liens vers des exemples de codes.

Ce serait un ILI9481 (datasheet) : tu peux aussi chercher sur Google "ILI9481 SPI arduino" pour des exemples...

Sinon, un autre exemple ici, mais pas en SPI

Merci lesept,

Je vais donc définitivement aller sur du SPI.

J'ai également reçu mon touchscreen, qui a malheureusement besoin d'un shield et qui possède 2x17 pins au lieu de 2X20 pins pour être compatible avec le Mega & les shields pour passer en 3.3V.

Penses-tu qu'avec ce shield ci

Je puisse utiliser cet écran-ci ?

Juste en y connectant C/D , CS, WR & RD ? Si je trouve les pins correspondantes sur le shield avec un peu de chance