Hobby Science&Experiment

愛と工作の日々

趣味でやっている工作や勉強したことのメモ書きです。

ESP32のInterrupt Service Routine(割り込みサブルーチン)でButton counterを作る

ESP32開発ボードとタクトスイッチでボタンカウンターを作ります。ボタンカウンターを使うと一つのボタンで複数の機能を切り替えたりパラメータをデジタルに調節できるので好きです。
Arduinoと同じように割り込みが使用可能なようです。以下サイトのコードをベースにしています。ボタンを二つに増やしています。
https://lastminuteengineers.com/handling-esp32-gpio-interrupts-tutorial/lastminuteengineers.com
D18およびD19ピンがLOWに落ちる瞬間(FALLING)を監視しています。

struct Button {
  const uint8_t PIN;
  uint32_t numberKeyPresses;
  bool pressed;
};

Button button1 = {18, 0, false};
Button button2 = {19, 0, false};

void IRAM_ATTR isr() {
  button1.numberKeyPresses += 1;
  button1.pressed = true;
}

void IRAM_ATTR isr2() {
  button2.numberKeyPresses += 1;
  button2.pressed = true;
}

void setup() {
  Serial.begin(9600);
  pinMode(button1.PIN, INPUT_PULLUP);
  pinMode(button2.PIN, INPUT_PULLUP);
  attachInterrupt(button1.PIN, isr, FALLING);
  attachInterrupt(button2.PIN, isr2, FALLING);

}

void loop() {
  if (button1.pressed) {
      Serial.printf("Button 1 has been pressed %u times\n", button1.numberKeyPresses);
      button1.pressed = false;
  }

  if (button2.pressed) {
      Serial.printf("Button 2 has been pressed %u times\n", button2.numberKeyPresses);
      button2.pressed = false;
  }

}

structを使ったコードを始めて見ましたが、これはこれでエレガントで良いですね!使いこなせるようになりたいです。

動作

タクトスイッチを押してD18,D19ピンがオフになるとそれぞれボタン1,2が押されたと表示されています。一回のプッシュで2~4回程度押されたとカウントするときもあること(これはArduinoでもありました)、ENボタンを押しても正常にプログラムが始まらないことが多いことなどの問題があります。
f:id:tara-chang:20210703231849p:plain
※2021.7.4 追記
スイッチを複数回推したことになってしまう現象はチャタリングと呼ばれる現象のようです。対策が必要ですね。
jumbleat.com