回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(238)---ESP32 CYD液晶2.8寸开发板显示文本和测试触摸屏 简单

头像 驴友花雕 2024.11.08 9 0

0-2.jpg

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

 

00.jpg

  【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毫秒
  }
}

代码解读
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和相应的库来实现一个基本的触摸屏应用。

实验串口返回情况

 

03-3.jpg

实验场景图 

 

03-4.jpg
03-5.jpg
03-6.jpg
03-7.jpg
03-8.jpg
03-9.jpg
03-10.jpg

评论

user-avatar
icon 他的勋章
    展开更多