Arduino按钮消抖

本文参考这位大佬文章
有两种按钮消抖的方法,怎么使用看自己

普通按钮代码:

int BUTTON = 8;//定义按钮在 12号引脚,连接一个下拉电阻
int val = 0;//变量val 存储按钮的状态
int old_val = 0;//暂存val变量的上一个时间状态

void setup(){
	pinMode(BUTTON, INPUT_PULLUP);//INPUT —— 输入模式  OUTPUT —— 输出模式  INPUT_PULLUP —— 输入上拉模式
	Serial.begin(9600);//用于串口输出
}
void loop(){
	val = digitalRead(BUTTON);//读取输入数值并且存储
	if((val==HIGH)&&(old_val==LOW))//检查按钮的变化情况
	{
		Serial.println("Input");
	}
	old_val=val;//存旧值
}

上传代码后运行,按钮在被按下抬起时,有很大的几率重复打印“Input”消息。这是由于机械结构所造成的抖动,而需求就是消除这个抖动。

方法一:

int BUTTON = 8;//定义按钮在 12号引脚,连接一个下拉电阻
int val = 0;//变量val 存储按钮的状态
int old_val = 0;//暂存val变量的上一个时间状态

void setup(){
	pinMode(BUTTON, INPUT_PULLUP);//INPUT —— 输入模式  OUTPUT —— 输出模式  INPUT_PULLUP —— 输入上拉模式
	Serial.begin(9600);//用于串口输出
}
void loop(){
	val = digitalRead(BUTTON);//读取输入数值并且存储
	if((val==HIGH)&&(old_val==LOW))//检查按钮的变化情况
	{
		Serial.println("Input");
		delay(20);//只添加了这一行
	}
	old_val=val;//存旧值
}

添加了一个延时函数,这个函数时间可以自定义。上传代码后运行,一开始按下按钮运行正常,在测试十几次后会发现有几率按下按钮后没有打印值,或是重复打印的情况。这个方法较为简单,但显然不是最优解。

方法二:使用Bounce2库
在Arduino IDE下,选择“工具——加载库——管理库”,找到Bounce2,下载安装即可在这里插入图片描述
库的示例程序中有Bounce_Button的案例,可以参考。我的代码是参考之前那位大佬的。

#include <Bounce2.h>

int BUTTON_PIN = 8;//按钮连接的针脚
Bounce2::Button button = Bounce2::Button();//实例化一个抖动对象

int ledState = LOW;

void setup() {
  pinMode(7, OUTPUT);
  digitalWrite(7, mp3_control);

  button.attach( BUTTON_PIN, INPUT_PULLUP);
  button.interval(5);//间隔是5ms

  Serial.begin(9600);//用于串口输出
}

void loop() {
  button.update();//更新

  if ( button.pressed() ) {
    ledState = !ledState ;
    digitalWrite(7, ledState );
    Serial.println(ledState );
  }
}

这个方法在测试了几十次的情况下没有发现抖动重复打印的情况,算是一种完美的消抖方法。

还有一种方法个人没有试过,就是接一个电容,利用电容快速充放电的特性过滤按钮的抖动,感兴趣的可以自己测试。

  • 7
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个Arduino按键消抖的例子: ```cpp #include "flexbuttondebounce.h" TFlexButtonDebounce fbd1(4, LOW); // 生成一个消抖按键实例1,使用4pin口,低电平触发。 TFlexButtonDebounce fbd2(3, HIGH, 50); // 生成另一个消抖按键实例2,使用3pin口,高电平触发,按键超50纳秒才确认,注:默认是20纳秒的。 int st, kt; void setup() { st = 0; kt = 0; pinMode(9, OUTPUT); pinMode(8, OUTPUT); } void loop() { if (fbd1.isTriggered()) { // 检查按键1是否触发。 st = 1 - st; } if (st == 1) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } if (fbd2.isTriggered()) { // 检查按键2是否触发。 kt = 1 - kt; } if (kt == 1) { digitalWrite(8, HIGH); } else { digitalWrite(8, LOW); } } ``` 这个例子使用了一个名为`flexbuttondebounce.h`的类库来实现按键消抖。通过声明并调用`TFlexButtonDebounce`类的实例,可以轻松实现按键消抖的效果。在`setup()`函数中,我们初始化了按键和LED的引脚。在`loop()`函数中,我们使用`isTriggered()`函数来检测按键是否被触发,并根据触发状态来控制LED的亮灭。这样可以避免按键抖动导致的误触发问题。 #### 引用[.reference_title] - *1* *2* [也谈Arduino按键消抖问题](https://blog.csdn.net/flexitime/article/details/89843439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [arduino学习笔记6 - 按键实验](https://blog.csdn.net/weixin_39611161/article/details/111746461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值