“开关抖动”:

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

  

代码解读:

 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 }
 

最新文章

  1. The import java.io cannot be resolved
  2. 搜索引擎 ElasticSearch 之 步步为营1 【环境搭建&初识ElasticSearch】
  3. SQL Server 2008 R2[ALTER]列属性修改
  4. MongoDB学习3
  5. 浙大pat 1037
  6. spark Intellij IDEA开发环境搭建
  7. 【CJOJ2316】【模板】可持久化线段树
  8. 彻底删除与安装MySQL
  9. 从零开始学HTTP (一)网络基础
  10. tcp滑动窗口详解(2)
  11. 006_netstat中state详解
  12. Shell脚本编程基础笔记一
  13. Python: packer方式加密js代码之解密函数
  14. ORACLE 导入的问题
  15. 【转】SpringMVC Controller 介绍
  16. Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found
  17. VS注释与取消注释快捷键
  18. linux下怎样用c语言调用shell命令
  19. Delphi中BCD和Currency类型
  20. Unix环境高级编程(二十一)数据库函数库

热门文章

  1. XML、DTD约束
  2. Codeforces Round #565 (Div. 3) C. Lose it! (思维)
  3. Cobalt Strike特征隐藏
  4. Docker网络模式详解
  5. Redis 穿透 & 击穿 & 雪崩
  6. SpringSecurity认证流程
  7. USB2.0协议学习笔记---描述符
  8. Object 循环引用 All In One
  9. random array & shuffle 洗牌算法 / 随机算法
  10. how to stop MongoDB from the command line