TOUGH正面集成一块2英寸的电阻式触摸屏,驱动芯片为NS2009,在M5Tough库中,我们提供了一系列的API能够用于触摸交互检测,详情如下。
在M5.begin()
初始化中,已经创建了实例touch
并进行了初始化. 你可以用该实例中的API获取触摸交互信息。
功能:初始化触摸屏,在M5.begin中将默认调用该函数初始化触摸屏
void begin(bool EEPROMEnabled = true)
功能:进行屏幕触摸校准(校准数据将保存至EEPROM),已经校准则返回True, 否则进入校准页面,用户需要根据屏幕提示依次触摸指定位置
bool calibrationTouch(TFT_eSPI *fb)
案例程序:
#include <M5Tough.h>
void setup()
{
M5.begin(true, true, true, true);
while (!M5.touch.calibrationTouch(&M5.Lcd));
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.print("Calibration Successfully");
}
void loop()
{
}
功能:读取触摸数据
void read()
功能:读取触摸手指X坐标
int GetTouchX()
功能:读取触摸手指Y坐标
int GetTouchY()
功能:检测触摸手指按压
bool isPressed()
功能:检测触摸手指释放
bool isRelease()
功能:检测触摸手指移动
bool isMoving()
功能:等待触摸手指释放
bool WaitRelease()
功能:等待触摸手指释放,并设置超时时间
bool WaitRelease(uint64_t AutoReleseTime)
功能:读取触摸点信息,返回一个TouchPoint结构体,其中包含X,Y坐标信息,并且内部实现运算符重载,支持对TouchPoint类型的结构进行直接赋值与比较
TouchPoint getPoint()
通过调用getPoint方法,能够获取到一个TouchPoint结构体类型的数据。其内部包含的成员与方法如下。
class TouchPoint
{
public:
TouchPoint(int16_t x_ = -1, int16_t y_ = -1);
bool operator==(const TouchPoint &p);
bool operator!=(const TouchPoint &p);
bool operator=(const TouchPoint &p);
bool Equals(const TouchPoint &p);
void set(int16_t x_ = -1, int16_t y_ = -1);
bool vaild();
int16_t x, y;
};
用户可以通过创建TouchZoon结构体实例的方式,创建了一个屏幕区域,使用内置的contains
方法,能够判断TouchPoint是否包含在该区域中。
typedef struct TouchZone
{
uint16_t x;
uint16_t y;
uint16_t w;
uint16_t h;
TouchZone() : x(-1), y(-1), w(0), h(0) {}
TouchZone(uint16_t _x, uint16_t _y, uint16_t _w, uint16_t _h) : x(_x), y(_y), w(_w), h(_h){};
bool contains(const TouchPoint &p)
{
if ((this->x == -1) || (this->y == -1) || (this->w == 0) || (this->h == 0))
return false;
if ((p.x >= this->x) && (p.x <= (this->x + this->w)) &&
(p.y >= this->y) && (p.y <= (this->y + this->h)))
{
return true;
}
return false;
}
} TouchZone_t;
动态读取触摸数据时,需要将void update()
添加至循环中用于刷新触摸数据。
案例程序:
#include <M5Tough.h>
TouchZone clearBtn(0,0,50,50);
void setup()
{
M5.begin(true, true, true, true);
while (!M5.touch.calibrationTouch(&M5.Lcd));
M5.lcd.drawString("CLEAR",5,5,3);
}
void loop()
{
M5.update();
if(M5.touch.isPressed()){
TouchPoint Point = M5.touch.getPoint();
if(M5.touch.isMoving()){
char buffer[24];
sprintf(buffer, "X: %3d, Y: %3d", Point.x, Point.y);
M5.Lcd.drawPixel(Point.x, Point.y ,TFT_GREEN);
Serial.println(buffer);
}
if(clearBtn.contains(Point)){
M5.lcd.fillScreen(TFT_BLACK);
M5.lcd.drawString("CLEAR",5,5,3);
}
}
}