LVGL (Bibliothèque graphique polyvalente légère) ESP32 Écran jaune bon marché (ESP32-2432S028R)

LVGL (Bibliothèque graphique polyvalente légère) ESP32 Écran jaune bon marché (ESP32-2432S028R)

Dans ce guide, vous débuterez avec la LVGL (Light and Versatile Graphics Library) avec l’ESP32 CYD (Cheap Yellow Display ESP32-2432S028R). Le LVGL est une bibliothèque graphique intégrée gratuite et open source populaire permettant de créer de superbes interfaces utilisateur pour de nombreux microcontrôleurs et écrans. Nous utiliserons une carte de développement ESP32 avec un écran tactile TFT intégré.

Premiers pas avec la bibliothèque graphique LVGL avec carte CYD à affichage jaune bon marché ESP32 ESP32-2432S028R

Si vous disposez d’un écran tactile TFT autonome de 2,8 pouces avec pilote ILI9341, vous pouvez lire notre guide LVGL pour l’ESP32.

Présentation de l’écran jaune bon marché ESP32 – CYD (ESP32-2432S028R)

La carte de développement ESP32-2432S028R est connue dans la communauté des fabricants sous le nom de « Cheap Yellow Display » ou CYD en abrégé. Cette carte de développement, dont la puce principale est un module ESP32-WROOM-32, est livrée avec un écran tactile LCD TFT de 2,8 pouces, une interface de carte microSD, une LED RVB et tous les circuits nécessaires pour programmer et alimenter la carte.

Panneau CYD à affichage jaune ESP32, bon marché, ESP32-2432S028R avant

Il s’agit d’une carte très polyvalente pour créer des interfaces graphiques pour vos projets IoT et elle est beaucoup plus pratique que d’utiliser une carte ESP32 séparée avec un écran TFT.

Carte CYD à affichage jaune ESP32 bon marché, ESP32-2432S028R, étiquetée au dos

Contenu connexe : Premiers pas avec le panneau d’affichage jaune bon marché ESP32 – CYD (ESP32-2432S028R)

Voici une liste de spécifications plus détaillées de cette carte de développement :

  • MCU double cœur, fonctions WI-FI et Bluetooth intégrées
  • La fréquence peut atteindre 240 MHz
  • 520 Ko de SRAM, 448 Ko de ROM, la taille du flash est de 4 Mo
  • Taille du module 50,0 × 86,0 mm
  • Tension de fonctionnement : 5 V
  • Consommation électrique : environ 115 mA
  • Poids du produit : environ 50g
  • Le module comprend :
    • Écran d’affichage TFT couleur de 2,8 pouces avec puce pilote ILI9341
    • Résolution d’affichage : 240x320px avec écran tactile résistif
    • Circuit de contrôle du rétroéclairage
    • Interface de carte TF pour stockage externe
    • Interface série
    • Interface de capteur de température et d’humidité (interface DHT11) et interface de port IO réservé
    • Il peut être programmé avec : Arduino IDE, MicroPython, ESP-IDF

Dans les connecteurs GPIO étendus, il y a au moins 4 GPIO disponibles : GPIO 35, GPIO 22, GPIO 21 et GPIO 27. Il dispose également des broches TX/RX disponibles (voir image précédente).

Plus d’informations sur les GPIO de la carte CYD : Brochage de l’écran jaune bon marché ESP32 (CYD) (ESP32-2432S028R).

Où acheter ?

Vous pouvez cliquer sur le lien ci-dessous pour vérifier où acheter l’écran ESP32 Cheap Yellow et son prix dans différents magasins.

Présentation de LVGL (bibliothèque graphique légère et polyvalente)

LVGL (Light and Versatile Graphics Library) est une bibliothèque graphique gratuite et open source qui fournit une large gamme d’éléments graphiques faciles à utiliser pour vos projets de microcontrôleurs nécessitant une interface utilisateur graphique (GUI).

Logo LVGL Bibliothèque graphique légère et polyvalente

