2ステップでM5StickCのボタン反応の検出感度向上を目指します
1 はじめに
ボタン状態更新はM5.updateをコールして行います
しかし、M5.updateのコールをloopタスクでポーリングで行うと、
ポーリング周期によっては状態変化を取りこぼすことがありました
そこで、ボタン状態変化を割り込みで検知し、割り込みからM5.updateをコールするようにしました
取りこぼしが気持ち減った気がするけど
本当に減ったのかな???
2 準備
ステップ1 割り込み登録
setupに下記を追加します
attachInterrupt(digitalPinToInterrupt(buttonA_GPIO), buttonA_isr, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonB_GPIO), buttonB_isr, CHANGE);
パラメータ | 条件 |
---|---|
LOW | ピンがLOWのとき発生 |
CHANGE | ピンが変化したときに発生 |
RISING | ピンがLOWからHIGHに変わったときに発生 |
FALLING | ピンがHIGHからLOWに変わったときに発生 |
ステップ2 割り込みハンドラ実装
static void buttonA_isr(void) {
M5.update();
Serial.printf("A interrupt %d\n", millis() );
}
static void buttonB_isr(void) {
M5.update();
Serial.printf("B interrupt %d\n", millis() );
}
準備完了です
3 コード全体
#include <M5StickC.h>
#include <LovyanGFX.hpp>
static LGFX lcd;
// button gpio number
const uint8_t buttonA_GPIO = 37;
const uint8_t buttonB_GPIO = 39;
static void buttonA_isr(void) {
M5.update();
Serial.printf("%d A interrupt\n", millis() );
}
static void buttonB_isr(void) {
M5.update();
Serial.printf("%d B interrupt\n", millis() );
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// Initialize the M5Stack object
M5.begin();
lcd.init(); // 初期化
// START
lcd.fillScreen(BLACK);
lcd.setCursor(10, 10);
lcd.setTextColor(WHITE);
lcd.setTextSize(1);
lcd.printf("START");
attachInterrupt(digitalPinToInterrupt(buttonA_GPIO), buttonA_isr, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonB_GPIO), buttonB_isr, CHANGE);
}
void loop() {
// put your main code here, to run repeatedly:
if(M5.BtnA.wasPressed() != 0 ) {
Serial.printf("%d was pressA\n", millis());
lcd.println("was pressA");
delay(10);
}
if(M5.BtnA.isPressed() != 0 ) {
Serial.printf("%d is pressA\n", millis());
lcd.println("is pressA");
delay(10);
}
if(M5.BtnB.wasPressed() != 0 ) {
Serial.printf("%d was pressB\n", millis() );
lcd.println("was pressB");
delay(10);
}
if(M5.BtnB.isPressed() != 0 ) {
Serial.printf("%d is pressB\n", millis() );
lcd.println("is pressB");
delay(10);
}
}
4.結果
実験でボタンを連打しても検出もれをしなくなった
良かった
18797 A interrupt
18803 was pressA
18903 is pressA
18967 A interrupt
23147 B interrupt
23153 was pressB
23263 is pressB
23294 B interrupt