Button2库isPressed()返回值反转?Teensy 4.1按键功能异常
问题根源
Button2库默认采用ACTIVE_HIGH触发逻辑:即把引脚高电平视为按键释放,低电平视为按键按下。但你的按键用了下拉接线,空闲时引脚为低电平,按下时为高电平,这和库的默认逻辑完全相反,导致isPressed()返回值反转,同时状态机逻辑混乱,引发长按、双击误判。
解决方案
在初始化Button2对象时,显式指定ACTIVE_LOW(即LOW)作为触发电平,告诉库:
- 引脚低电平 = 按键空闲(
isPressed()返回0) - 引脚高电平 = 按键按下(
isPressed()返回1)
修改后的测试代码
#include <Button2.h> #define BTN1_PIN 2 #define BTN2_PIN 3 // 构造函数传入LOW,指定ACTIVE_LOW触发逻辑 Button2 btn1(BTN1_PIN, LOW); Button2 btn2(BTN2_PIN, LOW); void setup() { Serial.begin(115200); while(!Serial); // 外接下拉电阻时用INPUT即可;若用内部下拉,改为INPUT_PULLDOWN btn1.begin(INPUT); btn2.begin(INPUT); // 绑定按键事件回调 btn1.setLongClickHandler(onLongClick); btn1.setDoubleClickHandler(onDoubleClick); btn2.setLongClickHandler(onLongClick); btn2.setDoubleClickHandler(onDoubleClick); } void loop() { btn1.loop(); btn2.loop(); // 打印状态用于验证 Serial.print("Btn1 isPressed: "); Serial.print(btn1.isPressed()); Serial.print(" | digitalRead: "); Serial.println(digitalRead(BTN1_PIN)); delay(100); } void onLongClick(Button2& btn) { Serial.print("Long click detected on pin "); Serial.println(btn.getPin()); } void onDoubleClick(Button2& btn) { Serial.print("Double click detected on pin "); Serial.println(btn.getPin()); }
关键说明
- 触发电平匹配:通过构造函数的第二个参数
LOW,让库的状态机和你的下拉接线逻辑对齐,彻底解决isPressed()返回值反转问题。 - 引脚模式选择:
- 外接下拉电阻时,用
INPUT模式即可; - 若改用Teensy内部下拉电阻,将
begin()的参数改为INPUT_PULLDOWN,同时保持activeLevel为LOW。
- 外接下拉电阻时,用
- 事件逻辑修复:修正触发电平后,库的状态机能正确识别按键按下、释放、长按、双击的时序,不会再出现首次按下误判为长按的异常。
内容的提问来源于stack exchange,提问作者L. Merbecks
相关产品推荐
相关产品推荐