Voici quelques-unes de ses principales caractéristiques :

  • Blocs : boutons, graphiques, listes, sliders, images, etc…
  • Graphiques avancés avec animations, anti-aliasing, opacité, défilement fluide ;
  • Divers périphériques d’entrée tels que pavé tactile, souris, clavier, encodeur, etc…
  • Prise en charge multilingue avec encodage UTF-8 ;
  • Prise en charge de plusieurs écrans, c’est-à-dire utilisation simultanée de plusieurs écrans TFT monochromes ;
  • Éléments graphiques entièrement personnalisables avec des styles de type CSS ;
  • Indépendant du matériel : utilisation avec n’importe quel microcontrôleur ou écran ;
  • Évolutif : capable de fonctionner avec peu de mémoire (64 Ko Flash, 16 Ko RAM) ;
  • Écrit en C pour une compatibilité maximale (compatible C++) et une liaison à MicroPython.

Il propose également un large éventail d’exemples de code dans leur documentation que vous pouvez utiliser : texte, boutons, curseurs, champs de saisie, clavier, styles personnalisés, images, arcs, lignes, animations, menus, onglets, mises en page, tableaux et bien plus encore. …

Exemples de bibliothèque LVGL

Installation des bibliothèques Arduino

L’ESP32 communique avec l’écran TFT et l’écran tactile à l’aide du protocole de communication SPI. Nous utiliserons les bibliothèques TFT_eSPI, XPT2046_Touchscreen et LVGL 9.

Installation de la bibliothèque TFT_eSPI

Ouvrez votre IDE Arduino et accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir. Recherchez TFT_eSPI. Sélectionnez la bibliothèque TFT_eSPI de Bodmer et installez-la.

Installation de la bibliothèque TFT_eSPI Bodmer Arduino IDE 2

Installation de la bibliothèque XPT2046_Touchscreen

Ouvrez votre IDE Arduino et accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir. Recherchez XPT2046_Touchscreen. Sélectionnez la bibliothèque XPT2046_Touchscreen de Paul Stoffregen et installez-la.

Installation de la bibliothèque XPT2046_Touchscreen par Paul Stoffregen Arduino IDE 2

Installation de la bibliothèque LVGL 9

Ouvrez votre IDE Arduino et accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir. Recherchez LVGL. Sélectionnez la bibliothèque LVGL de kiskegabor et installez la version 9.2.

Installation du logiciel Arduino IDE LVGL version 9.2

Préparer les fichiers de configuration pour TFT_eSPI et la bibliothèque LVGL

Pour utiliser correctement la bibliothèque TFT_eSPI, vous avez besoin d’un fichier de configuration appelé User_Setup.h avec les bonnes définitions. Vous devez également préparer le fichier lv_conf.h pour la bibliothèque LVGL. Nous avons déjà préparé ces deux fichiers afin que vous n’ayez aucun problème de configuration en suivant nos exemples. Il vous suffit de les télécharger et de les déplacer vers les bons dossiers. Suivez les instructions suivantes pour savoir comment procéder.

a) Préparation des fichiers de configuration – PC Windows

b) Préparation des fichiers de configuration – Mac OS

a) Préparation des fichiers de configuration – PC Windows

Une fois toutes les bibliothèques installées (TFT_eSPI, XPT2046_Touchscreen et LVGL), commencez par télécharger le fichier de configuration User_Setup.h.

Fichier User_Setup.h pour la bibliothèque TFT_eSPI Bodmer Arduino IDE 2

Dans votre IDE Arduino, allez dans Fichier et ouvrez le menu Préférences.

Ouvrez le menu Préférences Arduino IDE 2 Windows PC

Copiez le chemin « Emplacement du carnet de croquis » de l’IDE Arduino. Dans mon cas, c’est :

C:\Users\rui_s\Documents\Arduino
Ouvrir l'emplacement du carnet de croquis Arduino IDE 2 Parcourir

Ensuite, dans l’onglet Explorateur de fichiers de votre PC Windows, entrez le chemin d’accès du carnet de croquis pour ouvrir le dossier Arduino (il se trouve généralement sous le dossier Documents).

