Мінімальний приклад ESP32 MAX31855 термопари з LCD за допомогою PlatformIO

**Важливо:**У новіших версіях PlatformIO більшість плат ESP32 буде аварійно завершувати роботу з цим прикладом, якщо ви не створите власний файл конфігурації lv_conf.h, у якому вказано використання внутрішньої пам’яті замість PSRAM. Див. Як виправити аварійне завершення / перезавантаження ESP32 LVGL у lv_tlsf_create() / lv_mem_init() для інструкцій щодо вирішення цієї проблеми.

У нашому попередньому прикладі Мінімальний приклад LVGL для дисплея Adafruit ST7735R для PlatformIO ми показали, як використовувати LVGL для відображення простого тексту на SPI-дисплеї на базі ST7735R.

У цій публікації ми розширимо цей приклад, додавши

Див. Мінімальний приклад ESP32 PlatformIO TFT-дисплея з використанням Adafruit ST7735 для рекомендованої апаратної конфігурації дисплея. Код підтримує два MAX31855, але в цьому прикладі використовується лише один. Розпіновка для 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;

Використовуючи ESP32 з дисплеєм ST7735R 128x160px, цей код досягає частоти оновлення ~5 Гц. Зверніть увагу, що цей приклад можна легко модифікувати для роботи з іншими LCD-контролерами або дисплеями.

ESP32 з дисплеєм ST7735R TFT показує показання температури термопари MAX31855 у градусах Цельсія за допомогою 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;
// Два різних Chip select для двох різних MAX31855
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;

// Кількість послідовних NaN-зчитувань, після яких вважаємо, що термопара фактично відключена
uint32_t consecutiveNaNReads = 0;
constexpr uint32_t maxConsecutiveNaNReads = 10;
std::string labelText = "";
lv_obj_t *label;

void lvgl_setup(void) {
  // Створюємо простий мітку, відцентровану на екрані
  label = lv_label_create(lv_scr_act());
  lv_label_set_text(label, "Ініціалізація..");
  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) {
      // Термопара відключена
      lv_label_set_text(label, "Помилка");
    }
  } else {
    consecutiveNaNReads = 0;
    labelText = "T: " + celsiusToString(celsius);
    lv_label_set_text(label, labelText.c_str());
  }
}

void setup() {
  Serial.begin(115200);
  // Запуск SPI для MAX31855
  vspi.begin(Pin_MAX31855_CLK, Pin_MAX31855_MISO, Pin_MAX31855_A_CS);

  lcd.initR(INITR_BLACKTAB);      // Ініціалізація чіпа ST7735S, чорна вкладка
  lcd.setRotation(1);

  LvGLStatus status = glue.begin(&lcd);
  if(status != LVGL_OK) {
    Serial.printf("Помилка glue %d\r\n", (int)status);
    ESP.restart();
  }

  lvgl_setup(); // Виклик функції побудови інтерфейсу вище
}

void loop() {
  ReadTemperature();
  lv_task_handler(); // Періодично викликаємо обробник завдань LittleVGL
  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

Дивіться схожі статті за категоріями: Arduino LVGL PlatformIO