**Important :**Dans les versions plus récentes de PlatformIO, la plupart des cartes ESP32 planteront avec cet exemple à moins que vous ne créiez un fichier de config lv_conf.h personnalisé spécifiant d’utiliser la mémoire interne au lieu de PSRAM. Voir Comment corriger le crash / redémarrage ESP32 LVGL dans lv_tlsf_create() / lv_mem_init() pour des instructions sur comment corriger cela.
Dans notre exemple précédent Exemple LVGL minimal d’affichage Adafruit ST7735R pour PlatformIO nous avons montré comment utiliser LVGL pour afficher un texte simple sur un affichage SPI basé sur ST7735R.
Dans ce post, nous étendrons cet exemple par
Voir Exemple minimal d’affichage TFT PlatformIO ESP32 utilisant Adafruit ST7735 pour la configuration matérielle recommandée pour l’affichage. Le code supporte deux MAX31855 mais un seul est utilisé pour cet exemple. Le pinout pour le MAX31855 est :
constexpr int8_t Pin_MAX31855_CLK = 21;
constexpr int8_t Pin_MAX31855_MISO = 5;
constexpr int8_t Pin_MAX31855_A_CS = 18;Utilisant un ESP32 avec un affichage ST7735R 128x160px, ce code atteint un taux de mise à jour d’environ 5Hz. Notez que cet exemple peut facilement être modifié pour fonctionner avec d’autres contrôleurs LCD ou affichages.
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_LvGL_Glue.h>
#include <Adafruit_MAX31855.h>
#include <string>
#include <sstream>
constexpr int8_t Pin_LCD_CS = 27;
constexpr int8_t Pin_LCD_DC = 23;
constexpr int8_t Pin_LCD_RST = 22;
constexpr int8_t Pin_LCD_SCLK = 14;
constexpr int8_t Pin_LCD_MISO = 12;
constexpr int8_t Pin_LCD_MOSI = 13;
constexpr int8_t Pin_MAX31855_CLK = 21;
constexpr int8_t Pin_MAX31855_MISO = 5;
// Deux Chip selects différents pour deux MAX31855 différents
constexpr int8_t Pin_MAX31855_A_CS = 18;
constexpr int8_t Pin_MAX31855_B_CS = 19;
SPIClass vspi(VSPI);
Adafruit_MAX31855 thermocouple1(Pin_MAX31855_A_CS, &vspi);
Adafruit_MAX31855 thermocouple2(Pin_MAX31855_B_CS, &vspi);
Adafruit_ST7735 lcd(Pin_LCD_CS, Pin_LCD_DC, Pin_LCD_MOSI, Pin_LCD_SCLK,
Pin_LCD_RST);
Adafruit_LvGL_Glue glue;
// Nombre de lectures NaN consécutives avant de supposer que le thermocouple est réellement déconnecté
uint32_t consecutiveNaNReads = 0;
constexpr uint32_t maxConsecutiveNaNReads = 10;
std::string labelText = "";
lv_obj_t *label;
void lvgl_setup(void) {
// Crée un label simple centré sur l'écran
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Initializing..");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}
template<typename T>
std::string celsiusToString(const T a_value, const int decimals = 1)
{
std::ostringstream out;
out.precision(decimals);
out << std::fixed << a_value << " °C";
return std::move(out).str();
}
bool IsValidReading(double reading) {
return !isnan(reading) && reading > -40.0 && reading < 1000.0;
}
void ReadTemperature() {
double celsius = thermocouple1.readCelsius();
if(!IsValidReading(celsius)) {
consecutiveNaNReads++;
if(consecutiveNaNReads >= maxConsecutiveNaNReads) {
// Le thermocouple est déconnecté
lv_label_set_text(label, "Error");
}
} else {
consecutiveNaNReads = 0;
labelText = "T: " + celsiusToString(celsius);
lv_label_set_text(label, labelText.c_str());
}
}
void setup() {
Serial.begin(115200);
// Démarre le SPI MAX31855
vspi.begin(Pin_MAX31855_CLK, Pin_MAX31855_MISO, Pin_MAX31855_A_CS);
lcd.initR(INITR_BLACKTAB); // Init la puce ST7735S, onglet noir
lcd.setRotation(1);
LvGLStatus status = glue.begin(&lcd);
if(status != LVGL_OK) {
Serial.printf("Glue error %d\r\n", (int)status);
ESP.restart();
}
lvgl_setup(); // Appelle la fonction de construction d'UI ci-dessus
}
void loop() {
ReadTemperature();
lv_task_handler(); // Appelle le gestionnaire de tâches LittleVGL périodiquement
delay(5);
}[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
adafruit/Adafruit GFX Library@^1.11.5
adafruit/Adafruit ST7735 and ST7789 Library@^1.10.0
adafruit/Adafruit LittlevGL Glue Library@^2.1.4
adafruit/SdFat - Adafruit Fork@^2.2.1
lvgl/lvgl@^8.3.7
adafruit/Adafruit MAX31855 library@^1.4.0