Accédez au dossier des bibliothèques Arduino pour copier le fichier lv_conf.h Arduino IDE 2

Ouvrez le dossier des bibliothèques :

Ouvrez le dossier des bibliothèques Arduino IDE 2 sur PC Windows

Vous devriez y voir le dossier de la bibliothèque TFT_eSPI. Ouvrez-le.

Ouvrir les bibliothèques de dossiers TFT_eSPI Arduino IDE 2

Vous devriez vous trouver dans un chemin de dossier similaire à celui indiqué ci-dessous :

C:\Users\rui_s\Documents\Arduino\libraries\TFT_eSPI

Copiez le fichier User_Setup.h fourni précédemment et remplacez le fichier existant.

Déplacez la copie du fichier User_Setup.h vers le dossier de la bibliothèque TFT_eSPI Arduino IDE 2

Ensuite, téléchargez le fichier de configuration lv_conf.h.

Fichier lv_config.h pour la bibliothèque LVGL par Kisvegabor Arduino IDE 2

Ouvrez un chemin de dossier similaire sur votre ordinateur, comme indiqué ci-dessous :

C:\Users\rui_s\Documents\Arduino\libraries

Déplacez le lv_conf.h dans le dossier des bibliothèques (ne le déplacez PAS dans le dossier lvgl).

Déplacez la copie du fichier de configuration lv_conf.h vers le dossier des bibliothèques Arduino Arduino IDE 2

IMPORTANT : les autres fichiers User_Setup.h et lv_conf.h disponibles sur Internet ne fonctionneront probablement PAS avec les exemples disponibles sur Raspberryme.com. Vous devez utiliser les fichiers exacts fournis dans cet article.

Remarque : si vous mettez à jour vos bibliothèques, vous devrez refaire cette procédure et placer les bons fichiers de configuration aux bons endroits.

b) Préparation des fichiers de configuration – Mac OS

Une fois les deux bibliothèques installées (TFT_eSPI et XPT2046_Touchscreen), téléchargez le fichier de configuration User_Setup.h.

Téléchargez le fichier User_Setup.h pour la bibliothèque TFT_eSPI Bodmer Arduino IDE 2

Dans votre IDE Arduino, ouvrez le menu Paramètres.

Ouvrez le menu Préférences Arduino IDE 2 Mac OS

Copiez le chemin « Emplacement du carnet de croquis » de l’IDE Arduino. Dans mon cas, c’est :

/Users/rui/Documents/Arduino
Ouvrir l'emplacement du carnet de croquis Arduino IDE 2 Parcourir Mac OS

Dans le Finder, tapez /Users/rui/Documents/Arduino et ouvrez ce répertoire.

Ouvrez le dossier Arduino IDE 2 Mac OS

Ouvrez le dossier des bibliothèques.

Ouvrez le dossier des bibliothèques Arduino IDE 2 Mac OS

Vous devriez y voir le dossier de la bibliothèque TFT_eSPI. Ouvrez-le.

Ouvrir les bibliothèques de dossiers TFT_eSPI Arduino IDE 2 Mac OS

Vous devriez vous trouver dans un chemin de dossier similaire à celui indiqué ci-dessous :

/Users/rui/Documents/Arduino/libraries/TFT_eSPI

Copiez le fichier User_Setup.h fourni précédemment et remplacez le fichier existant.

Déplacez la copie du fichier User_Setup.h vers le dossier de la bibliothèque TFT_eSPI Arduino IDE 2 Mac OS

Vous devriez maintenant avoir le fichier User_Setup.h fourni sur ce chemin.

Déplacez le fichier User_Setup.h vers le dossier de la bibliothèque TFT_eSPI Arduino IDE 2 Mac OS

Ensuite, téléchargez le fichier de configuration lv_conf.h.

Téléchargez le fichier lv_config.h pour la bibliothèque LVGL par Kisvegabor Arduino IDE 2

