专题 / esp32

屏幕与 LVGL

从 TFT_eSPI 显示文字,到 LVGL 8.x 做出像样的界面。

第一块屏:TFT_eSPI

裸屏(ILI9341 / ST7789 / ILI9486)用 TFT_eSPI 库最直接,改 User_Setup.h 里几个宏就能点亮:

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();

void setup() {
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.drawString("Hello ESP32", 40, 60, 4);   // 字号 4
}
void loop() {}

引脚配置按板子改,多屏/多 SPI 共存的接法我写过一篇 同时使用 2 个 SPI 外接 TFT + W5500。

什么时候上 LVGL

满足任意一条就值得上:

  • 界面元素超过两屏文字
  • 需要按钮、列表、图表等控件
  • 想要动画和触摸交互

LVGL 8.x 在 Arduino 下跑通的最小路径见 ESP32 在 Arduino 下使用 LVGL 图形库; 带触摸的成品屏(如 ESP32-S3 Touch LCD)可以直接参考 这篇。

中文字体与帧率(两大经典坑)

中文字体:用 lv_font_conv 从思源黑体生成只含常用汉字的 C 数组, 体积可控:

lv_font_conv --font SourceHanSansSC-Normal.ttf \
  -r 0x4e00-0x9fa5 --size 16 --bpp 4 \
  -o font_zh_16.c

帧率:双缓冲缓冲区开到 1/10 屏幕行数起步,SPI 频率拉到 80MHz(短连线), 局部刷新代替全屏刷新——实测能从十几帧提到四五十帧。

本专题完

回到 ESP32 专题首页。更多实战文章持续整理中, 也可直接逛 嵌入式分类。