按键软件“消抖”处理

1. 说明:

最为常用的消抖方式就是通过软件消抖,该方法广泛应用于单片机硬件电路设计中,其基本的原理就是延时消抖,当按键的一刹那,并不让CPU立即处理指令,而是等待一个时间间隔,让按键信号稳定下来。这里我不对具体程序进行介绍,而是给出Arduino中专门处理按键的一个库文件实现按键的“消抖”。该库文件为Bounce2.h,之前的版本是Bounce1,Bounce2是其改进版,二者在使用上有所不同,这里我介绍如何在Arduino在中通过调用Bounce2.h库文件制作一个完美的按键,:

需要说明的是这个库文件并不是Arduino自带的,需要去网站上进行下载,然后将其解压到Arduino安装文件夹下的libraries文件夹下即可

官方网址为:www.arduino.cc/playground/Code/Bounce

下载地址:https://github.com/thomasfredericks/Bounce2

2. Bounce2库函数说明:

  • attach()
    void Bounce :: attach(INT pin,INT mode)
    连接到引脚并设置该引脚的模式(INPUT,INPUT_PULLUP或OUTPUT)。
    参数
    pin:INT 要被去抖动的引脚。
    mode: 有效的Arduino引脚模式(INPUT,INPUT_PULLUP或OUTPUT)。
    返回
    如果事件读取成功则为True,否则为false。
  • attach()
    void Bounce :: attach(INT pin)
    连接到高级用户的引脚。一旦您事先进行了设置,只能以这种方式连接引脚。否则使用attach(int pin,int mode)。
  • duration()
    unsigned long Bounce :: duration ( )
    返回当前状态的持续时间(以毫秒为单位)。
    一旦引脚上升(rose())或下降(fell()),则复位为0 。
    返回
    当前状态的持续时间(毫秒(无符号长整数))。
  • interval()
    void Bounce :: interval(uint16_t interval_millis)
    设置去抖间隔(以毫秒为单位)。
    参数
    interval_millis 间隔时间(以毫秒为单位)。
  • read()
    bool Bounce::read()
    返回引脚的状态(HIGH或LOW)。
    返回
    高或低。
  • update()
    bool Bounce::update()
    更新引脚的状态。
    因为Bounce不使用中断,所以你必须在读取它之前“更新”对象,并且必须尽可能频繁地完成(这意味着将它包含在你的loop()中)。每个l00p()只调用一次update()。
    返回
    如果引脚改变状态则为真。

DEBOUNCE ALGORITHMS

间隔稳定

默认情况下,Bounce库使用稳定间隔来处理去抖动。这更容易理解,可以消除不必要的噪音。

锁定间隔

通过在“Bounce.h”中定义“#define BOUNCE_LOCK_OUT”,您可以激活替代的去抖动方法。这种方法反应灵敏,但不会消除噪音。

3.3 Bounce2库代码示例

/ This example toggles the debug LED (pin 13) on or off
// when a button on pin 2 is pressed.
// Include the Bounce2 library found here :
// https://github.com/thomasfredericks/Bounce2
#include <Bounce2.h>
#define BUTTON_PIN 2
#define LED_PIN 13
int ledState = LOW;
Bounce debouncer = Bounce(); // Instantiate a Bounce object
void setup() {
  debouncer.attach(BUTTON_PIN,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode
  debouncer.interval(25); // Use a debounce interval of 25 milliseconds
  pinMode(LED_PIN,OUTPUT); // Setup the LED
  digitalWrite(LED_PIN,ledState);
}
void loop() {
   debouncer.update(); // Update the Bounce instance
   if ( debouncer.fell() ) {  // Call code if button transitions from HIGH to LOW
     ledState = !ledState; // Toggle LED state
     digitalWrite(LED_PIN,ledState); // Apply new LED state
   }
}

代码说明Bounce2库消抖原理:

3.1 说明按键防抖(Debounce)

按键在按下时,由于机械和物理特定的原因,经常会产生一些开关变换,而这些变换会让程序误认为是短时间内进行了多次按键。本示例展示了如何对输入信号进行防抖,也就是在一段短时间内进行两次检查来确保按键确实被按下。如果没有防抖的话,按下一次按键会产生很多不可预知的结果。示例代码使用了mills()函数记录按键按下经过的时间。

3.2 代码

以下代码基于Limor Fried的防抖方法,但是逻辑与她的示例相反。她的示例中,按键在闭合时返回低电平LOW,断开时返回高电平HIGH。而在本例中,按键按下时返回高电平,未按下时返回低电平LOW。

/*
 Debounce

 Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
 press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
 a minimum delay between toggles to debounce the circuit (i.e. to ignore
 noise).

 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached from pin 2 to +5V
 * 10K resistor attached from pin 2 to ground

 * Note: On most Arduino boards, there is already an LED on the board
 connected to pin 13, so you don't need any extra components for this example.


 created 21 November 2006
 by David A. Mellis
 modified 30 Aug 2011
 by Limor Fried
 modified 28 Dec 2012
 by Mike Walters

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Debounce
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;
}


版权声明:本文为CSDN博主「acktomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acktomas/article/details/88243070

生成海报
点赞 0

acktomas

我还没有学会写个人说明!

暂无评论

相关推荐