【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
项目实验之十六:为带有 On/Off 按钮的 ESP32 Cheap Yellow Display 板构建基本 GUI
实验开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
- 项目实验之十六:为带有 On/Off 按钮的 ESP32 Cheap Yellow Display 板构建基本 GUI
- */
-
- #include <SPI.h> // 引入SPI库,用于与触摸屏通信
- #include <TFT_eSPI.h> // 引入TFT_eSPI库,用于驱动TFT显示屏
- #include <XPT2046_Touchscreen.h> // 引入XPT2046触摸屏库
-
- TFT_eSPI tft = TFT_eSPI(); // 创建TFT_eSPI对象,用于操作显示屏
-
- // 定义触摸屏的引脚
- #define XPT2046_IRQ 36 // 触摸屏中断引脚
- #define XPT2046_MOSI 32 // 触摸屏MOSI引脚
- #define XPT2046_MISO 39 // 触摸屏MISO引脚
- #define XPT2046_CLK 25 // 触摸屏时钟引脚
- #define XPT2046_CS 33 // 触摸屏片选引脚
-
- // 创建一个SPI类对象,用于触摸屏通信
- SPIClass touchscreenSPI = SPIClass(VSPI); // 使用VSPI端口
- XPT2046_Touchscreen touchscreen(XPT2046_CS, XPT2046_IRQ); // 创建XPT2046触摸屏对象
-
- #define SCREEN_WIDTH 320 // 显示屏宽度
- #define SCREEN_HEIGHT 240 // 显示屏高度
- #define FONT_SIZE 3 // 字体大小
-
- // 按钮位置和大小
- #define FRAME_X 60 // 按钮框架X坐标
- #define FRAME_Y 60 // 按钮框架Y坐标
- #define FRAME_W 200 // 按钮框架宽度
- #define FRAME_H 120 // 按钮框架高度
-
- // 红色区域大小
- #define REDBUTTON_X FRAME_X // 红色按钮X坐标
- #define REDBUTTON_Y FRAME_Y // 红色按钮Y坐标
- #define REDBUTTON_W (FRAME_W / 2) // 红色按钮宽度
- #define REDBUTTON_H FRAME_H // 红色按钮高度
-
- // 绿色区域大小
- #define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W) // 绿色按钮X坐标
- #define GREENBUTTON_Y FRAME_Y // 绿色按钮Y坐标
- #define GREENBUTTON_W (FRAME_W / 2) // 绿色按钮宽度
- #define GREENBUTTON_H FRAME_H // 绿色按钮高度
-
- // RGB LED引脚
- #define CYD_LED_BLUE 17 // 蓝色LED引脚
- #define CYD_LED_RED 4 // 红色LED引脚
- #define CYD_LED_GREEN 16 // 绿色LED引脚
-
- // 触摸屏坐标:(x, y)和压力(z)
- int x, y, z; // 存储当前按钮状态
- bool buttonState = false; // 打印触摸屏信息关于X, Y和压力(Z)在串口监视器
-
- // 打印触摸屏信息关于X, Y和压力(Z)在串口监视器
- void printTouchToSerial(int touchX, int touchY, int touchZ) {
- Serial.print("X = "); Serial.print(touchX);
- Serial.print(" | Y = "); Serial.print(touchY);
- Serial.print(" | Pressure = "); Serial.print(touchZ);
- Serial.println();
- }
-
- // 绘制按钮框架
- void drawFrame() {
- tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, TFT_BLACK); // 绘制黑色矩形框
- }
-
- // 绘制红色按钮
- void drawRedButton() {
- tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_RED); // 填充红色矩形
- tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_WHITE); // 填充白色矩形
- drawFrame(); // 绘制框架
- tft.setTextColor(TFT_BLACK); // 设置文本颜色为黑色
- tft.setTextSize(FONT_SIZE); // 设置字体大小
- tft.setTextDatum(MC_DATUM); // 设置文本对齐方式
- tft.drawString("ON", GREENBUTTON_X + (GREENBUTTON_W / 2), GREENBUTTON_Y + (GREENBUTTON_H / 2)); // 绘制文本"ON"
- buttonState = false; // 设置按钮状态为false
- }
-
- // 绘制绿色按钮
- void drawGreenButton() {
- tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, TFT_GREEN); // 填充绿色矩形
- tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, TFT_WHITE); // 填充白色矩形
- drawFrame(); // 绘制框架
- tft.setTextColor(TFT_BLACK); // 设置文本颜色为黑色
- tft.setTextSize(FONT_SIZE); // 设置字体大小
- tft.setTextDatum(MC_DATUM); // 设置文本对齐方式
- tft.drawString("OFF", REDBUTTON_X + (REDBUTTON_W / 2) + 1, REDBUTTON_Y + (REDBUTTON_H / 2)); // 绘制文本"OFF"
- buttonState = true; // 设置按钮状态为true
- }
-
- void setup() {
- Serial.begin(115200); // 开启串口通信
- // 开始触摸屏的SPI通信并初始化触摸屏
- touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
- touchscreen.begin(touchscreenSPI);
- // 设置触摸屏旋转为横向模式
- // 注意:某些显示屏的触摸屏可能需要设置旋转为3:
- touchscreen.setRotation(3);
- touchscreen.setRotation(1); // 设置触摸屏旋转为横向模式
-
- // 开始TFT显示屏
- tft.init(); // 初始化TFT显示屏
- // 设置TFT显示屏旋转为横向模式
- tft.setRotation(1);
-
- // 清空屏幕
- tft.fillScreen(TFT_BLACK); // 用黑色填充屏幕
-
- // 绘制绿色按钮
- drawGreenButton(); // 绘制绿色按钮
-
- pinMode(CYD_LED_GREEN, OUTPUT); // 设置绿色LED引脚为输出模式
- digitalWrite(CYD_LED_GREEN, LOW); // 初始状态关闭绿色LED
- }
-
- void loop() {
- // 检查触摸屏是否被触摸,并在TFT显示屏和串口监视器上打印X, Y和压力(Z)信息
- if (touchscreen.tirqTouched() && touchscreen.touched()) {
- // 获取触摸屏坐标点
- TS_Point p = touchscreen.getPoint();
- // 使用map函数校准触摸屏坐标点到正确的宽度和高度
- x = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
- y = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
- z = p.z;
- printTouchToSerial(x, y, z); // 打印触摸屏信息
-
- if (buttonState) {
- Serial.println("ON");
- // 检查是否触摸了红色按钮区域
- if ((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
- if ((y > (REDBUTTON_Y)) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
- Serial.println("Red button pressed");
- drawRedButton(); // 绘制红色按钮
- digitalWrite(CYD_LED_GREEN, HIGH); // 打开绿色LED
- }
- }
- } else {
- Serial.println("OFF");
- // 检查是否触摸了绿色按钮区域
- if ((x > (GREENBUTTON_X)) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
- if ((y > (GREENBUTTON_Y)) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
- Serial.println("Green button pressed");
- drawGreenButton(); // 绘制绿色按钮
- digitalWrite(CYD_LED_GREEN, LOW); // 关闭绿色LED
- }
- }
- }
- }
- }
复制代码
|