用户工具

站点工具


learing:examples:debounce

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
learing:examples:debounce [2017/10/05 03:27] 弘毅learing:examples:debounce [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +====== Debounce(消抖) ======
  
 +
 +<WRAP left round info 65%>
 +这个例子演示了如何消除输入抖动,也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。
 +</WRAP>
 +
 +<WRAP left round box 100%>
 +===== ALPHA MEGA328-U核心 =====
 +==== 硬件 ====
 +  * [[ocrobot:alpha:parallelexpansion:index|ALPHA 并行扩展板]]
 +  * [[ocrobot:alpha:mega328-u:main|ALPHA MEGA328-U]]
 +  * [[ocrobot:alpha:microswitch:index|ALPHA 微动开关模块]]
 +  * [[ocrobot:alpha:11led:index|ALPHA 11 LED模块]]
 +==== 搭建电路 ====
 +
 +  - ALPHA MEGA328-U模块插入并行扩展版1号槽位。
 +  - ALPHA 11 LED模块插入1号槽位,堆叠于MEGA328-U上。
 +  - ALPHA 微动开关模块插入并行扩展板2号槽位。
 +  - USB线连接计算机与ALPHA MEGA328-U。
 +
 +==== 代码 ====
 +
 +<code cpp>
 +/* 
 + 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();   //调用第三个按键的函数
 +}
 +</code>
 +
 +</WRAP>
 +
 +
 +
 +<WRAP left round box 100%>
 +===== ALPHA 8F328D-U核心 =====
 +==== 硬件 ====
 +
 +==== 搭建电路 ====
 +
 +==== 代码 ====
 +</WRAP>
 +
 +<WRAP left round box 100%>
 +===== MangoII =====
 +
 +==== 硬件要求 ====
 +
 +  * OCROBOT控制器
 +  * 按键或开关
 +  * 10K欧姆电阻
 +  * 面包板
 +  * 导线
 +
 +==== 代码 ====
 +
 +这里,按下按键返回HIGH,不按返回LOW
 +
 +<code cpp>/
 + 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;  // 存储读取到的信息.后面会变成上次的输入状态:
 +}</code>
 +</WRAP>