02.M5Tab5でタッチテスト


02.M5Tab5でタッチテスト

M5Stack Tab5のタッチテストです。タッチの境界線に50~100pxの幅をつけ、間違えて隣を押さないようにしました。
画面タッチして指を離した時の座標と決めた範囲名の表示をします。
これは、Copilotへ質問をして参考にしました。

設定範囲

┌───┐┌───┐┌───┐ ┐
│   ││ 上 ││   │ │
│   │└───┘│ 右 │ │
│   │┌───┐│   │ │
│ 左 ││もどる││   │ │
│   │└───┘└───┘ │
│   │┌───┐      │
│   ││ 下 │      │
└───┘└───┘ ─────┘(1280,720)

x=0-425 (幅425)px
 左のタイルへ移動

x=425-475 (幅50) 反応しない

x=475-805(幅330)
 y=0-170(高さ170)
  上の左タイルへ移動
  頁の1番上なら、前頁の1番下の左タイルへ
 y=170-270(高さ100) 反応しない
 y=270-450(高さ180) メニューへ移動
 y=450-550(高さ100) 反応しない
 y=550-720(高さ170)
  下の左タイルへ移動
  頁の1番下なら、次頁の1番上の左タイルへ

x=805-855 (幅50) 反応しない

x=855-1160 (幅305)
 y=0-550 (高さ550)
  左タイルなら右へ移動
  右タイルなら左へ移動
 y=550-720 (高さ170) 反応しない
  指がかかるので反応しないようにします

x=1160-1280 (幅120)
 指がかかるので反応しないようにします

スケッチ


// タッチメニュー
// Arduino-IDE 2.3.6
// M5Stack by M5Stack official 3.2.2
// M5Unified by M5Stack 0.2.7
// M5GFX by M5Stack 0.2.9
#include <M5Unified.h>                                                    // M5統合ライブラリ
int32_t xx1 = 425, dx1 = 50, xx2 = 805, dx2 = 50, xx3 = 1160, dx3 = 120;  // x区切り位置
int32_t yy1 = 170, dy1 = 100, yy2 = 450, dy2 = 100;                       // y区切り位置

void setup() {
  M5.begin();                                                        // M5の初期化
  M5.Display.setRotation(3);                                         // 画面回転 (0-3,4-7)
  M5.Display.setFont(&fonts::lgfxJapanGothic_40);                    // 固定幅ゴシック 8,12,16,20,24,28,32,36,40
  M5.Display.setTextColor(TFT_GREEN);                                // 文字緑
  M5.Display.println("指を離した座標を表示");                        // 表示
  M5.Display.startWrite();                                           // バッファを効率的に使用開始
  M5.Display.fillRect(xx1, 0, dx1, 720, M5.Lcd.color565(0, 20, 0));  // 縦1 未使用範囲は塗りつぶし
  M5.Display.fillRect(xx2, 0, dx2, 720, M5.Lcd.color565(0, 20, 0));  // 縦2
  M5.Display.fillRect(xx3, 0, dx3, 720, M5.Lcd.color565(0, 20, 0));  // 右端
  M5.Display.fillRect(xx1 + dx1, yy1, xx2 - xx1 - dx1, dy1,
                      M5.Lcd.color565(0, 20, 0));  // 中央上 ほぼ黒色
  M5.Display.fillRect(xx1 + dx1, yy2, xx2 - xx1 - dx1, dy2,
                      M5.Lcd.color565(0, 20, 0));  // 中央下
  M5.Display.fillRect(xx2 + dx1, yy2 + dy2, xx3 - xx2 - dx2, 720 - yy2 - dy2,
                      M5.Lcd.color565(0, 20, 0));  // 右下
  M5.Display.endWrite();                           // バッファを効率的に使用終了
}
void loop() {
  M5.update();                                 // touch状態更新
  if (M5.Touch.isEnabled()) {                  // タッチが初期化されていれば
    auto touch = M5.Touch.getDetail();         // タッチの詳細情報取得
    if (touch.wasReleased()) {                 // 指を離したら
      int touchX = static_cast<int>(touch.x);  // 安全な型変換
      int touchY = static_cast<int>(touch.y);  // 安全な型変換
      M5.Display.printf("(%4d,%3d) ",
                        touchX, touchY);   // タッチ位置表示
      if (touchX < xx1) {                  // 425
        M5.Display.println("左");          // 表示
      } else if (touchX < xx1 + dx1) {     // 475
        M5.Display.println("x");           // 表示
      } else if (touchX < xx2) {           // 805
        if (touchY < yy1) {                // 170
          M5.Display.println("上");        // 表示
        } else if (touchY < yy1 + dy1) {   // 270
          M5.Display.println("x");         // 表示
        } else if (touchY < yy2) {         // 450
          M5.Display.println("メニュー");  // 表示
        } else if (touchY < yy2 + dy2) {   //550
          M5.Display.println("x");         // 表示
        } else {                           // その下
          M5.Display.println("下");        // 表示
        }
      } else if (touchX < xx2 + dx2) {  // 855
        M5.Display.println("x");        // 表示
      } else if (touchX < xx3) {        // 1160
        if (touchY < yy2 + dy2) {       // 550
          M5.Display.println("右");     // 表示
        } else {                        // その下
          M5.Display.println("x");      // 表示
        }
      } else {                    // その右
        M5.Display.println("x");  // 表示
      }
    }
  }
  vTaskDelay(1);  // 他のタスクを実行、マルチタスク用遅延(タスク数)
}
* flash memory(6.5Mbyte)のうち、スケッチが15%使用。
RAM(327kbyte)のうち、global変数が7%使用、
local変数で301kbyte使用可能。(1000byte=1kbyteで計算)