Afficher des images BMP depuis carte SD sur écran TFT LCD 2,4″ Shield Arduino
Composants et fournitures
| Arduino UNO | 1 |
À propos de ce projet
Ce tutoriel fait suite à deux autres sur le shield TFT LCD 2,4″ tactile avec Arduino UNO : le premier sur l'interface et la correction du tactile (axes inversés), le second sur le dessin de formes et la création de boutons tactiles.
Aujourd'hui, nous abordons la lecture d'images depuis une carte SD et leur affichage à l'écran. Formatez d'abord votre carte SD en FAT32, puis transférez vos images au format BMP 24 bits. Pour un affichage correct, la résolution doit être 240×320.

Orientation par défaut : setRotation(0) - images 240×320.

Orientation avec setRotation(1) - images 320×240.
Choisissez selon vos besoins : changez la rotation de l'écran ou celle de l'image sur PC. Notez le nom du fichier image, insérez la carte SD dans le shield.

Mes images BMP 24 bits sur la carte SD. Pour "Img1", on appelle "Img1.bmp" dans le code.
Bibliothèque
La bibliothèque qui a fonctionné pour moi : Télécharger ici. Si les exemples affichent un écran blanc, cherchez la bibliothèque adaptée à votre matériel.
Codes
Voici les codes utilisés dans la vidéo (format .ino). N'oubliez pas de modifier les noms de fichiers selon vos images. Consultez le tutoriel si besoin.
- Code 1
- Code 2
Code
TFT_Shield_SD_1.ino (Arduino)
/* Code pour écran TFT LCD tactile 2,4" shield, lit images BMP sur carte SD et les affiche
* Référez-vous à SurtrTech.com pour plus de détails */
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPI.h>
#include <SD.h>
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define SD_CS 10
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);
void setup() {
Serial.begin(9600);
tft.reset();
uint16_t identifier = tft.readID();
pinMode(10, OUTPUT); digitalWrite(10, HIGH);
tft.begin(identifier);
if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("failed!")); return; }
}
void loop() {
bmpDraw("Logo.bmp", 0, 0); delay(2000);
bmpDraw("Img2.bmp", 0, 0); delay(2000);
bmpDraw("Img3.bmp", 0, 0); delay(2000);
}
#define BUFFPIXEL 20
void bmpDraw(char *filename, int x, int y) {
File bmpFile;
int bmpWidth, bmpHeight; uint8_t bmpDepth; uint32_t bmpImageoffset; uint32_t rowSize;
uint8_t sdbuffer[3*BUFFPIXEL]; uint16_t lcdbuffer[BUFFPIXEL];
uint8_t buffidx = sizeof(sdbuffer); boolean goodBmp = false; boolean flip = true;
int w, h, row, col; uint8_t r, g, b; uint32_t pos = 0, startTime = millis(); uint8_t lcdidx = 0; boolean first = true;
if((x >= tft.width()) || (y >= tft.height())) return;
Serial.println(); progmemPrint(PSTR("Loading image '")); Serial.print(filename); Serial.println('\'');
if ((bmpFile = SD.open(filename)) == NULL) { progmemPrintln(PSTR("File not found")); return; }
if(read16(bmpFile) == 0x4D42) {
progmemPrint(PSTR("File size: ")); Serial.println(read32(bmpFile));
(void)read32(bmpFile); bmpImageoffset = read32(bmpFile);
progmemPrint(PSTR("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
progmemPrint(PSTR("Header size: ")); Serial.println(read32(bmpFile));
bmpWidth = read32(bmpFile); bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) {
bmpDepth = read16(bmpFile); progmemPrint(PSTR("Bit Depth: ")); Serial.println(bmpDepth);
if((bmpDepth == 24) && (read32(bmpFile) == 0)) {
goodBmp = true; progmemPrint(PSTR("Image size: ")); Serial.print(bmpWidth); Serial.print('x'); Serial.println(bmpHeight);
rowSize = (bmpWidth * 3 + 3) & ~3;
if(bmpHeight < 0) { bmpHeight = -bmpHeight; flip = false; }
w = bmpWidth; h = bmpHeight;
if((x+w-1) >= tft.width()) w = tft.width() - x;
if((y+h-1) >= tft.height()) h = tft.height() - y;
tft.setAddrWindow(x, y, x+w-1, y+h-1);
for (row=0; row<h; row++) {
if(flip) pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
else pos = bmpImageoffset + row * rowSize;
if(bmpFile.position() != pos) { bmpFile.seek(pos); buffidx = sizeof(sdbuffer); }
for (col=0; col<w; col++) {
if (buffidx >= sizeof(sdbuffer)) {
if(lcdidx > 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx = 0; first = false; }
bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx = 0;
}
b = sdbuffer[buffidx++]; g = sdbuffer[buffidx++]; r = sdbuffer[buffidx++];
lcdbuffer[lcdidx++] = tft.color565(r,g,b);
}
}
if(lcdidx > 0) tft.pushColors(lcdbuffer, lcdidx, first);
progmemPrint(PSTR("Loaded in ")); Serial.print(millis() - startTime); Serial.println(" ms");
}
}
}
bmpFile.close();
if(!goodBmp) progmemPrintln(PSTR("BMP format not recognized."));
}
uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] = f.read(); ((uint8_t *)&result)[1] = f.read(); return result; }
uint32_t read32(File f) { uint32_t result; ((uint8_t *)&result)[0] = f.read(); ((uint8_t *)&result)[1] = f.read(); ((uint8_t *)&result)[2] = f.read(); ((uint8_t *)&result)[3] = f.read(); return result; }
void progmemPrint(const char *str) { char c; while(c = pgm_read_byte(str++)) Serial.print(c); }
void progmemPrintln(const char *str) { progmemPrint(str); Serial.println(); }
TFT_Shield_SD_2.ino (Arduino) - Diaporama tactile
/* Code pour shield TFT LCD 2,4" tactile avec UNO - Diaporama d'images changeant selon la zone pressée
* Images lues depuis carte SD - Référez-vous à SurtrTech.com */
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPI.h>
#include <SD.h>
#include <SPFD5408_TouchScreen.h>
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
#define YP A3 #define XM A2 #define YM 9 #define XP 8
#define TS_MINX 176 #define TS_MINY 159 #define TS_MAXX 921 #define TS_MAXY 884
#define MINPRESSURE 10 #define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 #define SD_CS 10
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);
char x[]="x1.bmp";
void setup() {
Serial.begin(9600); tft.reset(); uint16_t identifier = tft.readID();
pinMode(10, OUTPUT); digitalWrite(10, HIGH); tft.begin(identifier);
if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("failed!")); return; }
tft.setRotation(1); bmpDraw(x, 0, 0);
}
void loop() {
if(x[1]<49) x[1]=49; if(x[1]>52) x[1]=52;
TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT);
if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
if(p.y > 0 && p.y < 100 ){ Serial.println("Left"); x[1]=x[1]-1; bmpDraw(x, 0, 0); delay(300); }
else if(p.y >200 && p.y <320){ Serial.println("Right"); x[1]=x[1]+1; bmpDraw(x, 0, 0); delay(300); }
}
}
// Fonction bmpDraw identique au code 1 (omise pour brièveté)
Schémas
C'est un shield :D

Processus de fabrication
- L'industrie de la carte de vœux : histoire, production et tendances futures
- Carte de crédit : histoire, conception, fabrication et tendances futures
- DATA MODUL Lance l'Affichage TFT 23,1″ Ultra-Fin avec Contrôle Wi-Fi Intelligent
- Distec présente l'écran TFT transflectif 7 pouces d'Ortustech : robuste, lisible en plein soleil, faible consommation
- Nuvo-7160GC : PC GPU robuste 6 TFLOPS, support GPU 120W, sortie 4K pour vision machine, VR, automatisation
- Primal Display : Construire un moniteur de température LCD avec Raspberry Pi
- Comment Installer l'Écran TFT 3,5″ Kuman sur RetroPie — Guide Étape par Étape
- L'IA génère des images de repas réalistes à partir de recettes textuelles
- Projet Arduino LCD DIY : Assemblage avec résistances, bouton poussoir et afficheur 16x2