【Arduino学习笔记04】消抖动的按键切换

 “开关抖动”:

  由于按键是基于弹簧-阻尼系统的机械部件,所以当按下一个按键时,读到的信号并不是从低到高,而是在高低电平之间跳动几毫秒之后才最终稳定。

  

 

 

 

代码解读:

 1 const int LED = 9;
 2 const int BUTTON = 2;
 3 boolean lastButton = LOW;
 4 boolean currentButton = HIGH;
 5 boolean ledOn = false;
 6 
 7 // The setup() function runs once each time the micro-controller starts
 8 void setup()
 9 {
10     pinMode(LED, OUTPUT);
11     pinMode(LED, INPUT);
12 }
13 
14 /*
15  * 消抖动函数:传入前一个按键状态,返回当前消抖动的按键状态
16  * - 这里所谓的消抖动,实际上就是如果检测到电压变化后先不操作,因为可能是抖动阶段的
17  * 电压改变,等5m之后(等电平稳定下来)再读取当前值,避开抖动阶段。
18  * - 如果没有使用消抖动函数,在抖动的过程中电压多次变化,会得到很多次“按钮按下”的
19  * 结论,从而造成短时间内频繁的开灯关灯。
20 */
21 boolean debounce(boolean last) {
22     boolean current = digitalRead(BUTTON);
23     if (last != current) {
24         // 如果电压改变了,说明肯定按下按钮了,否则电压值是不会改变的。
25         // 但是这个电压改变是不是抖动阶段的电压改变是不知道的,所以要等5ms(避开抖动
26         // 阶段)再读取一次,第二次读取的就是稳定后的值可以直接返回了。
27         delay(5);
28         current = digitalRead(BUTTON);
29     }
30     // 如果电压没有改变,不能判断是否按下按钮,直接返回,等待下一轮对引脚状态的查询
31     return current;
32 }
33 
35 void loop()
36 {
37     currentButton = debounce(lastButton);
38     // 如果不用消抖动函数读取引脚值, 这一句应该是currentButton = digitalRead(BUTTON),后面的逻辑都不变
39 
40     if (lastButton == LOW && currentButton == HIGH) {
41         // 如果lastButton == LOW && currentButton = HIGH,则认为按钮按下了,因此要改变led灯的状态
42         ledOn = !ledOn;
43     }
44     lastButton = currentButton;
45 
46     digitalWrite(LED, ledOn);
47 }
 
posted @ 2020-09-07 20:31  zhuyuxi333  阅读(1781)  评论(0)    收藏  举报