210浏览
查看: 210|回复: 6

[项目] 【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

[复制链接]
【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图1

ESP32-CYD(2432S028)液晶2.8寸屏开发板使用ESP32-WROOM-32模块作为主控,主控是一款双核MCU,集成了Wi-Fi和蓝牙功能,主频可达240MHz,具有520KB的SRAM、448KB的ROM,闪存容量为4MB+4MB,显示分辨率为240x320,采用电阻式触控式屏幕。该模块包括LCD显示器、背光控制电路、触控式屏幕控制电路、扬声器驱动电路、光敏电路和RGB LED控制电路。支持TF卡界面、序列界面、温湿度感测器界面(DHT11界面)和保留的IO口界面,该模块支持在Arduino IDE、ESP IDE、MicroPython和Mixly中进行开发。

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图2

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:24:46

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
  项目实验之十六:为带有 On/Off 按钮的 ESP32 Cheap Yellow Display 板构建基本 GUI

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
  4.   项目实验之十六:为带有 On/Off 按钮的 ESP32 Cheap Yellow Display 板构建基本 GUI
  5. */
  6. #include <SPI.h>  // 引入SPI库,用于与触摸屏通信
  7. #include <TFT_eSPI.h>  // 引入TFT_eSPI库,用于驱动TFT显示屏
  8. #include <XPT2046_Touchscreen.h>  // 引入XPT2046触摸屏库
  9. TFT_eSPI tft = TFT_eSPI(); // 创建TFT_eSPI对象,用于操作显示屏
  10. // 定义触摸屏的引脚
  11. #define XPT2046_IRQ 36 // 触摸屏中断引脚
  12. #define XPT2046_MOSI 32 // 触摸屏MOSI引脚
  13. #define XPT2046_MISO 39 // 触摸屏MISO引脚
  14. #define XPT2046_CLK 25 // 触摸屏时钟引脚
  15. #define XPT2046_CS 33 // 触摸屏片选引脚
  16. // 创建一个SPI类对象,用于触摸屏通信
  17. SPIClass touchscreenSPI = SPIClass(VSPI); // 使用VSPI端口
  18. XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ); // 创建XPT2046触摸屏对象
  19. #define SCREEN_WIDTH 320 // 显示屏宽度
  20. #define SCREEN_HEIGHT 240 // 显示屏高度
  21. #define FONT_SIZE 3 // 字体大小
  22. // 按钮位置和大小
  23. #define FRAME_X 60 // 按钮框架X坐标
  24. #define FRAME_Y 60 // 按钮框架Y坐标
  25. #define FRAME_W 200 // 按钮框架宽度
  26. #define FRAME_H 120 // 按钮框架高度
  27. // 红色区域大小
  28. #define REDBUTTON_X FRAME_X // 红色按钮X坐标
  29. #define REDBUTTON_Y FRAME_Y // 红色按钮Y坐标
  30. #define REDBUTTON_W (FRAME_W / 2) // 红色按钮宽度
  31. #define REDBUTTON_H FRAME_H // 红色按钮高度
  32. // 绿色区域大小
  33. #define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W) // 绿色按钮X坐标
  34. #define GREENBUTTON_Y FRAME_Y // 绿色按钮Y坐标
  35. #define GREENBUTTON_W (FRAME_W / 2) // 绿色按钮宽度
  36. #define GREENBUTTON_H FRAME_H // 绿色按钮高度
  37. // RGB LED引脚
  38. #define CYD_LED_BLUE 17 // 蓝色LED引脚
  39. #define CYD_LED_RED 4 // 红色LED引脚
  40. #define CYD_LED_GREEN 16 // 绿色LED引脚
  41. // 触摸屏坐标:(x, y)和压力(z)
  42. int x, y, z; // 存储当前按钮状态
  43. bool buttonState = false; // 打印触摸屏信息关于X, Y和压力(Z)在串口监视器
  44. // 打印触摸屏信息关于X, Y和压力(Z)在串口监视器
  45. void printTouchToSerial(int touchX, int touchY, int touchZ) {
  46.   Serial.print("X = "); Serial.print(touchX);
  47.   Serial.print(" | Y = "); Serial.print(touchY);
  48.   Serial.print(" | Pressure = "); Serial.print(touchZ);
  49.   Serial.println();
  50. }
  51. // 绘制按钮框架
  52. void drawFrame() {
  53.   tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, TFT_BLACK); // 绘制黑色矩形框
  54. }
  55. // 绘制红色按钮
  56. void drawRedButton() {
  57.   tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_RED); // 填充红色矩形
  58.   tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_WHITE); // 填充白色矩形
  59.   drawFrame(); // 绘制框架
  60.   tft.setTextColor(TFT_BLACK); // 设置文本颜色为黑色
  61.   tft.setTextSize(FONT_SIZE); // 设置字体大小
  62.   tft.setTextDatum(MC_DATUM); // 设置文本对齐方式
  63.   tft.drawString("ON", GREENBUTTON_X + (GREENBUTTON_W / 2), GREENBUTTON_Y + (GREENBUTTON_H / 2)); // 绘制文本"ON"
  64.   buttonState = false; // 设置按钮状态为false
  65. }
  66. // 绘制绿色按钮
  67. void drawGreenButton() {
  68.   tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_GREEN); // 填充绿色矩形
  69.   tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_WHITE); // 填充白色矩形
  70.   drawFrame(); // 绘制框架
  71.   tft.setTextColor(TFT_BLACK); // 设置文本颜色为黑色
  72.   tft.setTextSize(FONT_SIZE); // 设置字体大小
  73.   tft.setTextDatum(MC_DATUM); // 设置文本对齐方式
  74.   tft.drawString("OFF", REDBUTTON_X + (REDBUTTON_W / 2) + 1, REDBUTTON_Y + (REDBUTTON_H / 2)); // 绘制文本"OFF"
  75.   buttonState = true; // 设置按钮状态为true
  76. }
  77. void setup() {
  78.   Serial.begin(115200); // 开启串口通信
  79.   // 开始触摸屏的SPI通信并初始化触摸屏
  80.   touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
  81.   touchscreen.begin(touchscreenSPI);
  82.   // 设置触摸屏旋转为横向模式
  83.   // 注意:某些显示屏的触摸屏可能需要设置旋转为3:
  84.   touchscreen.setRotation(3);
  85.   touchscreen.setRotation(1); // 设置触摸屏旋转为横向模式
  86.   // 开始TFT显示屏
  87.   tft.init(); // 初始化TFT显示屏
  88.   // 设置TFT显示屏旋转为横向模式
  89.   tft.setRotation(1);
  90.   // 清空屏幕
  91.   tft.fillScreen(TFT_BLACK); // 用黑色填充屏幕
  92.   // 绘制绿色按钮
  93.   drawGreenButton(); // 绘制绿色按钮
  94.   pinMode(CYD_LED_GREEN, OUTPUT); // 设置绿色LED引脚为输出模式
  95.   digitalWrite(CYD_LED_GREEN, LOW); // 初始状态关闭绿色LED
  96. }
  97. void loop() {
  98.   // 检查触摸屏是否被触摸,并在TFT显示屏和串口监视器上打印X, Y和压力(Z)信息
  99.   if (touchscreen.tirqTouched() && touchscreen.touched()) {
  100.     // 获取触摸屏坐标点
  101.     TS_Point p = touchscreen.getPoint();
  102.     // 使用map函数校准触摸屏坐标点到正确的宽度和高度
  103.     x = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
  104.     y = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
  105.     z = p.z;
  106.     printTouchToSerial(x, y, z); // 打印触摸屏信息
  107.     if (buttonState) {
  108.       Serial.println("ON");
  109.       // 检查是否触摸了红色按钮区域
  110.       if ((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
  111.         if ((y > (REDBUTTON_Y)) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
  112.           Serial.println("Red button pressed");
  113.           drawRedButton(); // 绘制红色按钮
  114.           digitalWrite(CYD_LED_GREEN, HIGH); // 打开绿色LED
  115.         }
  116.       }
  117.     } else {
  118.       Serial.println("OFF");
  119.       // 检查是否触摸了绿色按钮区域
  120.       if ((x > (GREENBUTTON_X)) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
  121.         if ((y > (GREENBUTTON_Y)) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
  122.           Serial.println("Green button pressed");
  123.           drawGreenButton(); // 绘制绿色按钮
  124.           digitalWrite(CYD_LED_GREEN, LOW); // 关闭绿色LED
  125.         }
  126.       }
  127.     }
  128.   }
  129. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:27:00

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

代码解读

1、触摸屏初始化:通过定义触摸屏的CS、IRQ、MOSI、MISO和CLK引脚,初始化触摸屏对象,并设置其旋转模式。

2、显示屏初始化:使用TFT_eSPI库初始化TFT显示屏,并设置其旋转模式,确保显示屏与触摸屏的物理方向一致。

3、按钮绘制与状态管理:通过绘制红色和绿色按钮,并使用buttonState变量管理当前按钮状态,实现按钮的视觉效果和逻辑控制。

4、触摸屏事件处理:通过检查触摸屏是否被触摸,并获取触摸点的坐标,根据触摸位置判断是否触发按钮事件,并执行相应的动作。

5、LED状态控制:根据按钮状态控制RGB LED中绿色LED的开关,实现视觉反馈。



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:30:55

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

实验串口返回情况

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:38:59

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

实验场景图  动态图

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:40:30

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

实验场景图  

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-11-8 14:42:33

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图1

【花雕学编程】Arduino动手做(238)--ESP32 CYD 构建基本GUI图2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail