arduino按钮传感器常见的几种消抖方法

先上电路图:

22d100034b78eda98cc0 (81.33 KB, 下载次数: 2)

下载附件

2017-8-3 22:57 上传

 


再上arduino代码:
#define BUTTON 12//定义按钮在 12号引脚,连接一个下拉电阻
int val = 0;//变量val 存储按钮的状态
int old_val = 0;//暂存val变量的上一个时间状态
int state = 0;//打印到串口的数据,按钮每被按下一次,state自增1
void setup(){
pinMode(BUTTON, INPUT);
Serial.begin(9600);//用于串口输出
}
void loop(){
val = digitalRead(BUTTON);//读取输入数值并且存储
if((val==HIGH)&&(old_val==LOW))//检查按钮的变化情况
{
printState();
}
old_val=val;//val现在是旧的了,让我们暂存一下
}
void printState()
{
state++;
Serial.println(state);
}
代码解析:
实现的效果是,当按钮被按下并抬起时,向串口打印一个整数。这个是完全没有添加消抖的原始代码。
上传代码之后,会出现,明明只按了一下按钮,串口却会打印出多个整数。
这便是由于按钮的机械结构所造成的“”抖动”(想了解更详细请参考百度百科)。
“消抖正式开始”
第一种:采用延时函数delay(软件消抖)
电路完全一样,代码如下:
#define BUTTON 12//定义按钮在 12号引脚,连接一个下拉电阻
int val = 0;//变量val 存储按钮的状态
int old_val = 0;//暂存val变量的上一个时间状态
int state = 0;//打印到串口的数据,按钮每被按下一次,state自增1
void setup(){
pinMode(BUTTON, INPUT);
Serial.begin(9600);//用于串口输出
}
void loop(){
val = digitalRead(BUTTON);//读取输入数值并且存储
if((val==HIGH)&&(old_val==LOW))//检查按钮的变化情况
{
printState();
delay(20);//只多了这一行
}
old_val=val;//val现在是旧的了,让我们暂存一下
}
void printState()
{
state++;
Serial.println(state);
}
只添加了一个延时函数,让程序等待一段时间(这里是20ms),等按钮状态稳定之后,再继续执行下面的代码。
优点:简单
缺点:延时函数阻塞了程序的运行,不太完美
第二种:使用Bounce2库(软件消抖)
库下载地址:http://playground.arduino.cc/code/bounce
代码如下:
#include
#define BUTTON 12//按钮连接的针脚
Bounce debouncer = Bounce();//实例化一个抖动对象
int val=0;//变量val存储按钮的状态,因为是下拉电阻,默认是LOW(即0)
int old_val=0;//存储val变量的上一个时间状态
int state=0;//打印到串口的数据,按钮每被按下一次,state自增1
void setup() {
pinMode(BUTTON,INPUT);
debouncer.attach(BUTTON);//将抖动对象绑定到按钮针脚
debouncer.interval(5);//间隔是5ms
Serial.begin(9600);//用于串口输出
}
void loop() {
debouncer.update();//更新
val=debouncer.read();读取输入数值并且存储
if((val==HIGH)&&(old_val==LOW))//检查按钮的变化情况
{
printState();
}
old_val=val;//val现在是旧的了,暂存一下
}
void printState()
{
state++;
Serial.println(state);
}
不一样的地方已经使用红色文字,该种方法的消抖是最接近于完美的消抖方法。
第三种方法:硬件消抖
代码和原始的代码一样(未添加任何消抖代码)。
电路图如下:


唯一的区别是:添加上了一个陶瓷电容(100nf),和下拉电阻并联,利用电容的快速充放电特性来过滤掉按钮的抖动(100nf是测试得来的数值,小伙伴门可以自己尝试)。
优点:不需要更改代码,简单快捷
缺点:增加额外元件

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值