M5Unifiedの長押しと短押し使い分けのポイント

未分類

M5StackのM5StickCの少ないボタンでメニューをなんとかしようと検討中。Claudeでやってたのだけど、うまくいかない。そこで、M5StackのCHATにポイントを聞いてみた。とりあえず記録。

質問は
「M5UnifiedをM5StickCで使う。ボタンの短押しと長押しを使い分けるときのポイントを教えて。」

以下、答え。

M5Unifiedライブラリを使ったM5StickCのボタン短押し/長押しの使い分けポイントは以下の通りです。

  1. 基本設定と M5.update() の必須呼び出し

void setup() で M5.begin() を実行し、loop() 内で必ず M5.update() を呼び出す。これによりボタン状態が更新されます。

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg); // M5StickCの初期化
}

void loop() {
  M5.update(); // ボタン状態更新(必須)
 // ボタン処理…
}

include

  1. 短押しの検出方法

wasPressed(): ボタンが「押された瞬間」を検出(押下時1回のみ反応)。
wasClicked(): 短押し(軽くタッチして離した場合)を検出する高レベルAPI。

if (M5.BtnA.wasPressed()) {
  M5.Lcd.println("BtnA 短押し (wasPressed)");
}

if (M5.BtnA.wasClicked()) { // 推奨
  M5.Lcd.println("BtnA 短押し (wasClicked)");
}
  1. 長押しの検出方法

pressedFor(ms): ボタンが指定時間(ms)以上「押され続けている間」検出。
wasHold(): 長押し状態が確定した瞬間を検出(デフォルト500ms、setHoldThresh() で変更可)。

// 2秒間押し続けた場合(押下中に連続検出)
  if (M5.BtnA.pressedFor(2000)) {
  M5.Lcd.println("BtnA 2秒長押し中");
}

// 長押し確定時(1回のみ反応、デフォルト500ms)
if (M5.BtnA.wasHold()) { // 推奨
  M5.Lcd.println("BtnA 長押し (wasHold)");
}
  1. 長押し閾値のカスタマイズ

setHoldThresh(ms) で長押し判定時間を変更(例:1000msに設定)。

void setup() {
  M5.begin();
  M5.BtnA.setHoldThresh(1000); // 長押し判定を1秒に設定
}

  1. 短押しと長押しの競合回避

「長押し後に短押しが誤検出される」問題を防ぐため、wasHold() を先に判定する。

void loop() {
  M5.update();
  if (M5.BtnA.wasHold()) {
    M5.Lcd.println("長押し処理"); // 長押しを優先判定
  } else if (M5.BtnA.wasClicked()) {
    M5.Lcd.println("短押し処理");
  }
}
  1. 電源ボタン(BtnPWR)の注意点

M5StickCの電源ボタン(AXP192 PMIC制御)は M5.Power.getKeyState() で検出します。

uint8_t keyState = M5.Power.getKeyState();
if (keyState == 2) { // 短押し
  M5.Lcd.println("PWR短押し");
} else if (keyState == 1) { // 長押し
  M5.Lcd.println("PWR長押し");
}

コメント

タイトルとURLをコピーしました