驴友花雕 发表于 2024-11-8 18:43:44

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏



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中进行开发。



驴友花雕 发表于 2024-11-8 18:50:05

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
项目实验之十七:ESP32 CYD液晶2.8寸开发板显示文本和测试触摸屏

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十八:ESP32 CYD开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
项目实验之十七:ESP32 CYD液晶2.8寸开发板显示文本和测试触摸屏
*/

#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 2 // 字体大小

// 存储触摸屏坐标:(x, y) 和压力(z)
int 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();
}

// 在TFT显示屏上打印触摸屏信息,包括X、Y和压力(Z)
void printTouchToDisplay(int touchX, int touchY, int touchZ) {
// 清空TFT屏幕
tft.fillScreen(TFT_WHITE);
tft.setTextColor(TFT_BLACK, TFT_WHITE);// 设置文本颜色和背景色

int centerX = SCREEN_WIDTH / 2;
int textY = 80;

String tempText = "X = " + String(touchX);
tft.drawCentreString(tempText, centerX, textY, FONT_SIZE);// 绘制文本

textY += 20;
tempText = "Y = " + String(touchY);
tft.drawCentreString(tempText, centerX, textY, FONT_SIZE);

textY += 20;
tempText = "Pressure = " + String(touchZ);
tft.drawCentreString(tempText, centerX, textY, FONT_SIZE);
}

void setup() {
Serial.begin(115200);// 开启串口通信,波特率为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.setRotation(1);

// 清空屏幕,准备写入
tft.fillScreen(TFT_WHITE);
tft.setTextColor(TFT_BLACK, TFT_WHITE);// 设置文本颜色和背景色

// 设置显示中心的X和Y坐标
int centerX = SCREEN_WIDTH / 2;
int centerY = SCREEN_HEIGHT / 2;

tft.drawCentreString("Hello, world!", centerX, 30, FONT_SIZE);// 绘制文本
tft.drawCentreString("Touch screen to test", centerX, centerY, FONT_SIZE);
}

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);// 打印到串口监视器
    printTouchToDisplay(x, y, z);// 打印到TFT显示屏

    delay(100);// 延时100毫秒
}
}

驴友花雕 发表于 2024-11-8 18:52:07

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏

代码解读
1、库文件引入:

SPI.h:引入SPI通信协议库,用于与触摸屏和TFT显示屏进行数据通信。
TFT_eSPI.h:引入TFT_eSPI库,用于驱动和管理TFT显示屏。
XPT2046_Touchscreen.h:引入XPT2046_Touchscreen库,专门用于驱动XPT2046触摸屏控制器芯片。

2、TFT显示屏初始化:

创建TFT_eSPI对象tft,用于后续的显示屏操作。
通过tft.init()初始化TFT显示屏,设置显示参数。
设置显示屏的旋转模式,使其与物理连接相匹配。

3、触摸屏初始化:

定义触摸屏的控制引脚,并创建SPIClass对象touchscreenSPI和XPT2046_Touchscreen对象touchscreen。
通过touchscreen.begin()初始化触摸屏,设置其通信协议和中断引脚。

4、屏幕和触摸屏参数设置:

定义屏幕的宽度、高度和字体大小,这些参数用于后续的显示和触摸校准。
定义变量x、y、z来存储触摸屏的坐标和压力值。

5、触摸屏数据处理:

printTouchToSerial()函数用于将触摸数据输出到串口监视器,方便调试。
printTouchToDisplay()函数用于将触摸数据实时显示在TFT屏幕上,增强用户交互体验。

6、主循环中的触摸检测:

在loop()函数中,通过touchscreen.tirqTouched()和touchscreen.touched()检测触摸屏是否被触摸。
使用touchscreen.getPoint()获取触摸点的原始数据,并使用map()函数将这些数据转换为屏幕坐标系。
调用printTouchToSerial()和printTouchToDisplay()函数,将触摸信息输出到串口和显示屏。

7、触摸屏校准:

使用map()函数对触摸屏的原始坐标进行校准,以匹配TFT显示屏的实际分辨率。

8、用户界面反馈:

在TFT显示屏上显示触摸点的坐标和压力值,提供即时的用户操作反馈。
以上要点涵盖了从库文件引入、硬件初始化、参数设置到用户交互的全过程,展示了如何使用Arduino和相应的库来实现一个基本的触摸屏应用。

驴友花雕 发表于 2024-11-8 18:54:17

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏

实验串口返回情况


驴友花雕 发表于 2024-11-8 18:56:41

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏

实验场景图




驴友花雕 发表于 2024-11-8 18:58:31

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏




驴友花雕 发表于 2024-11-8 19:00:35

【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏




页: [1]
查看完整版本: 【花雕学编程】Arduino动手做(238)--ESP32 CYD 测试触摸屏