Ouvrez un chemin de dossier similaire pour les bibliothèques sur votre ordinateur, comme indiqué ci-dessous :

/Users/rui/Documents/Arduino/libraries
Ouvrez le dossier des bibliothèques Arduino IDE 2 Mac OS

Déplacez le lv_conf.h dans le dossier des bibliothèques (ne le déplacez PAS dans le dossier lvgl).

Déplacez la copie du fichier de configuration lv_conf.h vers le dossier des bibliothèques Arduino Arduino IDE 2 Mac OS

IMPORTANT : les autres fichiers User_Setup.h et lv_conf.h disponibles sur Internet ne fonctionneront probablement PAS avec les exemples disponibles sur Raspberryme.com. Vous devez utiliser les fichiers exacts fournis dans cet article.

Remarque : si vous mettez à jour vos bibliothèques, vous devrez refaire cette procédure et placer les bons fichiers de configuration aux bons endroits.

Code – Afficher le texte, créer des boutons et un curseur

Le code suivant affiche un texte simple sur votre écran TFT et vous permet de tester l’écran tactile à l’aide d’un bouton et d’un curseur. Lorsque vous appuyez sur les boutons ou le curseur, cela devrait déclencher certains événements.

Copiez le code suivant sur l’IDE Arduino et téléchargez-le sur votre carte.

/*  Rui Santos & Sara Santos - Raspberryme.com
    THIS EXAMPLE WAS TESTED WITH THE FOLLOWING HARDWARE:
    1) ESP32-2432S028R 2.8 inch 240×320 also known as the Cheap Yellow Display (CYD): https://makeradvisor.com/tools/cyd-cheap-yellow-display-esp32-2432s028r/
      SET UP INSTRUCTIONS: https://Raspberryme.com/cyd-lvgl/
    2) REGULAR ESP32 Dev Board + 2.8 inch 240x320 TFT Display: https://makeradvisor.com/tools/2-8-inch-ili9341-tft-240x320/ and https://makeradvisor.com/tools/esp32-dev-board-wi-fi-bluetooth/
      SET UP INSTRUCTIONS: https://Raspberryme.com/esp32-tft-lvgl/
    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

/*  Install the "lvgl" library version 9.2 by kisvegabor to interface with the TFT Display - https://lvgl.io/
    *** IMPORTANT: lv_conf.h available on the internet will probably NOT work with the examples available at Raspberryme.com ***
    *** YOU MUST USE THE lv_conf.h FILE PROVIDED IN THE LINK BELOW IN ORDER TO USE THE EXAMPLES FROM RANDOM NERD TUTORIALS ***
    FULL INSTRUCTIONS AVAILABLE ON HOW CONFIGURE THE LIBRARY: https://Raspberryme.com/cyd-lvgl/ or https://Raspberryme.com/esp32-tft-lvgl/   */
#include 

/*  Install the "TFT_eSPI" library by Bodmer to interface with the TFT Display - https://github.com/Bodmer/TFT_eSPI
    *** IMPORTANT: User_Setup.h available on the internet will probably NOT work with the examples available at Raspberryme.com ***
    *** YOU MUST USE THE User_Setup.h FILE PROVIDED IN THE LINK BELOW IN ORDER TO USE THE EXAMPLES FROM RANDOM NERD TUTORIALS ***
    FULL INSTRUCTIONS AVAILABLE ON HOW CONFIGURE THE LIBRARY: https://Raspberryme.com/cyd-lvgl/ or https://Raspberryme.com/esp32-tft-lvgl/   */
#include 

// Install the "XPT2046_Touchscreen" library by Paul Stoffregen to use the Touchscreen - https://github.com/PaulStoffregen/XPT2046_Touchscreen - Note: this library doesn't require further configuration
#include 

// Touchscreen pins
#define XPT2046_IRQ 36   // T_IRQ
#define XPT2046_MOSI 32  // T_DIN
#define XPT2046_MISO 39  // T_OUT
#define XPT2046_CLK 25   // T_CLK
#define XPT2046_CS 33    // T_CS

