Image TFT

Bonsoir,

Je voudrais de l'aide pour afficher une image sur un écran TFT.

J'en ai de 1.8" et de 3.5". Le problème est que je n'arrive pas à trouver comment on fait.

J'utilise les librairies Adafruit_GFX.h plus Adafruit_ST7735.h pour mon 1.8" et MCUFRIEND_kbv.h pour le 3.5".

Est-ce que vous pouvez m'aider ?

Peut-être est-ce possible avec ces librairies ?
Et, après suis-je obliger de mettre une carte SD pour une seule image bitmap ?

Merci par avance.

quelle est la taille de votre image et sur quel arduino êtes vous?

L'image peut faire n'importe quelle taille, je sais la recadrer et la mettre en bitmap.
Je peux être sur Mega ou Uno.

Calvin-duino:
L'image peut faire n'importe quelle taille, je sais la recadrer et la mettre en bitmap.
Je peux être sur Mega ou Uno.

une image 128*160 pixels pour votre 1.8 pouces en couleur (?) c'est 3 octets par pixels

3 x 128 x 160 = 61 440 octets (ou 2560 octets si noir et blanc, 1 bit par pixel)

combien avez vous de RAM sur votre UNO ou MEGA ?

The ATmega328 chip found on the Uno has the following amounts of memory:

Flash  32k bytes (of which .5k is used for the bootloader)
SRAM   2k bytes
EEPROM 1k byte

The ATmega2560 in the Mega2560 has larger memory space :

Flash  256k bytes (of which 8k is used for the bootloader)
SRAM   8k bytes
EEPROM 4k byte

et donc... on va le mettre où cette image ?

sur le mega je dirais mais ca laisse peu de place pour le reste.
j'ai eut le même problème mais sur un nano avec écran noir et blanc donc beaucoup moins d'octets à mettre, mais il faut savoir que mettre une image bitmap sur un arduino directement ca prends énormement de place Calvin-duino, ton image fait 60Ko sur une flash a 32Ko ca passe pas ...

Ok, mais avez vous un code qui marche pour afficher une image avec un lecteur de SD (si possible avec mes librairies)?

Si le bitmap est stocké dans le format attendu par la librairie, il y a la fonction

</sub> <sub>[color=purple]void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)[/color]</sub> <sub>

vous passez la position en haut à gauche (x et y) du bitmap, sa largeur (w) et sa hauteur (h), un pointeur sur le début du bloc des données bitmap et tous les bits à 1 dans le bitmap prendront la couleur color et tous les bits à 0 ne seront pas touchés

Vu le peu de SRAM le pointeur bitmap doit être en mémoire programme (donc que vous chargez avec PROGMEM à la compilation)

Sion vous avez l'approche "de base" il faut parcourir la structure de données qui contient votre bitmap (en mémoire ou dans le fichier), lire un point (N&B ou RGB), décider de la correspondance entre la position du point dans la structure et l'écran, puis utiliser l'API
</sub> <sub>[color=purple]drawPixel(uint16_t x, uint16_t y, uint16_t color)[/color]</sub> <sub>
qui permet d'allumer un point d'une certaine couleur - puis passer au point suivant

sinon il y a des exemples pour MCUFRIEND_kbv.h (--> drawBitmap_kbv)

Bonjour, merci beaucoup !

J'ai réussi à afficher mon image sur le TFT sur le MEGA (pas le UNO car pas assez puissant) :

#include "MCUFRIEND_kbv.h"
MCUFRIEND_kbv tft;

int x = 50, y = 50;

#include "fourmi.h"

#define BLACK   0x0000

void setup()
{
    Serial.begin(9600);
    tft.begin(tft.readID());
}
void loop(void)
{
    tft.fillScreen(BLACK);
    tft.drawRGBBitmap(x, y, fourmi, 112, 83);
    delay(2000);
}

J'ai quand même deux questions :

  • Savez-vous comment retirer le fond de l'image ? car, j'avais un png sur lequel le fond était vide et la c'est un fond blanc.
  • j'ai mis le .h sur une SD mais, je n'arrive pas à afficher l'image de la SD. J'ai essayer avec des exemples sur Internet mais pas moyen. Pourriez-vous m'aider ?

Calvin-duino:
J'ai réussi à afficher mon image sur le TFT sur le MEGA (pas le UNO car pas assez puissant) :

bravo ! :slight_smile:

Calvin-duino:
J'ai quand même deux questions :

  • Savez-vous comment retirer le fond de l'image ? car, j'avais un png sur lequel le fond était vide et la c'est un fond blanc.
  • j'ai mis le .h sur une SD mais, je n'arrive pas à afficher l'image de la SD. J'ai essayer avec des exemples sur Internet mais pas moyen. Pourriez-vous m'aider ?

pour retirer le fond il faut peindre un rectangle noir avant de dessiner le bitmap car les 0 sont juste sautés

