M5CORE2にはLCD画面に3個のタッチボタンA 、B、Cがあります。LCDの下方に並んでいる3つの赤丸の箇所がボタンになっており、ボタン操作のAPI関数が準備されています。それぞれどのような動きをするのか確認しました。
ボタン操作関数
ボタンを操作する関数には下記があります。ボタンをどのように使うか目的により使い分けます。
- isPressed()・・・押している間1を返す。モーメンタリスイッチのように使える。
- wasPressed()・・・押したタイミングで1回だけ1を返す。押したタイミングを優先したい場合に使う。
- wasReleased()・・・離したタイミングで1回だけ1を返す。選択肢の中から選ぶような操作に使う。
- pressedFor(t)・・・t[ms]以上長押しすると1を返す。その後も押し続けている間は1を返し続ける。
- wasReleasefor(t)・・・t[ms]以上長押しすると1回だけ1を返す。長押しによる選択操作の場合。
ボタンプレスとリリースの関数
isPressed()をボタンA 、wasPressed()をボタンB、wasReleased()をボタンCに割り付けて動きを確認してみました。プログラムは下記です。A、B、Cの各ボタンを押したときにそれぞれA、B、CをLCD画面に印字します。
#include <M5Core2.h>
void setup() {
M5.begin();
M5.Lcd.setTextSize(6);
}
void loop() {
M5.update();//ボタンの状態を更新するために必要
if (M5.BtnA.isPressed()) {
M5.Lcd.print('A');
}
else if (M5.BtnB.wasPressed()) {
M5.Lcd.print('B');
}
else if (M5.BtnC.wasReleased()) {
M5.Lcd.print('C');
}
delay(100);//繰り返し時間調整
}
Code language: C++ (cpp)
isPressed()は押している間ずっとAを繰り返し印字し続けます。wasPressed()は押した瞬間に印字され、押し続けても1回しか印字されません。wasReleased()は手を離した瞬間に印字されます。プログラム中にdelay(100)を入れています。これを入れないとisPressed()ではあっという間に画面が文字Aで埋め尽くされてしまうため、程良いディレーを入れています。下記画像は各ボタンそれぞれ1秒間押し続けた後に指を離したときの表示状態です。

長押しのプレスとリリースの関数
長押しの関数pressedFor(t)とwasReleasefor(t)の動作を確認します。ボタンAにpressedFor(t)、ボタンBにwasReleasefor(t)を使います。tは長押しの時間msです。プログラムは以下です。
#include <M5Core2.h>
void setup() {
M5.begin();
M5.Lcd.setTextSize(6);
}
void loop() {
M5.update();//ボタンの状態を更新するために必要
if (M5.BtnA.pressedFor(1000)) {
M5.Lcd.print('A');
}
else if (M5.BtnB.wasReleasefor(1000)) {
M5.Lcd.print('B');
}
delay(100);//繰り返し時間調整
}
Code language: C++ (cpp)
pressedFor(t)はt[ms]間押し続けるとAを印字しますが、引き続き押しづつけるとループサイクルで印字を繰り返します。wasRelesasefor(t)はt[ms]間押し続けて、手を離したタイミングで印字しますのでt[ms]以上押し続けても1回しか印字されません。

まとめ
異なる動きのボタン操作API関数が各種準備されているので、用途にあった動きを容易に実現できそうです。

