
Arduino入門
CoreMatrix のボタン入力関連 API とサンプルプログラムです。
M5.update() 関数を含めて状態更新を読み取り、できるだけブロッキングを減らしてください。そうしないと、ボタン状態の変化を適切なタイミングで取得できない可能性があります。3.3.10-aM5CoreMatrix0.2.290.2.36KEY1、KEY2、KEY3 はそれぞれ M5PM1 の G0、G1、G2 に接続され、プルアップ抵抗を介して 3V3_L1 に接続されています。押下時は Low になります。M5Unified は 3 つのボタンを M5.BtnA、M5.BtnB、M5.BtnC にマッピングします。
#include <M5Unified.h>
static void drawButtons(const bool pressed[3])
{
M5.Display.startWrite();
M5.Display.fillScreen(TFT_BLACK);
for (int i = 0; i < 3; ++i) {
const int x = 1 + i * 5;
M5.Display.drawRect(x, 3, 4, 10, TFT_WHITE);
if (pressed[i]) {
M5.Display.fillRect(x + 1, 4, 2, 8, TFT_WHITE);
}
}
M5.Display.endWrite();
M5.Display.display();
}
void setup()
{
auto cfg = M5.config();
cfg.serial_baudrate = 115200;
M5.begin(cfg);
M5.Display.setColorDepth(8);
M5.Display.setRotation(1);
M5.Display.setBrightness(128);
const bool pressed[3] = {false, false, false};
drawButtons(pressed);
}
void loop()
{
M5.update();
const bool pressed[3] = {
M5.BtnA.isPressed(),
M5.BtnB.isPressed(),
M5.BtnC.isPressed(),
};
static bool lastPressed[3] = {false, false, false};
bool changed = false;
for (int i = 0; i < 3; ++i) {
if (pressed[i] != lastPressed[i]) {
changed = true;
lastPressed[i] = pressed[i];
}
}
if (changed) {
drawButtons(pressed);
}
if (M5.BtnA.wasPressed()) Serial.println("KEY1 pressed");
if (M5.BtnB.wasPressed()) Serial.println("KEY2 pressed");
if (M5.BtnC.wasPressed()) Serial.println("KEY3 pressed");
if (M5.BtnA.wasClicked()) Serial.println("KEY1 clicked");
if (M5.BtnB.wasClicked()) Serial.println("KEY2 clicked");
if (M5.BtnC.wasClicked()) Serial.println("KEY3 clicked");
delay(10);
}ドットマトリクスには KEY1、KEY2、KEY3 に対応する 3 つの空心(中抜き)四角形が表示されます。キーを押している間は対応する四角形が塗りつぶされ、シリアルモニターには押下イベントとクリックイベントが出力されます。
CoreMatrix のボタン部分では、M5Unified ライブラリの Button_Class を使用しています。ボタン関連 API の詳細は以下のドキュメントを参照してください。