最新消息:

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

Arduino 少儿编程 1619浏览 0评论

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

^这是Dreamer_miss第一篇关于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是测试得来的数值,小伙伴门可以自己尝试)。

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

缺点:增加额外原件

 

欢迎大家留言评论。

 

您必须 登录 才能发表评论!