le .h quand il est inclus dans le code (#include "fourmi.h") injecte ce qu'il y a dedans à cet endroit du programme --> ce sera compilé avec votre programme.. sur la carte SD c'est juste un ficher texte.. il faudrait générer en binaire (dans un format un peu propre et simple) la bitmap et la stocker sur la carte SD, un peu l'équivalent de la structure d'octet que vous avez en mémoire sur votre Arduino une fois compilé

vous pourriez lire octet par octet ce qu'il y a dans le bitmap et écrire cela en binaire sur la carte SD, ça fabriquerait votre fichier équivalent

Est-ce que vous auriez un lien pouvant m'aider pour lire de la carte SD ?

perso j'utilise la librairie SdFat qui est du même auteur que la librairie SD intégrées en standard dans l'IDE mais plus avancée dans son fonctionnement et plus stable/performante

il y a des exemples fournis et la documentation est complète.

regardez éventuellement ReadWrite.ino, vous verrez que ce n'est pas sorcier. On initialise la connexion à la carte SD, on ouvre un fichier en lecture ou écriture, on fait des read ou write ou print et on ferme le fichier.

voici un petit exemple de code (pas testé, juste tapé) qui écrit 4 octets en binaire dans un fichier et qui les relit. ça devrait marcher....

#include <SPI.h>
#include "SdFat.h"
SdFat SD;

#define SD_CS_PIN SS
File myFile;

void setup() {
  Serial.begin(115200);
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println(F("erreur acces SD"));
    return;
  }

  // on écrit 4 octets DEADBEEF
  myFile = SD.open("test.bin", O_WRITE);
  if (myFile) {
    myFile.write(0xDE);
    myFile.write(0xAD);
    myFile.write(0xBE);
    myFile.write(0xEF);
    myFile.close();
  } else {
    Serial.println(F("erreur ecriture fichier"));
  }

  // on relit ce qu'il y a dedans, on devrait voir 4 octets DEADBEEF
  myFile = SD.open("test.bin", O_READ);
  if (myFile) {
    while (myFile.available()) Serial.print(myFile.read(), HEX);
    myFile.close();
    Serial.println();
  } else {
    Serial.println(F("erreur lecture fichier"));
  }
}

void loop() {}

la connexion est de base sur votre MEGA:
MOSI -> pin 51
MISO -> pin 50
CLK -> pin 52
SS -> pin 53

bien sûr câbler le 5V et GND...

Je sais utiliser un lecteur de cartes SD mais, c'est lire et afficher une image sur TFT que je ne parviens pas à faire.

J'utilise également cette librairie...

Calvin-duino:
Je sais utiliser un lecteur de cartes SD mais, c'est lire et afficher une image sur TFT que je ne parviens pas à faire.

postez votre fichier fourmi.h

Vous avez un code ?

fourmi.h (87.4 KB)

Non pas vraiment, mais ce que j'essayerais de faire c'est de créer un fichier binaire avec les données de l'image

/* SUR MEGA
  MOSI -> pin 51
  MISO -> pin 50
  CLK -> pin 52
  SS  -> pin 53
  et bien sûr câbler le 5V et GND...
*/


#include <SPI.h>
#include "SdFat.h"
SdFat SD;

#define SD_CS_PIN SS
File myFile;

const uint16_t fourmi[9296] PROGMEM = {
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   // 0x0010 (16) pixels
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   // 0x0020 (32) pixels
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE,   // 0x0030 (48) pixels
  0xB596, 0x6B6D, 0x4228, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4208, 0x4208, 0x630C, 0x9492, 0xBDF7, 0xEF5D,   // 0x0040 (64) pixels

  ... J'AI COUPE ICI POUR QUE CA RENTRE DANS CE POST

  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CF3, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   // 0x2440 (9280) pixels
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   // 0x2450 (9296) pixels
};

const size_t tailleImage = 9296 * sizeof(uint16_t); // le nombre d'octets dans le tableau


void setup() {
  Serial.begin(115200);
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println(F("erreur acces SD"));
    return;
  }

  // on écrit les octets en mémoire
  myFile = SD.open("fourmi.bin", O_WRITE);
  if (myFile) {
    myFile.write(fourmi, tailleImage); // J'ai jamais essayé de voir si la fonction write de la SDFat  traite le PROGMEM correctement , à vérifier
    myFile.close();
  } else {
    Serial.println(F("erreur ecriture fichier"));
  }

}

void loop() {}

une fois que vous avez fait tourner cela, vous avez un fichier sur votre carte SD qui s'appellera fourmi.bin et qui correspond bit à bit à votre structure mémoire.

Pour l'afficher () vous le relisez bout par bout (à vous de définir la taille du buffer supportable par votre programme, 512 octets sur un MEGA correspondraient au buffer de la libraire) et vous faites une boucle qui allume ou éteint les pixels en fonction de cela - bien sûr faudra connaître la taille de l'image, ça doit être codé quelque part sans doute

--> ce sera lent

Tant pis, trop compliqué pour moi ...

sinon vous avez regardé TFTLoadImage ? (Esplora) - vous pourriez lire le code...