SPIClass touchscreenSPI = SPIClass(VSPI);
XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320

// Touchscreen coordinates: (x, y) and pressure (z)
int x, y, z;

#define DRAW_BUF_SIZE (SCREEN_WIDTH * SCREEN_HEIGHT / 10 * (LV_COLOR_DEPTH / 8))
uint32_t draw_buf[DRAW_BUF_SIZE / 4];

// If logging is enabled, it will inform the user about what is happening in the library
void log_print(lv_log_level_t level, const char * buf) {
  LV_UNUSED(level);
  Serial.println(buf);
  Serial.flush();
}

// Get the Touchscreen data
void touchscreen_read(lv_indev_t * indev, lv_indev_data_t * data) {
  // Checks if Touchscreen was touched, and prints X, Y and Pressure (Z)
  if(touchscreen.tirqTouched() && touchscreen.touched()) {
    // Get Touchscreen points
    TS_Point p = touchscreen.getPoint();
    // Calibrate Touchscreen points with map function to the correct width and height
    x = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
    y = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
    z = p.z;

    data->state = LV_INDEV_STATE_PRESSED;

    // Set the coordinates
    data->point.x = x;
    data->point.y = y;

    // Print Touchscreen info about X, Y and Pressure (Z) on the Serial Monitor
    /* Serial.print("X = ");
    Serial.print(x);
    Serial.print(" | Y = ");
    Serial.print(y);
    Serial.print(" | Pressure = ");
    Serial.print(z);
    Serial.println();*/
  }
  else {
    data->state = LV_INDEV_STATE_RELEASED;
  }
}

int btn1_count = 0;
// Callback that is triggered when btn1 is clicked
static void event_handler_btn1(lv_event_t * e) {
  lv_event_code_t code = lv_event_get_code(e);
  if(code == LV_EVENT_CLICKED) {
    btn1_count++;
    LV_LOG_USER("Button clicked %d", (int)btn1_count);
  }
}

// Callback that is triggered when btn2 is clicked/toggled
static void event_handler_btn2(lv_event_t * e) {
  lv_event_code_t code = lv_event_get_code(e);
  lv_obj_t * obj = (lv_obj_t*) lv_event_get_target(e);
  if(code == LV_EVENT_VALUE_CHANGED) {
    LV_UNUSED(obj);
    LV_LOG_USER("Toggled %s", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "on" : "off");
  }
}

static lv_obj_t * slider_label;
// Callback that prints the current slider value on the TFT display and Serial Monitor for debugging purposes
static void slider_event_callback(lv_event_t * e) {
  lv_obj_t * slider = (lv_obj_t*) lv_event_get_target(e);
  char buf[8];
  lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
  lv_label_set_text(slider_label, buf);
  lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  LV_LOG_USER("Slider changed to %d%%", (int)lv_slider_get_value(slider));
}

void lv_create_main_gui(void) {
  // Create a text label aligned center on top ("Hello, world!")
  lv_obj_t * text_label = lv_label_create(lv_screen_active());
  lv_label_set_long_mode(text_label, LV_LABEL_LONG_WRAP);    // Breaks the long lines
  lv_label_set_text(text_label, "Hello, world!");
  lv_obj_set_width(text_label, 150);    // Set smaller width to make the lines wrap
  lv_obj_set_style_text_align(text_label, LV_TEXT_ALIGN_CENTER, 0);
  lv_obj_align(text_label, LV_ALIGN_CENTER, 0, -90);

  lv_obj_t * btn_label;
  // Create a Button (btn1)
  lv_obj_t * btn1 = lv_button_create(lv_screen_active());
  lv_obj_add_event_cb(btn1, event_handler_btn1, LV_EVENT_ALL, NULL);
  lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -50);
  lv_obj_remove_flag(btn1, LV_OBJ_FLAG_PRESS_LOCK);

  btn_label = lv_label_create(btn1);
  lv_label_set_text(btn_label, "Button");
  lv_obj_center(btn_label);

  // Create a Toggle button (btn2)
  lv_obj_t * btn2 = lv_button_create(lv_screen_active());
  lv_obj_add_event_cb(btn2, event_handler_btn2, LV_EVENT_ALL, NULL);
  lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 10);
  lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
  lv_obj_set_height(btn2, LV_SIZE_CONTENT);

  btn_label = lv_label_create(btn2);
  lv_label_set_text(btn_label, "Toggle");
  lv_obj_center(btn_label);
  
  // Create a slider aligned in the center bottom of the TFT display
  lv_obj_t * slider = lv_slider_create(lv_screen_active());
  lv_obj_align(slider, LV_ALIGN_CENTER, 0, 60);
  lv_obj_add_event_cb(slider, slider_event_callback, LV_EVENT_VALUE_CHANGED, NULL);
  lv_slider_set_range(slider, 0, 100);
  lv_obj_set_style_anim_duration(slider, 2000, 0);

  // Create a label below the slider to display the current slider value
  slider_label = lv_label_create(lv_screen_active());
  lv_label_set_text(slider_label, "0%");
  lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
}

