用户工具

站点工具


learing:examples:debounce

Debounce(消抖)

这个例子演示了如何消除输入抖动,也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。

ALPHA MEGA328-U核心

硬件

搭建电路

  1. ALPHA MEGA328-U模块插入并行扩展版1号槽位。
  2. ALPHA 11 LED模块插入1号槽位,堆叠于MEGA328-U上。
  3. ALPHA 微动开关模块插入并行扩展板2号槽位。
  4. USB线连接计算机与ALPHA MEGA328-U。

代码

/* 
 Debounce
 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。
 两次触发之间设置一个最小延时来消除抖动。
 三个按键对应三盏LED灯,各自按键控制对应的LED灯,互不干扰
 */
 
 
const int buttonPin1 = 15;    //初始化按键引脚
const int buttonPin2 = 16; 
const int buttonPin3 = 17; 
const int ledPin1 = 2;      // 初始化LED的引脚
const int ledPin2 = 3;  
const int ledPin3 = 4;  
 
int ledState1 = HIGH;         // 设置LED输出脚状态为高电平
int ledState2 = HIGH; 
int ledState3 = HIGH; 
int buttonState1;             // 设置读取输入脚的状态
int buttonState2;      
int buttonState3;      
int lastButtonState1 = LOW;   // 上一次读取到的输入状态为低电平
int lastButtonState2 = LOW;   // 上一次读取到的输入状态
int lastButtonState3 = LOW;   // 上一次读取到的输入状态
 
 
long lastDebounceTime1 = 0;  // 最后一次输出脚触发时间
long lastDebounceTime2 = 0;
long lastDebounceTime3 = 0;
long debounceDelay = 50;    // 设置消抖时间,增加它,如果输出不稳定
 
void setup() {
  pinMode(buttonPin1, INPUT);   //初始化按键的输入模式
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(ledPin1, OUTPUT);   //初始化灯的输出模式
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
 
 
  digitalWrite(ledPin1, ledState1);// 设置LED状态为高电平
  digitalWrite(ledPin2, ledState2);
  digitalWrite(ledPin3, ledState3);
}
 
void runing1()                    //第一个按键对应第一盏灯
{  
  if ((millis() - lastDebounceTime1) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态
  {        
    if (digitalRead(buttonPin1) != buttonState1)   // 如果按键状态改变:
    {
      buttonState1 = digitalRead(buttonPin1); // 新的按键状态为high才会触发LED
      if (buttonState1 == HIGH)                 //如果按键状态为高时,
      {
        ledState1 = !ledState1;            //改变对应的灯的电平
      }
    }
  }
  digitalWrite(ledPin1, ledState1); // 输出LED灯的状态
  lastButtonState1 = digitalRead(buttonPin1); // 存储读取到的信息.按键会变成上次的输入状态:
}
 
void runing2()             //第2个按键对应第2盏灯
{  
  if ((millis() - lastDebounceTime2) > debounceDelay) 
  {        
    if (digitalRead(buttonPin2) != buttonState2)  
    {
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH)
      {
        ledState2 = !ledState2;             
      }
    }
  }
  digitalWrite(ledPin2, ledState2); 
  lastButtonState2 = digitalRead(buttonPin2);
}
 
void runing3()                   //第3个按键对应第3盏灯
{ 
  if ((millis() - lastDebounceTime3) > debounceDelay)
  {        
    if (digitalRead(buttonPin3) != buttonState3)  
    {
      buttonState3 = digitalRead(buttonPin3); 
      if (buttonState3 == HIGH)
      {
        ledState3 = !ledState3;
      }
    }
  }
  digitalWrite(ledPin3, ledState3);
  lastButtonState3 = digitalRead(buttonPin3); 
}
void loop() {
  if (digitalRead(buttonPin1)!= lastButtonState1) //读取按键状态,存储到变量  // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
  {
    lastDebounceTime1 = millis(); // 重置消抖时间
  } 
  runing1();   //调用第一个按键的函数
  if (digitalRead(buttonPin2)!= lastButtonState2) //读取按键状态,存储到变量  // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
  {
    lastDebounceTime1 = millis(); // 重置消抖时间
  } 
  runing2();    //调用第二个按键的函数
 
  if (digitalRead(buttonPin3)!= lastButtonState3) //读取按键状态,存储到变量  // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
  {
    lastDebounceTime1 = millis(); // 重置消抖时间
  } 
  runing3();   //调用第三个按键的函数
}

ALPHA 8F328D-U核心

硬件

搭建电路

代码

MangoII

硬件要求

  • OCROBOT控制器
  • 按键或开关
  • 10K欧姆电阻
  • 面包板
  • 导线

代码

这里,按下按键返回HIGH,不按返回LOW

/* 
 Debounce
每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。两次触发之间设置一个最小延时来消除抖动。
* 13号脚的LED 连到GND
* 按键连接到 2 号脚到+5V
* 10K 电阻连到 2号脚到GND
* Note:部分控制器有一个LED连接到了13号脚
*/
 
const int buttonPin = 2;    // 按键引脚
const int ledPin = 13;      // LED
 
int ledState = HIGH;         // 输出脚状态
int buttonState;             // 读取输入脚
int lastButtonState = LOW;   // 上一次读取到的输入状态
 
long lastDebounceTime = 0;  // 最后一次输出脚触发时间
long debounceDelay = 50;    // 消抖时间,增加它,如果输出不稳定
 
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
 
  digitalWrite(ledPin, ledState); // 设置LED状态
}
 
void loop() {
   int reading = digitalRead(buttonPin); //读取按键状态,存储到变量 
                           // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)
                                        // 如果按键状态改变,那就是按下了或者是噪声
  if (reading != lastButtonState) 
  { lastDebounceTime = millis(); // 重置消抖时间
  } 
   if ((millis() - lastDebounceTime) > debounceDelay)  // 不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态
    {                                                   // 如果按键状态改变:
     if (reading != buttonState)
      { buttonState = reading;// 新的按键状态为high才会触发LED
     if (buttonState == HIGH) 
       {ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState); // 设置LED:
  lastButtonState = reading;  // 存储读取到的信息.后面会变成上次的输入状态:
}
learing/examples/debounce.txt · 最后更改: 2017/10/05 03:27 由 弘毅