【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 }
【Arduino学习笔记04】消抖动的按键切换的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- Arduino学习笔记① 初识Arduino
1.前言 近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- 【Arduino学习笔记05】Arduino数字输入、输出和脉冲宽带调制 -- 小项目:彩色小台灯
基本功能: 长按控制按钮开机,长按控制按钮关机(>3s) 通过三个调节按钮调节灯的颜色,每一个按钮分别对应R,G,B值 模式切换:短按控制按钮切换模式(长亮模式/闪烁模式) 元器件清单: Ard ...
- xml基础学习笔记04
今天继续xml学习,主要是:SimpleXML快速解析文档.xml与数组相互转换 .博客中只是简单的做一个学习记录.积累.更加详细的使用方法,可以查看php手册 1.SimpleXML快速解析文档 前 ...
- OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...
- [Golang学习笔记] 04 程序实体1 变量声明
变量声明: Go语言的程序实体包含:变量.常量.函数.结构体和接口,是一门静态类型的编程语言. (在声明变量或常量的时候,需要指定类型,或者给予足够信息是的Go语言能够推导出类型) Go语言变量的类型 ...
- [原创]java WEB学习笔记04:Servlet 简介及第一个Servlet程序(配置注册servlet,生命周期)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- C++ new delete malloc free
title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...
- Leetcode(257)-二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2->5", ...
- SASS CSS3 koala
CSS with superpowers Sass: Syntactically Awesome Style Sheets http://sass-lang.com/ Sass is the most ...
- Expose Loader & shit jquery
Expose Loader webpack https://github.com/xgqfrms/FEIQA/issues/31#issuecomment-418255126 require(&quo ...
- ODM & mongoose
ODM & mongoose ODM (object data modeling) https://mongoosejs.com/ MongoDB NoSQL xgqfrms 2012-202 ...
- illustrating javascript prototype & prototype chain
illustrating javascript prototype & prototype chain 图解 js 原型和原型链 proto & prototype func; // ...
- shit 环信 IM SDK & IM SDK & web
shit 环信 IM SDK & IM SDK & web 环信 IM SDK, 采坑大全 自己写 UI appkey 是否正确 password 是字符串,不是 数字 HTTPS 是 ...
- Github 获取仓库的releases API
API 文档 example: 这将获取所有的版本 https://api.github.com/repos/januwA/flutter_anime_app/releases 最新版本: https ...
- 关于USDN你想知道的一切
稳定币的发展只有短短几年的时间.稳定币最早起源于 2014 年 Bitfinex 组建的泰德公司发行的 USDT.稳定币是一种具有稳定价值的加密货币.稳定币诞生的背景是加密货币的价格波动巨大,其作为一 ...
- ArrayList的简单实现
class AList<E>{ //属性:数组和实际元素个数 private Object[] data; private int size; //构造函数:有参.无参 public AL ...