void setup() {
  String LVGL_Arduino = String("LVGL Library Version: ") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
  Serial.begin(115200);
  Serial.println(LVGL_Arduino);
  
  // Start LVGL
  lv_init();
  // Register print function for debugging
  lv_log_register_print_cb(log_print);

  // Start the SPI for the touchscreen and init the touchscreen
  touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
  touchscreen.begin(touchscreenSPI);
  // Set the Touchscreen rotation in landscape mode
  // Note: in some displays, the touchscreen might be upside down, so you might need to set the rotation to 0: touchscreen.setRotation(0);
  touchscreen.setRotation(2);

  // Create a display object
  lv_display_t * disp;
  // Initialize the TFT display using the TFT_eSPI library
  disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));
  lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_270);
    
  // Initialize an LVGL input device object (Touchscreen)
  lv_indev_t * indev = lv_indev_create();
  lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
  // Set the callback function to read Touchscreen input
  lv_indev_set_read_cb(indev, touchscreen_read);

  // Function to draw the GUI (text, buttons and sliders)
  lv_create_main_gui();
}

void loop() {
  lv_task_handler();  // let the GUI do its work
  lv_tick_inc(5);     // tell LVGL how much time has passed
  delay(5);           // let this time pass
}

Afficher le code brut

Comment fonctionne le code

Jetons un coup d’œil rapide aux parties du code pertinentes pour cet exemple.

Bibliothèques

Incluez les bibliothèques lvgl, TFT_eSPI et XPT2046_Touchscreen.

#include 
#include 
#include 

Initialiser l’écran tactile

Les lignes suivantes définissent le brochage de l’écran tactile :

#define XPT2046_IRQ 36
#define XPT2046_MOSI 32
#define XPT2046_MISO 39
#define XPT2046_CLK 25
#define XPT2046_CS 33

Créez un touchscreenSPI et des instances d’écran tactile :

SPIClass touchscreenSPI = SPIClass(VSPI);
XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ);

Autres variables

Définissez la largeur et la hauteur de l’écran :

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
#define FONT_SIZE 2

Variables pour stocker les coordonnées : (x, y) et pression (z).

int x, y, z;

installation()

Démarrez une communication série avec le Serial Monitor à un débit en bauds de 115 200 et imprimez la version de la bibliothèque LVGL que vous utilisez :

String LVGL_Arduino = String("LVGL Library Version: ") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
Serial.begin(115200);
Serial.println(LVGL_Arduino);

Démarrez le LVGL et attribuez une fonction de rappel à des fins de débogage.

lv_init();
lv_log_register_print_cb(log_print);

Démarrez le SPI pour l’écran tactile et initialisez l’écran tactile.

touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
touchscreen.begin(touchscreenSPI);
touchscreen.setRotation(2);

Remarque : sur certains écrans, l’écran tactile peut être à l’envers, vous devrez donc peut-être définir la rotation sur 0 : touchscreen.setRotation(0);

