一、platformio.ini
[env:esp32dev]platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 upload_speed = 57600 monitor_rts = 0 monitor_dtr = 0 upload_flags = --before=default_reset --after=hard_reset lib_deps = lvgl/lvgl@^8.3 bodmer/TFT_eSPI@^2.5.43 build_flags = -I include -DLV_CONF_INCLUDE_SIMPLE -DLV_LVGL_H_INCLUDE_SIMPLE -DLV_CONF_PATH=lv_conf.h lib_ldf_mode = deep+
二、TFT_eSPI库User_Setup.h数据
#define USER_SETUP_INFO "User_Setup"#define ST7789_DRIVER#define TFT_WIDTH 240#define TFT_HEIGHT 280// 使用修正后的引脚#define TFT_CS 5 // 重大:改为5#define TFT_DC 2 // 重大:改为2#define TFT_RST 32#define TFT_MOSI 25 // SDA#define TFT_SCLK 33 // SCL#define TFT_BL 26#define TFT_BACKLIGHT_ON LOW#define SPI_FREQUENCY 20000000#define LOAD_GLCD#define LOAD_FONT2#define LOAD_FONT4#define TOUCH_CS -1 // 我们没有使用触摸屏的CS引脚#define TOUCH_SCLK 13 // TP_SCL#define TOUCH_MOSI 19 // TP_SDA#define TOUCH_MISO -1 // 没有MISO#define TOUCH_IRQ -1 // 不使用中断引脚// 触摸控制器型号#define XPT2046_DRIVER#define XPT2046_X_CALIBRATION 1#define XPT2046_Y_CALIBRATION 1#define XPT2046_X_OFFSET 0#define XPT2046_Y_OFFSET 0
三、主函数
#include <Arduino.h>#include <SPI.h>#include <TFT_eSPI.h>#include <Wire.h>// 引脚定义 - 根据你的配置#define TFT_CS 5#define TFT_DC 2#define TFT_RST 32#define TFT_BL 26#define TFT_BACKLIGHT_ON LOW#define LED_PIN 4 // LED连接到GPIO4// CST816T I2C地址和引脚#define CST816_I2C_ADDR 0x15#define TOUCH_SDA 19 // TP_SDA#define TOUCH_SCL 13 // TP_SCL// 寄存器地址#define CST816_REG_GESTURE_ID 0x01#define CST816_REG_FINGER_NUM 0x02#define CST816_REG_XPOS_H 0x03#define CST816_REG_XPOS_L 0x04#define CST816_REG_YPOS_H 0x05#define CST816_REG_YPOS_L 0x06TFT_eSPI tft = TFT_eSPI();// 触摸状态uint16_t touchX = 0;uint16_t touchY = 0;bool touched = false;bool ledState = false;// 按钮区域定义#define BUTTON_WIDTH 100#define BUTTON_HEIGHT 40#define BUTTON_X 70#define BUTTON_Y 120void drawInterface();void updateButton();void updateLEDStatus();void readTouch();void checkTouchChip();void setup() {
Serial.begin(115200);
Serial.println("CST816T触摸屏LED控制程序启动");
// 初始化LED引脚
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// 初始化TFT屏幕
tft.init();
tft.setRotation(3); // 根据你的屏幕方向调整
tft.fillScreen(TFT_BLACK);
// 初始化背光
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
// 初始化I2C用于触摸屏
Wire.begin(TOUCH_SDA, TOUCH_SCL);
// 检查触摸芯片
checkTouchChip();
// 绘制界面
drawInterface();
Serial.println("初始化完成,触摸按钮控制LED");
}void loop() { // 读取触摸数据
readTouch();
// 处理触摸事件 if (touched) {
Serial.printf("触摸坐标: X=%d, Y=%d
", touchX, touchY);
// 检查是否触摸了按钮区域 if (touchX >= BUTTON_X && touchX <= BUTTON_X + BUTTON_WIDTH &&
touchY >= BUTTON_Y && touchY <= BUTTON_Y + BUTTON_HEIGHT) {
// 切换LED状态
ledState = !ledState;
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
Serial.print("LED ");
Serial.println(ledState ? "打开" : "关闭");
// 更新按钮显示
updateButton();
// 添加短暂延迟防止多次触发
delay(300);
}
touched = false;
}
delay(50); // 降低读取频率}void drawInterface() { // 绘制标题
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(20, 30);
tft.println("CST816T触摸测试");
tft.setTextSize(1);
tft.setCursor(20, 60);
tft.println("触摸下方按钮控制LED");
// 绘制按钮
updateButton();
// 绘制状态指示
tft.setTextSize(1);
tft.setCursor(20, 180);
tft.println("LED状态: ");
updateLEDStatus();
}void updateButton() { // 根据LED状态绘制按钮 if (ledState) {
tft.fillRect(BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_GREEN);
tft.setTextColor(TFT_BLACK, TFT_GREEN);
} else {
tft.fillRect(BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TFT_RED);
tft.setTextColor(TFT_WHITE, TFT_RED);
}
tft.setTextSize(2);
tft.setCursor(BUTTON_X + 20, BUTTON_Y + 12);
tft.println("开关");
}void updateLEDStatus() {
tft.fillRect(100, 180, 100, 20, TFT_BLACK);
tft.setTextColor(ledState ? TFT_GREEN : TFT_RED, TFT_BLACK);
tft.setCursor(100, 180);
tft.println(ledState ? "ON " : "OFF");
}void checkTouchChip() {
Wire.beginTransmission(CST816_I2C_ADDR); if (Wire.endTransmission() == 0) {
Serial.println("CST816T触摸芯片检测成功");
} else {
Serial.println("错误: CST816T触摸芯片未找到!");
Serial.println("请检查接线:");
Serial.println(" SDA -> GPIO19");
Serial.println(" SCL -> GPIO13");
Serial.println(" VCC -> 3.3V");
Serial.println(" GND -> GND");
// 显示错误信息
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.setTextSize(1);
tft.setCursor(10, 200);
tft.println("触摸芯片未连接!");
}
}void readTouch() { uint8_t data[6];
// 读取触摸数据
Wire.beginTransmission(CST816_I2C_ADDR);
Wire.write(CST816_REG_GESTURE_ID); if (Wire.endTransmission() != 0) { return; // 通信失败
}
Wire.requestFrom(CST816_I2C_ADDR, 6); if (Wire.available() == 6) { for (int i = 0; i < 6; i++) {
data[i] = Wire.read();
}
uint8_t fingerNum = data[1] & 0x0F;
// 解析坐标(12位精度)
touchX = ((data[2] & 0x0F) << 8) | data[3];
touchY = ((data[4] & 0x0F) << 8) | data[5];
// 根据屏幕方向调整坐标 // 假设屏幕方向为横屏,分辨率240x280 uint16_t temp = touchX;
touchX = 280 - touchY; // 调整X坐标
touchY = temp; // 调整Y坐标
// 限制坐标范围
touchX = constrain(touchX, 0, 239);
touchY = constrain(touchY, 0, 279);
// 检查是否有有效触摸 if (fingerNum > 0 && touchX > 10 && touchY > 10) {
touched = true;
}
}
}// 调试函数:显示触摸坐标void debugTouch() { if (touched) {
Serial.printf("触摸: X=%d, Y=%d
", touchX, touchY);
// 在屏幕上显示坐标(调试用)
tft.fillRect(0, 220, 240, 20, TFT_BLACK);
tft.setTextColor(TFT_CYAN, TFT_BLACK);
tft.setTextSize(1);
tft.setCursor(10, 220);
tft.printf("X:%3d Y:%3d", touchX, touchY);
}
}四、效果

五、视频效果
https://www.kuaishou.com/short-video/3x7uqi5quzq3pu2?cc=share_wxms&followRefer=151&shareMethod=VIDEO&docId=10&kpn=NEBULA&subBiz=BROWSE_SLIDE_PHOTO&photoId=3x7uqi5quzq3pu2&shareId=18628662662705&shareToken=X-aKP5NjprRXj23h&shareResourceType=PHOTO_SELF&userId=3xgx5jd5dpmem3q&shareType=2&et=1_a%252F0_unknown0&shareMode=APP&efid=3xgx5jd5dpmem3q&originShareId=18628662662705&appType=21&shareObjectId=5252323244983815847&shareUrlOpened=0×tamp=1760654199268&utm_source=app_share&utm_medium=app_share&utm_campaign=app_share&location=app_share