先上电路图:

再上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是测试得来的数值,小伙伴门可以自己尝试)。
优点:不需要更改代码,简单快捷
缺点:增加额外元件
原文地址:http://www.toutiao.com/a6424569424628105473/ |