可読性をあげたりモダナイズな雰囲気を出す意味で、
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使用率を下げる }