Créez l’objet d’affichage et initialisez l’affichage TFT à l’aide de la bibliothèque TFT_eSPI.

lv_display_t * disp;
disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));
lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_270);

Initialisez un objet de périphérique d’entrée LVGL (écran tactile) et définissez la fonction de rappel qui sera déclenchée lorsque vous cliquez sur l’écran tactile.

lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
lv_indev_set_read_cb(indev, touchscreen_read);

Enfin, appelez la fonction lv_create_main_gui() pour dessiner l’interface graphique de votre écran tactile :

lv_create_main_gui();

boucle()

Lors de l’exécution d’un exemple LVGL, la fonction loop() ressemblera généralement à ceci :

lv_task_handler();  // let the GUI do its work
lv_tick_inc(5);        // tell LVGL how much time has passed
delay(5);                // let this time pass

lv_create_main_gui()

La fonction lv_create_main_gui() dessine l’étiquette de texte, les boutons et les curseurs. C’est également là que vous attribuez les fonctions de rappel du gestionnaire d’événements qui seront déclenchées lorsque vous interagissez avec votre écran.

void lv_create_main_gui(void) {
  // Create a text label aligned center on top ("Hello, world!")
  lv_obj_t * text_label = lv_label_create(lv_screen_active());
  lv_label_set_long_mode(text_label, LV_LABEL_LONG_WRAP);    // Breaks the long lines
  lv_label_set_text(text_label, "Hello, world!");
  lv_obj_set_width(text_label, 150);    // Set smaller width to make the lines wrap
  lv_obj_set_style_text_align(text_label, LV_TEXT_ALIGN_CENTER, 0);
  lv_obj_align(text_label, LV_ALIGN_CENTER, 0, -90);

  lv_obj_t * btn_label;
  // Create a Button (btn1)
  lv_obj_t * btn1 = lv_button_create(lv_screen_active());
  lv_obj_add_event_cb(btn1, event_handler_btn1, LV_EVENT_ALL, NULL);
  lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -50);
  lv_obj_remove_flag(btn1, LV_OBJ_FLAG_PRESS_LOCK);

  btn_label = lv_label_create(btn1);
  lv_label_set_text(btn_label, "Button");
  lv_obj_center(btn_label);

  // Create a Toggle button (btn2)
  lv_obj_t * btn2 = lv_button_create(lv_screen_active());
  lv_obj_add_event_cb(btn2, event_handler_btn2, LV_EVENT_ALL, NULL);
  lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 10);
  lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
  lv_obj_set_height(btn2, LV_SIZE_CONTENT);

  btn_label = lv_label_create(btn2);
  lv_label_set_text(btn_label, "Toggle");
  lv_obj_center(btn_label);
  
  // Create a slider aligned in the center bottom of the TFT display
  lv_obj_t * slider = lv_slider_create(lv_screen_active());
  lv_obj_align(slider, LV_ALIGN_CENTER, 0, 60);
  lv_obj_add_event_cb(slider, slider_event_callback, LV_EVENT_VALUE_CHANGED, NULL);
  lv_slider_set_range(slider, 0, 100);
  lv_obj_set_style_anim_duration(slider, 2000, 0);

  // Create a label below the slider to display the current slider value
  slider_label = lv_label_create(lv_screen_active());
  lv_label_set_text(slider_label, "0%");
  lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
}

event_handler_btn1()

La fonction event_handler_btn1() est déclenchée lorsque vous cliquez sur le « Bouton » et elle affichera également dans le moniteur série Arduino IDE le nombre de fois que le bouton a été cliqué.

int btn1_count = 0;
// Callback that is triggered when btn1 is clicked
static void event_handler_btn1(lv_event_t * e) {
  lv_event_code_t code = lv_event_get_code(e);
  if(code == LV_EVENT_CLICKED) {
    btn1_count++;
    LV_LOG_USER("Button clicked %d%", (int)btn1_count);
  }
}

event_handler_btn2()

