arduino按钮传感器常见的几种消抖方法-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6888|回复: 0

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

[复制链接]
发表于 2017-8-3 22:57 | 显示全部楼层 |阅读模式
先上电路图:

22d100034b78eda98cc0

再上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);
}
不一样的地方已经使用红色文字,该种方法的消抖是最接近于完美的消抖方法。
第三种方法:硬件消抖
代码和原始的代码一样(未添加任何消抖代码)。
电路图如下:

22d40001516cee5317cd

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


原文地址:http://www.toutiao.com/a6424569424628105473/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 01:45 , Processed in 0.074818 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表