本次选的板子一共有3个按钮分别是D0 D1 D2 .另外选了一个m5的dual button 有2个按钮 blue red我们使用Arduino进行本次开发.获取按钮状态其实使用digitalRead就读取对应gpio的输入进行读取.根据按钮的电路不同可以分为上拉输入和下拉输入分别对应按下状态Low 和Hight
先看效果
手搓系列
首先定义我们的key pin信息
#define D0_BUTTON_PIN 0 #define D1_BUTTON_PIN 1 #define D2_BUTTON_PIN 2 #define RED_BUTTON_PIN 15 #define BLUE_BUTTON_PIN 16
在定义按钮相关的状态
// 初始化按钮列表 Button buttons[] = { { D0_BUTTON_PIN, LOW, 0, DEBOUNCE_DELAY, false, HIGH }, // D0 按钮(默认上拉,按下时为 LOW) { D1_BUTTON_PIN, HIGH, 0, DEBOUNCE_DELAY, false, LOW }, // D1 按钮(默认下拉,按下时为 HIGH) { D2_BUTTON_PIN, HIGH, 0, DEBOUNCE_DELAY, false, LOW }, // D2 按钮(默认下拉,按下时为 HIGH) { GREEN_BUTTON_PIN, LOW, 0, DEBOUNCE_DELAY, false, HIGH }, // GREEN 按钮(默认上拉,按下时为 LOW) { RED_BUTTON_PIN, LOW, 0, DEBOUNCE_DELAY, false, HIGH } // RED 按钮(默认上拉,按下时为 LOW) };
定义检测函数
// 防抖检测函数 bool isButtonPressed(Button &button) { unsigned long currentTime = millis(); bool currentState = digitalRead(button.pin); // 检测状态变化(上次状态与当前状态不同) if (currentState != button.lastState) { button.lastPressTime = currentTime; // 状态变化时更新时间戳 } // 防抖时间内状态稳定,且状态为有效按下 if ((currentTime - button.lastPressTime) > button.debounceDelay && currentState == button.activeState) { // 检测到按钮按下时,防止重复触发 if (!button.pressed) { button.pressed = true; // 标记为已按下 button.lastState = currentState; return true; // 返回按下事件 } } else { button.pressed = false; // 状态恢复 } button.lastState = currentState; return false; }
使用按钮
// D0 按钮功能:切换曝光模式 if (isButtonPressed(buttons[0])) { Serial.println("D0 button pressed"); switch (exposureMode) { case AUTO: exposureMode = APERTURE; break; case APERTURE: exposureMode = SHUTTER; break; case SHUTTER: exposureMode = AUTO; break; } } // D1 按钮功能:切换炫彩模式 if (isButtonPressed(buttons[1])) { Serial.println("D1 button pressed"); ledRainbowToggle(); } // D2 按钮功能:闪屏并拍摄 if (isButtonPressed(buttons[2])) { Serial.println("D2 button pressed"); flashScreen(); shutter(); } // GREEN 按钮功能:LED 开关 if (isButtonPressed(buttons[3])) { Serial.println("GREEN button pressed"); ledToggle(); } // RED 按钮功能:闪屏并拍摄 if (isButtonPressed(buttons[4])) { Serial.println("RED button pressed"); flashScreen(); shutter(); }
借助onebutton 简化和完善我们对按钮的处理
//引入库 #include <OneButton.h> // 声明按钮 OneButton _button_d0; OneButton _button_d1; OneButton _button_d2; OneButton _button_red; OneButton _button_blue; //初始化配置 _button_d0.setup(D0_BUTTON_PIN, INPUT_PULLUP, true); _button_d1.setup(D1_BUTTON_PIN, INPUT_PULLDOWN, false); _button_d2.setup(D2_BUTTON_PIN, INPUT_PULLDOWN, false); _button_red.setup(RED_BUTTON_PIN, INPUT_PULLUP, true); _button_blue.setup(BLUE_BUTTON_PIN, INPUT_PULLUP, true); //绑定事件 _button_d0.attachClick([]() { Serial.println("Button D0 clicked!"); }); _button_d1.attachClick([]() { Serial.println("Button D1 clicked!"); }); _button_d2.attachClick([]() { Serial.println("Button D2 clicked!"); }); _button_red.attachClick([]() { Serial.println("Button Red clicked!"); }); _button_blue.attachClick([]() { Serial.println("Button Green clicked!"); }); //定义tickauto tick_all_buttons = [&]() { _button_d0.tick(); _button_d1.tick(); _button_d2.tick(); _button_red.tick(); _button_blue.tick(); }; //在loop部分掉用tick tick_all_buttons();