M5Stack Core2タッチパネル 自主トレ
1.M5.Touchクラス getPressPointでタッチパネル座標を取得する
#include <M5Core2.h>
//Buttonクラスの練習帳
#define LCDWIDE 320
#define LCDHEIGHT 240
TFT_eSprite canvas = TFT_eSprite(&M5.Lcd);
void setup()
{
M5.begin();
canvas.setColorDepth(8); // Set color depth.
canvas.setTextSize(2);
canvas.createSprite(320, 240); //Create a 320x240 canvas.
uint8_t interval = M5.Touch.interval();
Serial.printf("M5Touch interval:%d\r",interval);//default:13ms
//Strangely, the value 13 leads to slightly more frequent updates than 10
//(Still not every 13 ms, often more like 15 to 20)
}
void loop()
{
//クラス配列の初期化の仕方
static TouchPoint_t coordinate[2]={Point(0,0),Point(0,0)};
//タッチパネル getPressPointのエラー値
static TouchPoint_t errPt(-1,-1);//getPoint invalid value.
//パネルが押されているか?
//FT6336はWire1(G21:SDA G22:SCL)を使用。
//他のデバイスとの兼ね合いで、INTpin(G39)をポーリング。
if(M5.Touch.ispressed())//INT wire polled mode
{
coordinate[0] = M5.Touch.getPressPoint();//タッチ座標の取得
if(M5.Touch.changed)//変化あり?
{
//エラーだったら描画しない。
//演算子!=のオーバロードでPointクラスを比較。
if(errPt!=coordinate[0])//getting point is set to an invalid value?
{
//Serial.printf("%d,%d\r",coordinate[0].x, coordinate[0].y);
canvas.fillCircle(coordinate[0].x,coordinate[0].y,80,ORANGE);
canvas.fillCircle(coordinate[1].x,coordinate[1].y,80,BLACK);
canvas.pushSprite(0,0);
coordinate[1].set(coordinate[0].x,coordinate[0].y);
}
}
}
}
2.M5.Touchクラス HotZoneを使って図形をドラッグする。
#include <M5Core2.h>
//M5.Touch クラスの練習帳2
//HotZonの追跡、ドラッグする
#define LCDWIDE 320
#define LCDHEIGHT 240
#define HOTZONE_WIDE 100
#define HOTZONE_HEIGHT 100
#define HOTZONE_HALF_SIZE 50
//移動量
typedef struct main
{
int16_t x;
int16_t y;
}differentialDelta ;
differentialDelta dt;//移動ベクトル
//スプライトインスタンス
TFT_eSprite canvas = TFT_eSprite(&M5.Lcd);
//クラス配列の初期化の仕方 //TouchPoint_t(実体はPoint)
static TouchPoint_t coordinate[2]=
{Point(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE),
Point(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE)};
//タッチパネル座標
static TouchPoint_t tpCoordinate[2]={Point(0,0),Point(0,0)};
//タッチパネル getPressPointのエラー値
static TouchPoint_t errPt(-1,-1);//getPoint invalid value.
//HotZone Callback関数
void hotZone1Callback(void);
//HotZoneインスタンス初期化。Top-LeftとBottom-Right で枠指定。
HotZone hotZone1(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE,
LCDWIDE/2+HOTZONE_HALF_SIZE,LCDHEIGHT/2+HOTZONE_HALF_SIZE,
&hotZone1Callback);
//HotZoneコールバック関数定義
void hotZone1Callback(void)
{
//新しいタッチポイント座標で、移動ベクトルを求める。
dt.x = tpCoordinate[1].x - tpCoordinate[0].x;
dt.y = tpCoordinate[1].y - tpCoordinate[0].y;
//HotZoneのTop-Left座標に加算。
coordinate[0].x-=dt.x;
coordinate[0].y-=dt.y;
#if 0
Serial.printf("[0](%d,%d)\r",tpCoordinate[0].x,tpCoordinate[0].y);
Serial.printf("[1](%d,%d)\r",tpCoordinate[0].x,tpCoordinate[0].y);
Serial.printf("dt x:%d y:%d\r", dt.x, dt.y);
Serial.printf("[0](%d,%d)\r",coordinate[0].x,coordinate[0].y);
#endif
//HotZoneを再設定。
hotZone1.setZone(coordinate[0].x,
coordinate[0].y,
coordinate[0].x + HOTZONE_WIDE,
coordinate[0].y + HOTZONE_HEIGHT,
&hotZone1Callback);
}
//setup関数
void setup()
{
M5.begin();
canvas.setColorDepth(8);
canvas.setTextSize(2);
canvas.createSprite(320, 240); //Create a 320x240 canvas.
canvas.drawRect(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE,
HOTZONE_WIDE,HOTZONE_HEIGHT,DARKGREEN);
uint8_t interval = M5.Touch.interval();
//タッチパネル interval(ms)
//Serial.printf("M5Touch interval:%d\r",interval);//default:13ms
//Serial.printf("origin(%d,%d),w:%d h:%d)\r",hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h);
canvas.pushSprite(0,0);
}
//FT6336はWire1(G21:SDA G22:SCL)を使用。
//他のデバイスとの兼ね合いで、INTpin(G39)をポーリング。
void loop()
{
//パネルが押されているか?サンプリング間隔は、13ms
if(M5.Touch.ispressed())//INT wire polled mode
{
tpCoordinate[0] = M5.Touch.getPressPoint();//タッチ座標の取得
if(tpCoordinate[1].x==0 && tpCoordinate[1].y==0)
{
tpCoordinate[1]=tpCoordinate[0];
}
if(M5.Touch.changed)//座標の変化あり?
{
//Point座標エラーinvalid value(-1,-1)だったら描画しない。
if(errPt!=tpCoordinate[0])//演算子!=のオーバロードでPointクラスを比較。
{
//前位置の図形の消去
canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,BLACK);
//HotZone内をタッチしているか?
if(hotZone1.inHotZoneDoFun(tpCoordinate[0]))//HotZone内ならCallback実行。
{//HotZone内にタッチ
//Callback関数内で、HotZoneが新しい座標に移動したので、再描画。
canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);
}else
{//HotZone外でタッチ
//HotZoneの外でタッチなので、移動しないで描画。
canvas.drawRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);
canvas.pushSprite(0,0);
}
//タッチ座標の保存
tpCoordinate[1].set(tpCoordinate[0].x,tpCoordinate[0].y);
canvas.pushSprite(0,0);
}
}
}else
{//タッチされていない
tpCoordinate[1].set(0,0);
canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,BLACK);
canvas.drawRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);
canvas.pushSprite(0,0);
}
delay(1);
}