Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Arduino環境でコールバック的挙動の実験

可読性をあげたりモダナイズな雰囲気を出す意味で、
Arduino環境でコールバック的挙動が実現できるか試してみました

実際のところ

ターゲットボードはM5stackとします。
ボタンAの押下を確認し、押されたようであれば内部変数をインクリメントして画面を更新する……というサンプルです。

関数型ポインタと構造体を利用して、状態掌握&実行を担当します。

#include <M5Stack.h>

// コールバック関数の型定義
typedef void (*ButtonCallback)();

// ボタンの状態を追跡する構造体
struct ButtonState {
  bool pressed;
  ButtonCallback callback;
};

// ボタンAの状態
ButtonState buttonA = {false, nullptr};

// カウンター変数
int counter = 0;

// ディスプレイ更新関数
void updateDisplay() {
  M5.Lcd.setCursor(0, 100);
  M5.Lcd.printf("Count: %d", counter);
}

// ボタンAが押されたときのコールバック関数
void onButtonAPressed() {
  counter++;
  updateDisplay();
}

// ボタンの状態をチェックし、必要に応じてコールバックを呼び出す
void checkButton(ButtonState& button, bool currentState) {
  if (currentState && !button.pressed) {
    button.pressed = true;
    if (button.callback) {
      button.callback();
    }
  } else if (!currentState && button.pressed) {
    button.pressed = false;
  }
}

void setup() {
  M5.begin();
  M5.Power.begin();
  
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.println("Button A Counter");
  
  // ボタンAのコールバックを設定
  buttonA.callback = onButtonAPressed;
  
  updateDisplay();
}

void loop() {
  M5.update();  // ボタンの状態を更新
  
  // ボタンAの状態をチェック
  checkButton(buttonA, M5.BtnA.isPressed());
  
  delay(100);  // 短い遅延を入れてCPU使用率を下げる
}