Exemplo minimalista ESP32 MAX31855 termopar LCD usando PlatformIO

**Importante:**Em versões mais recentes do PlatformIO, a maioria das placas ESP32 irá travar com este exemplo a menos que você crie um arquivo de configuração lv_conf.h personalizado especificando para usar memória interna em vez de PSRAM. Veja Como corrigir travamento / reboot do ESP32 LVGL em lv_tlsf_create() / lv_mem_init() para instruções de como corrigir isso.

Em nosso exemplo anterior exemplo minimalista LVGL com display Adafruit ST7735R para PlatformIO mostramos como usar LVGL para exibir um texto simples em um display SPI baseado em ST7735R.

Neste post, vamos estender este exemplo por

Veja Exemplo minimalista ESP32 PlatformIO display TFT usando Adafruit ST7735 para a configuração de hardware recomendada para o display. O código suporta dois MAX31855s mas apenas um é usado para este exemplo. O pinout para o MAX31855 é:

max31855_pins.h
constexpr int8_t Pin_MAX31855_CLK = 21;
constexpr int8_t Pin_MAX31855_MISO = 5;
constexpr int8_t Pin_MAX31855_A_CS = 18;

Usando um ESP32 com um display ST7735R 128x160px, este código alcança uma taxa de atualização de ~5Hz. Note que este exemplo pode facilmente ser modificado para funcionar com outros controladores LCD ou displays.

ESP32 com display TFT ST7735R mostrando leitura de temperatura do termopar MAX31855 em graus Celsius usando LVGL

max31855_lcd_example.cpp
#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;
// Dois Chip selects diferentes para dois MAX31855 diferentes
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;

// Número de leituras NaN consecutivas antes de assumirmos que o termopar está realmente desconectado
uint32_t consecutiveNaNReads = 0;
constexpr uint32_t maxConsecutiveNaNReads = 10;
std::string labelText = "";
lv_obj_t *label;

void lvgl_setup(void) {
  // Criar rótulo simples centralizado na tela
  label = lv_label_create(lv_scr_act());
  lv_label_set_text(label, "Inicializando..");
  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) {
      // O termopar está desconectado
      lv_label_set_text(label, "Erro");
    }
  } else {
    consecutiveNaNReads = 0;
    labelText = "T: " + celsiusToString(celsius);
    lv_label_set_text(label, labelText.c_str());
  }
}

void setup() {
  Serial.begin(115200);
  // Iniciar MAX31855 SPI
  vspi.begin(Pin_MAX31855_CLK, Pin_MAX31855_MISO, Pin_MAX31855_A_CS);

  lcd.initR(INITR_BLACKTAB);      // Inicializar chip ST7735S, aba preta
  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(); // Chamar a função de construção de UI acima
}

void loop() {
  ReadTemperature();
  lv_task_handler(); // Chamar o manipulador de tarefas do LittleVGL periodicamente
  delay(5);
}
platformio.ini
[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

Check out similar posts by category: Arduino LVGL PlatformIO