ESP32 + TFT屏幕实现图形化界面设计

2025-06发布10次浏览

在物联网和嵌入式系统开发中,ESP32以其强大的双核处理能力、Wi-Fi和蓝牙功能以及丰富的外设接口,成为许多开发者青睐的微控制器。而TFT屏幕则因其色彩丰富、分辨率高、支持图形化显示的特点,成为与用户交互的重要工具。本文将详细介绍如何使用ESP32配合TFT屏幕实现图形化界面设计,涵盖硬件连接、库文件选择及配置、代码实现等内容。


一、硬件准备与连接

硬件清单

  1. ESP32开发板:如乐鑫ESP32-WROOM或NodeMCU-32S。
  2. TFT屏幕模块:例如ILI9341驱动的2.4英寸TFT屏。
  3. 杜邦线若干。

硬件连接

TFT屏幕通常通过SPI(Serial Peripheral Interface)协议与ESP32通信。以下是常见的引脚映射: | TFT Pin | ESP32 Pin | |--------------|-------------| | CS (Chip Select) | GPIO5 | | DC (Data/Command) | GPIO27 | | RST (Reset) | GPIO33 | | MOSI (Master Out Slave In) | GPIO23 | | SCLK (Serial Clock) | GPIO18 | | LED (Backlight Control) | GPIO4 | | GND | GND | | VCC | 3.3V |

确保所有连接正确无误后,可以进行下一步的软件配置。


二、软件环境搭建

开发环境

使用Arduino IDE作为开发平台,步骤如下:

  1. 打开Arduino IDE,进入文件 > 首选项,在附加开发板管理器网址中添加以下链接:
    https://dl.espressif.com/dl/package_esp32_index.json
    
  2. 工具 > 开发板 > 开发板管理器中搜索并安装ESP32 by Espressif Systems
  3. 安装所需的库文件:
    • Adafruit_GFX:用于基本的图形绘制。
    • Adafruit_ILI9341:专为ILI9341驱动的TFT屏幕设计。
    • 这些库可以通过工具 > 库管理搜索并安装。

初始化代码框架

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>

#define TFT_CS 5
#define TFT_DC 27
#define TFT_RST 33

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  tft.begin();
  tft.setRotation(1); // 设置屏幕方向
  tft.fillScreen(ILI9341_BLACK); // 清屏,设置背景颜色为黑色
}

void loop() {
  // 主循环逻辑
}

三、图形化界面设计

1. 基本图形绘制

使用Adafruit_GFX库提供的函数可以轻松绘制各种图形元素:

  • 矩形tft.drawRect(x, y, width, height, color)
  • 圆形tft.drawCircle(x, y, radius, color)
  • 文字tft.setTextColor(color)tft.setCursor(x, y)

示例代码:

void drawBasicShapes() {
  tft.drawRect(10, 10, 100, 50, ILI9341_RED); // 绘制红色边框矩形
  tft.fillCircle(60, 60, 20, ILI9341_BLUE); // 绘制蓝色实心圆
  tft.setTextColor(ILI9341_WHITE);
  tft.setCursor(10, 120);
  tft.println("Hello, ESP32!"); // 显示文本
}

2. 按钮与交互设计

为了实现交互功能,可以在屏幕上绘制按钮,并通过触摸屏或按键检测点击事件。以下是一个简单的按钮绘制与检测逻辑:

按钮绘制
void drawButton(int x, int y, int width, int height, String text) {
  tft.drawRect(x, y, width, height, ILI9341_GREEN);
  tft.setTextColor(ILI9341_WHITE);
  tft.setCursor(x + 10, y + 20);
  tft.print(text);
}
触摸检测(需带触摸屏)

如果TFT屏幕带有触摸功能,可以使用XPT2046_Touchscreen库检测触摸点坐标:

#include <XPT2046_Touchscreen.h>

#define TOUCH_CS 15
XPT2046_Touchscreen ts(TOUCH_CS);

void checkTouch(int buttonX, int buttonY, int buttonWidth, int buttonHeight) {
  TS_Point p = ts.getPoint(); // 获取触摸点
  if (p.x >= buttonX && p.x <= buttonX + buttonWidth &&
      p.y >= buttonY && p.y <= buttonY + buttonHeight) {
    tft.fillScreen(ILI9341_YELLOW); // 点击按钮后改变屏幕颜色
  }
}

3. 动态界面更新

通过定时刷新屏幕内容,可以实现动态效果。例如,显示当前时间或传感器数据:

void updateDynamicContent() {
  static unsigned long lastUpdate = 0;
  if (millis() - lastUpdate > 1000) { // 每秒更新一次
    lastUpdate = millis();
    tft.fillRect(0, 150, 240, 20, ILI9341_BLACK); // 清除旧内容
    tft.setCursor(10, 160);
    tft.setTextColor(ILI9341_GREEN);
    tft.print("Time: ");
    tft.print(millis() / 1000); // 显示运行时间(秒)
  }
}

四、优化与扩展

1. 图片显示

通过SD卡加载位图(BMP)文件,可以进一步丰富界面内容。需要使用Adafruit_ST7735库中的drawBitmap函数。

2. 状态机设计

对于复杂的界面流程,可以采用状态机模型进行管理。以下是状态机的Mermaid代码:

stateDiagram-v2
    [*] --> Idle
    Idle --> ButtonPressed : 检测到按钮点击
    ButtonPressed --> DataDisplay : 显示数据
    DataDisplay --> Idle : 返回主界面