ESP32 - Écran TFT LCD Tactile SPI ILI9341 ILI9488 ST7789
Construisons un projet qui donne vie à un écran TFT SPI couleur sur un ESP32. L'ESP32 est un microcontrôleur double cœur avec WiFi, Bluetooth et de nombreuses GPIO — et son bus SPI matériel VSPI permet de piloter facilement un écran TFT haute vitesse.
Ce que nous allons construire :
- Une connexion câblée entre un ESP32 et un écran TFT SPI.
- Une démonstration de formes utilisant l'API de dessin Adafruit GFX.
- Un exemple d'affichage de texte et de nombres.
- Un visualiseur d'images bitmap lisant depuis la mémoire programme (PROGMEM).
- Un visualiseur d'images bitmap lisant des images depuis une carte SD.
- Une démonstration de police externe personnalisée.
- Un lecteur de coordonnées tactiles utilisant un contrôleur XPT2046.
- Une application de dessin tactile (peinture au doigt sur l'écran).
- Une interface de boutons tactiles interactifs.
- Un outil de calibration de l'écran tactile.
- Un exemple de bus SPI personnalisé utilisant le HSPI de l'ESP32.
Ce projet couvre les écrans TFT LCD SPI tactiles et non tactiles. Il fonctionne avec des panneaux de 1,3, 1,54, 2,2, 2,4, 2,8, 3,2 et 3,5 pouces pilotés par les puces ILI9341, ILI9488 ou ST7789.

Matériel Requis
Ou vous pouvez acheter les kits suivants:
| 1 | × | Kit de Démarrage DIYables ESP32 (ESP32 inclus) | |
| 1 | × | Kit de Capteurs DIYables (18 capteurs/écrans) |
Qu'est-ce que l'Écran TFT SPI ?
Un module TFT SPI associe un LCD couleur à un CI pilote qui accepte des commandes de dessin via un bus SPI 4 fils. La bibliothèque prend en charge trois puces courantes :
- ILI9341 - couleur RGB565 16 bits, SPI jusqu'à 40 MHz.
- ILI9488 - couleur RGB666 18 bits sur SPI, jusqu'à 24 MHz.
- ST7789 - couleur RGB565 16 bits, SPI jusqu'à 40 MHz.
Recommandation : Si vous n'avez pas encore acheté d'écran, nous recommandons le pilote ST7789. Il est largement disponible, fonctionne à la pleine vitesse SPI de 40 MHz, et constitue le choix le plus simple pour les nouveaux projets.
Le dessin est géré via l'API Adafruit GFX, qui inclut des formes, du texte, des polices personnalisées et des bitmaps.
Note : L'ESP32 utilise la logique 3,3V. La plupart des modules TFT SPI fonctionnent à 3,3V. Vérifiez la spécification de tension de votre module avant le câblage.
Brochage
La plupart des écrans TFT LCD SPI ont les broches suivantes :
Broches d'affichage :
| Broche | Fonction |
|---|---|
| VCC | Alimentation |
| GND | Masse |
| CS | Sélection de puce — mis à LOW pour sélectionner l'afficheur sur le bus SPI |
| DC / RS | Sélection Données / Commande — HIGH pour les données pixel, LOW pour les commandes |
| RST | Réinitialisation matérielle — optionnel ; reliez à 3,3V si non utilisé |
| MOSI / SDI / SDA | Données SPI en entrée (MCU → afficheur) |
| SCK / CLK | Horloge SPI |
| MISO / SDO | Données SPI en sortie (afficheur → MCU) — optionnel pour utilisation affichage uniquement |
| LED / BL / BLK | Alimentation rétroéclairage — connecter à 3,3V ou une broche PWM pour le gradateur |
Broches de carte SD (si votre application doit accéder à la carte SD) :
| Broche | Fonction |
|---|---|
| SD_CS / TF_CS | Sélection de puce carte SD |
| MOSI / SDI | MOSI — données du MCU vers la carte SD |
| SCK / CLK | SCK — horloge SPI |
| MISO / SDO | MISO — données de la carte SD vers le MCU |
Pour les écrans TFT prenant en charge le tactile, il y a des broches tactiles supplémentaires (si votre application utilise la fonction tactile et que l'écran la prend en charge) :
| Broche | Fonction |
|---|---|
| T_CS | Sélection de puce du contrôleur tactile |
| T_CLK | SCK — horloge SPI |
| T_DIN | MOSI — données du MCU vers le contrôleur tactile |
| T_DO | MISO — données du contrôleur tactile vers le MCU |
| T_IRQ | Interruption tactile — optionnel ; signale quand l'écran est touché |
Note : Certains modules d'affichage non tactiles exposent également les broches T_CS, T_CLK, T_DIN, T_DO et T_IRQ. Celles-ci sont non fonctionnelles sur ces cartes — le CI contrôleur tactile n'est pas implanté. Elles apparaissent car le PCB réutilise la même conception que la version tactile pour réduire les variantes de fabrication.

Schéma de Câblage
Sans Tactile
Connectez MOSI à GPIO23, SCK à GPIO18, MISO à GPIO19 sur l'ESP32. CS, DC et RST peuvent être n'importe quelle GPIO disponible — GPIO5, GPIO2, GPIO4 sont utilisés dans les exemples.
Afficheur :
| Broche TFT | Broche ESP32 | Description |
|---|---|---|
| VCC | 3.3V | Alimentation (3,3V uniquement) |
| GND | GND | Masse |
| CS | GPIO5 | Sélection de puce |
| DC / RS | GPIO2 | Sélection Données / Commande |
| RST | GPIO4 | Réinitialisation (optionnel) |
| MOSI / SDI | GPIO23 | MOSI SPI matériel (VSPI) |
| SCK | GPIO18 | Horloge SPI matériel (VSPI) |
| MISO / SDO | GPIO19 | MISO SPI matériel (VSPI, optionnel) |
| LED / BL | 3.3V | Alimentation rétroéclairage |
Carte SD (si votre application doit accéder à la carte SD) :
| Broche SD | Broche ESP32 | Description |
|---|---|---|
| SD_CS / TF_CS | n'importe quelle GPIO libre | Sélection de puce carte SD |
| MOSI / SDI | GPIO23 | Partagé avec MOSI afficheur (GPIO23) |
| SCK / CLK | GPIO18 | Partagé avec SCK afficheur (GPIO18) |
| MISO / SDO | GPIO19 | Partagé avec MISO afficheur (GPIO19) |

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, consultez les instructions dans le tutoriel suivant : Comment alimenter l'ESP32..
Note : Le schéma ci-dessus montre le câblage correct. En pratique, connecter deux fils dans le même trou de broche de l'ESP32 n'est pas facile. Une solution pratique est d'utiliser un bloc de connexion à vis pour ESP32 — deux fils peuvent être fixés dans la même borne à vis, ou un fil dans la vis et un dans la broche adjacente.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Avec Tactile
Connectez le contrôleur tactile XPT2046 au bus VSPI de l'ESP32, en partageant GPIO23, GPIO18 et GPIO19 avec l'afficheur.
Afficheur :
| Broche TFT | Broche ESP32 | Description |
|---|---|---|
| VCC | 3.3V | Alimentation (3,3V uniquement) |
| GND | GND | Masse |
| CS | GPIO5 | Sélection de puce |
| DC / RS | GPIO2 | Sélection Données / Commande |
| RST | GPIO4 | Réinitialisation (optionnel) |
| MOSI / SDI | GPIO23 | MOSI SPI matériel (VSPI) |
| SCK | GPIO18 | Horloge SPI matériel (VSPI) |
| MISO / SDO | GPIO19 | MISO SPI matériel (VSPI, optionnel) |
| LED / BL | 3.3V | Alimentation rétroéclairage |
Contrôleur tactile (si votre application utilise la fonction tactile et que l'écran la prend en charge) :
| Broche tactile | Broche ESP32 | Description |
|---|---|---|
| T_CS | n'importe quelle GPIO libre | Sélection de puce tactile |
| T_IRQ | n'importe quelle GPIO libre | Interruption tactile (optionnel) |
| T_DIN | GPIO23 | Partagé avec MOSI afficheur (GPIO23) |
| T_CLK | GPIO18 | Partagé avec SCK afficheur (GPIO18) |
| T_DO | GPIO19 | Partagé avec MISO afficheur (GPIO19) |

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Note : Le schéma ci-dessus montre le câblage correct. En pratique, connecter deux fils dans le même trou de broche de l'ESP32 n'est pas facile. Une solution pratique est d'utiliser un bloc de connexion à vis pour ESP32 — deux fils peuvent être fixés dans la même borne à vis, ou un fil dans la vis et un dans la broche adjacente.

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.
Si votre MCU possède deux interfaces SPI matérielles ou plus, vous pouvez attribuer chaque périphérique (afficheur, carte SD, contrôleur tactile) à son propre bus SPI dédié. Si votre MCU n'a qu'une seule interface SPI matérielle, les trois périphériques partagent les mêmes trois lignes de données (MOSI, SCK, MISO) — sur l'ESP32, ce sont GPIO23, GPIO18 et GPIO19. Chaque périphérique a sa propre broche CS, donc un seul est actif à la fois. La bibliothèque DIYables_TFT_SPI gère à la fois l'afficheur et le contrôleur tactile XPT2046 via une seule API — aucune bibliothèque SPI séparée n'est nécessaire pour le côté tactile.
Installation de la Bibliothèque
- Connectez la carte ESP32 à votre ordinateur via son port USB-C.
- Ouvrez Arduino IDE. Sélectionnez votre variante de carte ESP32 dans le menu des cartes et choisissez le port COM correct.
- Ouvrez le panneau Bibliothèques.
- Recherchez "DIYables_TFT_SPI". Localisez l'entrée DIYables.
- Cliquez sur Installer et acceptez toutes les installations de dépendances.
- Search for DIYables TFT SPI created by DIYables.io and click the Install button.
Base du Projet
Le sketch de base pour tout projet ESP32 TFT avec cette bibliothèque :
Construction - Dessiner des Formes
L'exemple DrawShapes dessine toute la gamme des primitives Adafruit GFX : cercles, triangles, rectangles, rectangles arrondis et lignes.
Téléverser et Tester
- Câblez le module TFT à l'ESP32 en utilisant le tableau ci-dessus.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, collez le code et appuyez sur Téléverser.
- Après le téléversement, l'afficheur remplit avec une boucle de formes colorées.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| begin() | Initialiser l'afficheur. | TFT_display.begin(); |
| setRotation(r) | Définir l'orientation de l'écran 0-3. | TFT_display.setRotation(1); |
| fillScreen(color) | Remplir tout l'écran d'une couleur. | TFT_display.fillScreen(BLACK); |
| colorRGB(r,g,b) | Construire une valeur de couleur 16 bits. | colorRGB(255,128,0) |
| fillCircle(x,y,r,color) | Cercle plein. | TFT_display.fillCircle(120,160,60,RED); |
| fillRect(x,y,w,h,color) | Rectangle plein. | TFT_display.fillRect(0,0,100,50,BLUE); |
| drawLine(x0,y0,x1,y1,color) | Ligne droite entre deux points. | TFT_display.drawLine(0,0,320,240,WHITE); |
Construction - Afficher Texte et Nombres
L'exemple ShowTextAndNumber utilise le moteur de texte Adafruit GFX pour imprimer des chaînes et des valeurs numériques à des tailles et couleurs réglables.
Téléverser et Tester
- Câblez et téléversez comme ci-dessus.
- L'afficheur montre plusieurs lignes de texte et de nombres dans différentes couleurs et tailles.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| setTextColor(color) | Définit la couleur du texte en premier plan. | TFT_display.setTextColor(WHITE); |
| setTextSize(size) | Met le texte à l'échelle. Taille 1 = 6×8 px, taille 2 = 12×16 px. | TFT_display.setTextSize(2); |
| setCursor(x, y) | Place le curseur de texte au pixel (x, y). | TFT_display.setCursor(10, 20); |
| print(value) | Imprime une chaîne ou un nombre au curseur. | TFT_display.print("ESP32!"); |
| println(value) | Imprime et fait avancer le curseur à la ligne suivante. | TFT_display.println(42); |
Construction - Afficher une Image
Construisons un visualiseur d'images. L'exemple DrawImage charge un bitmap RGB565 couleur depuis la mémoire flash du programme ESP32 et le rend sur l'afficheur. Les données pixel sont déclarées dans bitmap.h comme un tableau const uint16_t avec PROGMEM.
Copiez bitmap.h dans le dossier du sketch avant de compiler.
Téléverser et Tester
- Placez bitmap.h dans le même dossier que le sketch.
- Câblez le module TFT à l'ESP32 comme indiqué ci-dessus (MOSI=GPIO23, SCK=GPIO18, MISO=GPIO19, CS=GPIO5, DC=GPIO2, RST=GPIO4). Utilisez 3,3V pour VCC.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, appuyez sur Téléverser.
- L'afficheur rend l'image bitmap depuis la flash.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| drawRGBBitmap(x,y,bitmap,w,h) | Dessine un bitmap PROGMEM RGB565 avec son coin supérieur gauche en (x, y). | TFT_display.drawRGBBitmap(0, 0, myImage, 240, 320); |
| fillScreen(color) | Efface l'afficheur avant de dessiner l'image. | TFT_display.fillScreen(BLACK); |
Construction - Afficher une Image depuis la Carte SD
Construisons un visualiseur d'images depuis carte SD. L'exemple DrawImageSDcard lit un fichier image binaire RGB565 brut depuis une micro carte SD et envoie les données pixel à l'afficheur par morceaux.
Câblez le module SD à GPIO23 (MOSI), GPIO18 (SCK), GPIO19 (MISO). Définissez une broche CS séparée pour le module SD comme SD_CS_PIN dans le sketch.
Téléverser et Tester
- Câblez le module SD au bus VSPI de l'ESP32. Partagez GPIO23/18/19 avec l'afficheur. Connectez SD CS à la broche définie comme SD_CS_PIN.
- Copiez un fichier image binaire RGB565 brut à la racine de la carte SD. Les dimensions doivent correspondre à votre panneau.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, appuyez sur Téléverser.
- L'afficheur rend l'image diffusée depuis la carte SD.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| startWrite() | Ouvre une session d'écriture SPI directe et affirme le CS de l'afficheur. | TFT_display.startWrite(); |
| setAddrWindow(x0,y0,x1,y1) | Définit la région rectangulaire d'écriture des pixels sur le panneau. | TFT_display.setAddrWindow(0, 0, 239, 319); |
| pushColors(buf, len) | Envoie un tampon de valeurs pixel RGB565 à l'afficheur. | TFT_display.pushColors(buf, 512); |
| endWrite() | Ferme la session SPI et libère le CS de l'afficheur. | TFT_display.endWrite(); |
Construction - Utiliser une Police Externe
Construisons un affichage de texte personnalisé. L'exemple UseExternalFont remplace la police pixel 5×7 par défaut par une police de contour compatible Adafruit GFX plus nette.
Téléverser et Tester
- Câblez le module TFT à l'ESP32 comme indiqué ci-dessus.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, appuyez sur Téléverser.
- L'afficheur rend le texte dans la police personnalisée.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| setFont(&FontName) | Active une police compatible GFX personnalisée. Passez NULL pour restaurer la police intégrée 5×7. | TFT_display.setFont(&FreeSans12pt7b); |
| setCursor(x, y) | Positionne le curseur de texte à la coordonnée pixel donnée. | TFT_display.setCursor(10, 40); |
| setTextColor(color) | Définit la couleur de premier plan pour le texte suivant. | TFT_display.setTextColor(WHITE); |
| print(text) | Imprime une chaîne au curseur en utilisant la police active. | TFT_display.print("ESP32 Project"); |
Construction - Obtenir un Point Tactile
Construisons un lecteur de coordonnées tactiles. L'exemple TouchGetPoint initialise le XPT2046 sur le bus VSPI de l'ESP32 et imprime les valeurs ADC brutes sur le Moniteur Série chaque fois que l'écran est pressé.
Câblage (tous les signaux à 3,3V) :
| Broche tactile | Broche ESP32 | Description |
|---|---|---|
| T_CLK | GPIO18 | SCK — partagé avec l'afficheur |
| T_DIN | GPIO23 | MOSI — partagé avec l'afficheur |
| T_DO | GPIO19 | MISO — partagé avec l'afficheur |
| T_CS | GPIO15 | Sélection de puce tactile |
| T_IRQ | GPIO27 | Interruption tactile (optionnel) |
Téléverser et Tester
- Câblez le XPT2046 au bus VSPI de l'ESP32, partageant GPIO23/18/19 avec l'afficheur. T_CS→GPIO15, T_IRQ→GPIO27.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, appuyez sur Téléverser.
- Ouvrez le Moniteur Série à 9600 bauds. Touchez l'afficheur pour voir les valeurs brutes X, Y et Z imprimées.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| initTouchSPI(cs, irq) | Initialise le XPT2046 sur le bus SPI partagé. Passez -1 pour irq si la broche d'interruption n'est pas connectée. | TFT_display.initTouchSPI(14, 27); |
| readTouchRaw(x, y, z) | Retourne les valeurs ADC brutes du contrôleur sans calibration. Retourne true quand pressé. | TFT_display.readTouchRaw(x, y, z); |
Construction - Dessin Tactile
Construisons une application de peinture au doigt. L'exemple TouchDraw combine le contrôleur tactile XPT2046 avec l'API de dessin de l'afficheur.
Téléverser et Tester
- Câblez le XPT2046 à l'ESP32 comme décrit dans la section Obtenir un Point Tactile ci-dessus.
- Branchez le câble USB-C.
- Dans Arduino IDE, sélectionnez la carte et le port, appuyez sur Téléverser.
- Faites glisser un doigt sur l'afficheur pour peindre sur l'écran.
Référence API de Dessin
| Méthode | Objectif | Utilisation |
|---|---|---|
| initTouchSPI(cs, irq) | Initialise le XPT2046 sur le bus VSPI partagé. | TFT_display.initTouchSPI(14, 27); |
| setTouchCalibration(minX,maxX,minY,maxY) | Mappe les valeurs ADC brutes aux coordonnées pixel de l'écran. Obtenez les quatre valeurs depuis l'exemple TouchCalibration. | TFT_display.setTouchCalibration(200, 3800, 300, 3700); |
| setTouchInvertX(invert) / setTouchInvertY(invert) | Inverse l'axe tactile quand X ou Y est en miroir sur votre panneau. Appelez AVANT setTouchCalibration(). | TFT_display.setTouchInvertY(true); |
| getTouch(x, y) | Retourne les coordonnées tactiles calibrées en pixels d'écran. Retourne true pendant que l'écran est pressé. | if (TFT_display.getTouch(x, y)) { ... } |
| fillCircle(x, y, r, color) | Dessine un petit point à la position tactile pour construire la peinture. | TFT_display.fillCircle(x, y, 3, RED); |
Construction - Bouton Tactile
Construisons un panneau de boutons tactiles. L'exemple TouchButton dessine des boutons rectangulaires comme des régions colorées sur l'afficheur, puis vérifie les coordonnées tactiles à chaque itération de boucle.
T_IRQ est optionnel. Passez -1 comme argument irq pour utiliser le mode polling sans la broche d'interruption.