Le event_handler_btn2() est déclenché lorsque vous cliquez sur le bouton « Basculer », il stocke l’état actuel du bouton et imprime un message avec l’état actuel dans le moniteur série.

// Callback that is triggered when btn2 is clicked/toggled
static void event_handler_btn2(lv_event_t * e) {
  lv_event_code_t code = lv_event_get_code(e);
  lv_obj_t * obj = (lv_obj_t*) lv_event_get_target(e);
  if(code == LV_EVENT_VALUE_CHANGED) {
    LV_UNUSED(obj);
    LV_LOG_USER("Toggled %s", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "on" : "off");
  }
}

slider_event_callback()

La fonction slider_event_callback() est appelée lorsque vous déplacez le curseur, elle affichera également à la fois sur l’écran tactile et sur Serial Monitor la dernière valeur du curseur sur une échelle de 0 à 100 %.

static lv_obj_t * slider_label;
// Callback that prints the current slider value on the TFT display and Serial Monitor for debugging purposes
static void slider_event_callback(lv_event_t * e) {
  lv_obj_t * slider = (lv_obj_t*) lv_event_get_target(e);
  char buf[8];
  lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
  lv_label_set_text(slider_label, buf);
  lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  LV_LOG_USER("Slider changed to %d%%", (int)lv_slider_get_value(slider));
}

Démonstration

Téléchargez le code sur votre tableau. Accédez à Outils > Carte et sélectionnez ESP32 > Module de développement ESP32. Ensuite, sélectionnez le bon port COM dans Outils > Port. Enfin, cliquez sur le bouton de téléchargement.

Bouton de téléchargement Arduino IDE 2

Après avoir téléchargé le code sur votre tableau, il devrait afficher l’exemple « Hello, world ! » texte centré en haut.

Appuyez avec votre doigt sur le premier « Bouton ». Dans le Serial Monitor, il imprimera les coordonnées de votre pression sur le bouton, ainsi qu’un message avec le nombre de fois que le bouton a été cliqué : « Bouton cliqué 1 », « Bouton cliqué 2 », « Bouton cliqué 3″…

Panneau d'affichage jaune bon marché ESP32, écran tactile CYD TFT, exemple de bibliothèque LVGL

Ensuite, cliquez sur le bouton « Basculer », cela pourrait être utilisé pour contrôler une LED ou toute autre sortie. Ce type de bouton a deux états (couleur bleue lorsqu’il est éteint et couleur rouge lorsqu’il est activé).

Panneau d'affichage jaune bon marché ESP32, écran tactile CYD TFT, bibliothèque LVGL, exemple de bouton à bascule

Faites glisser le curseur avec votre doigt, vous verrez le curseur bouger et l’étiquette du curseur changer lorsque vous déplacez votre doigt.

Panneau d'affichage jaune bon marché ESP32, écran tactile CYD TFT, bibliothèque LVGL, exemple de déplacement du curseur

Tous les événements seront imprimés dans votre moniteur série Arduino IDE à des fins de débogage :

Écran tactile TFT ESP32 LVGL, exemple de base, étiquette de texte, curseur de bouton

Conclusion

Dans ce tutoriel, vous avez appris à démarrer avec la bibliothèque LVGL avec la carte ESP32 Cheap Yellow Display. Dans les prochains guides, nous explorerons d’autres fonctionnalités et composants de la bibliothèque LVGL.

Nous espérons que vous avez trouvé ce tutoriel utile. Nous préparons d’autres guides sur ce forum, alors restez à l’écoute.

Autres guides que vous aimeriez lire :

Pour en savoir plus sur l’ESP32, assurez-vous de consulter nos ressources :

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

YouTube video

  • DIYmalls 2,8" ESP32 Écran ESP32-2432S028R résistif Tactile 240x320 TFT LCD Module ESP-32 + boîtier en Acrylique pour Arduino IDE
  • DIYmalls 2,8" ESP32 Écran Tactile résistif ESP32-2432S028R Module TFT LCD 240x320 Carte de développement pour Arduino IDE