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

先上电路图:

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

再上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 <Bounce2.h>
#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);


 
}

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

第三种方法:硬件消抖
 

代码和原始的代码一样(未添加任何消抖代码)。
电路图如下:
Arduino 按钮传感器常见的几种消抖方法
唯一的区别是:添加上了一个陶瓷电容(100nf),和下拉电阻并联,利用电容的快速充放电特性来过滤掉按钮的抖动(100nf是测试得来的数值,小伙伴门可以自己尝试)。
优点:不需要更改代码,简单快捷
缺点:增加额外原件
 

欢迎大家留言评论。