M5StackのM5StickCの少ないボタンでメニューをなんとかしようと検討中。Claudeでやってたのだけど、うまくいかない。そこで、M5StackのCHATにポイントを聞いてみた。とりあえず記録。
質問は
「M5UnifiedをM5StickCで使う。ボタンの短押しと長押しを使い分けるときのポイントを教えて。」
以下、答え。
M5Unifiedライブラリを使ったM5StickCのボタン短押し/長押しの使い分けポイントは以下の通りです。
- 基本設定と M5.update() の必須呼び出し
void setup() で M5.begin() を実行し、loop() 内で必ず M5.update() を呼び出す。これによりボタン状態が更新されます。
void setup() {
auto cfg = M5.config();
M5.begin(cfg); // M5StickCの初期化
}
void loop() {
M5.update(); // ボタン状態更新(必須)
// ボタン処理…
}
include
- 短押しの検出方法
wasPressed(): ボタンが「押された瞬間」を検出(押下時1回のみ反応)。
wasClicked(): 短押し(軽くタッチして離した場合)を検出する高レベルAPI。
if (M5.BtnA.wasPressed()) {
M5.Lcd.println("BtnA 短押し (wasPressed)");
}
if (M5.BtnA.wasClicked()) { // 推奨
M5.Lcd.println("BtnA 短押し (wasClicked)");
}
- 長押しの検出方法
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)");
}
- 長押し閾値のカスタマイズ
setHoldThresh(ms) で長押し判定時間を変更(例:1000msに設定)。
void setup() {
M5.begin();
M5.BtnA.setHoldThresh(1000); // 長押し判定を1秒に設定
}
- 短押しと長押しの競合回避
「長押し後に短押しが誤検出される」問題を防ぐため、wasHold() を先に判定する。
void loop() {
M5.update();
if (M5.BtnA.wasHold()) {
M5.Lcd.println("長押し処理"); // 長押しを優先判定
} else if (M5.BtnA.wasClicked()) {
M5.Lcd.println("短押し処理");
}
}
- 電源ボタン(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長押し");
}
コメント