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

96
Arduino爱好者
0.2 2017.05.26 22:57* 字数 929

先上电路图:

图片发自简书App

再上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);

}

不一样的地方已经使用红色文字,该种方法的消抖是最接近于完美的消抖方法。

第三种方法:硬件消抖

代码和原始的代码一样(未添加任何消抖代码)。

电路图如下:

图片发自简书App

唯一的区别是:添加上了一个陶瓷电容(100nf),和下拉电阻并联,利用电容的快速充放电特性来过滤掉按钮的抖动(100nf是测试得来的数值,小伙伴门可以自己尝试)。

优点:不需要更改代码,简单快捷

缺点:增加额外元件

arduino笔记
Web note ad 1