ESP32 使用1.69触摸显示屏控制开关灯

  • 时间:2025-10-22 17:46 作者: 来源: 阅读:6
  • 扫一扫,手机访问
摘要:一、platformio.ini[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 upload_speed = 57600 monitor_rts = 0 monitor_dtr = 0 upload_flag

一、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);
  }
}

四、效果


ESP32 使用1.69触摸显示屏控制开关灯


五、视频效果

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

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部