ESP32使用TFT_eSPI库实现屏幕触摸

3 篇文章 0 订阅
3 篇文章 0 订阅


软硬件:ESP-WROOM-32、Arduino、2.8寸240*320触摸屏(ILI9341驱动)
以下是开发板和屏幕实物
在这里插入图片描述
在这里插入图片描述

软件准备

1、在Arduino中搜索安装TFT_eSPI库。
2、找到TFT_eSPI的安装目录,个人根据电脑用户名、安装目录不同有所差异,可以参照我的路径寻找:C:\Users\ZJC\Documents\Arduino\libraries\TFT_eSPI。
3、打开User_Setup.h文件,首先选择屏幕驱动,这里用的屏幕驱动为ILI9341,那么将#define ILI9341_DRIVER取消注释。
在这里插入图片描述往下找到以下行,这是默认针对ESP8266的引脚定义,由于这里使用的是ESP32,将它们注释掉。
在这里插入图片描述
再往下,找到以下代码,这是针对ESP32的引脚定义,将它们取消注释。
在这里插入图片描述
最后记得保存。
4、打开User_Setup_Select.h文件,根据注释找到合适的include语句,取消其注释,比如这里屏幕使用的ILI9341和ESP32开发板,则将#include <User_Setups/Setup42_ILI9341_ESP32.h>这行取消注释即可。
在这里插入图片描述
5、打开User_Setups文件夹,打开上一步选择的.h文件,这里就是Setup42_ILI9341_ESP32.h文件,因为将要同时实现显示和触摸功能,将框中的代码取消注释,这个定义的是触摸SPI片选引脚,即将触摸的T_CS引脚连接ESP32的D5引脚。
在这里插入图片描述
如果第5步没有完成,在Arduino编译时可能出现以下错误:'class TFT_eSPI' has no member named 'getTouch'
在这里插入图片描述

引脚连接

上面第5步的截图中定义了屏幕与ESP32的引脚连接,为什么触摸部分只有一个TOUCH_CS呢?因为触摸和显示是分为两个模块,它们都使用SPI与ESP32进行通信。

因为SPI通信的引脚在不同地方叫法比较多,在这里可按以下简单归为同一引脚:MISO(SDO)、MOSI(SDI)、SCLK(CLK)

因此触摸部分的T_CLK与TFT_SCKL连接,根据以上定义T_CS连接ESP32的D5,T_DIN连接SDI(MOSI),根据定义T_DO连接ESP32的D19,T_IRQ不连接。

显示部分按照上图中的引脚定义接线即可,但是SDO(MISO)不接线,否则后面会导致异常。

触摸和显示有两根线是共用的,这就是SPI中一个主设备对多个从设备,ESP32是通过控制触摸和显示的CS来选择控制哪个设备。

程序上传

打开示例程序TFT_eSPI—Generic—Touch_calibrate,编译上传。
在这里插入图片描述
如果一切正常,会先出现屏幕校准(因为是电阻屏),如果跳过会导致触摸位置偏移,校准完后就可进行触摸了。
在这里插入图片描述
在这里插入图片描述
代码中的x、y就是触摸的坐标,根据此坐标即可判断位置
在这里插入图片描述

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Arduino esp32淘晶驰触摸屏上实时绘制正弦波,需要使用TFT_eSPI和XPT2046_Touchscreen。首先,需要创建一个名为“sin_wave”的函数,该函数将计算正弦波并将其绘制到触摸屏上。 以下是一份示例代码: ```C++ #include <TFT_eSPI.h> #include <XPT2046_Touchscreen.h> #define TFT_CS 15 #define TFT_DC 2 #define TOUCH_CS 33 TFT_eSPI tft = TFT_eSPI(TFT_WIDTH, TFT_HEIGHT); XPT2046_Touchscreen ts(TOUCH_CS); #define SCREEN_WIDTH TFT_WIDTH #define SCREEN_HEIGHT TFT_HEIGHT void setup() { tft.begin(); ts.begin(); tft.setRotation(1); tft.fillScreen(TFT_BLACK); } void sin_wave(int x_offset, int y_offset, int amplitude, float frequency, float phase) { tft.fillScreen(TFT_BLACK); // 清空屏幕 tft.setCursor(0, 0); // 设置光标位置 for (int x = 0; x < SCREEN_WIDTH; x++) { float y = amplitude * sin(2 * PI * frequency * x / SCREEN_WIDTH + phase); tft.drawPixel(x + x_offset, y + y_offset, TFT_WHITE); // 绘制像素点 } } void loop() { TS_Point p = ts.getPoint(); if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { sin_wave(0, SCREEN_HEIGHT/2, 20, 1, 0); // 绘制正弦波 } } ``` 在上面的代码中,`sin_wave`函数将在触摸屏上绘制一个正弦波。其中,`x_offset`和`y_offset`参数控制正弦波在屏幕上的位置,`amplitude`参数控制正弦波的振幅,`frequency`参数控制正弦波的频率,`phase`参数控制正弦波的相位。 在`loop`函数中,我们使用`ts.getPoint()`函数获取触摸屏上的点,并检查其是否在有效范围内。如果是,则调用`sin_wave`函数绘制正弦波。 希望这可以帮助你实现你的想法!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值