基础入门
第 8 课·视频:按钮
按钮怎么接、怎么读,以及为什么按一下会"跳"好几下
按钮是最简单的输入设备——按下去,或者没按下去,没有中间状态。
但它是"意外最多"的一个。你按一下,程序可能认为你按了七八下。这段视频讲的就是这件事。
看的时候注意三件事
第一,注意按钮模块上印的字。
VCC、OUT、GND 三个针脚。OUT 就是信号线,接任意一个 GPIO;VCC 接 3.3V,GND 接 GND。
第二,注意程序里那个"一直重复检查"。
读按钮不能只读一次——你得不停地问:"现在按着吗?现在按着吗?"这就是为什么读按钮的积木要放在循环里。
第三,注意那个数字在跳。
视频里你会看到,按下按钮的时候,读到的值不是干净利落的 0 和 1,而是在飞快地跳。这就是"抖动",也是这个模块最值得讲的地方。
抖动是怎么回事
按钮里面是两片金属。你按下去的时候,它们不是"啪"一下就贴合的——中间会有几毫秒,两片金属在不停地碰、分开、碰、分开。
这个时间很短,短到你手感觉不到。但板子的反应有多快?ESP32-C3 一秒钟能查上百万次。
结果就是:你按了一下,程序先后读到了几十次"通了",中间还夹着几次"断了"。
对策叫消抖——读到变化之后,等一小会儿(几毫秒)再确认一次。视频里用的就是这个办法。
有意思的是:有些时候你不需要消抖。 比如做"按一下开灯、再按一下关灯",抖动的几十次里你只响应第一次,后面的忽略掉就行了。什么时候要消抖、什么时候不用,取决于你的程序在"计数"还是在"切换状态"。
自测
OUT)应该接到哪里?答案与解析
OUT 是信号输出,接哪个 GPIO 都行,代码里写对应的引脚号就好。电源是固定的:VCC 接 3.3V,GND 接地。
答案与解析
抖动是机械结构造成的,不是坏了、也不是代码错。任何机械开关都有这个问题,只是快到你感觉不到。代码能做的是"忽略"它,而不是"消除"它。
答题要点
答题要点应该包含:当程序只关心"状态切换"而不是"按了几次"时,可以不用消抖。比如"按一下开灯、再按一下关灯"——抖动产生的几十次信号,你只响应第一次状态变化,后面的因为状态已经变了会被忽略。反过来,如果要计数(按一次加一分),抖动就会让分数乱涨,必须消抖。
拓展ESP32 有没有办法在硬件层面解决抖动?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"硬件消抖 RC 电路"、"GPIO 内部上拉"。想一想:如果电路上就滤掉了抖动,代码是不是就能省事?
拓展为什么按钮模块上已经有电阻了,代码里还要设置"上拉输入"?
这个问题课上不讲,留给你自己找答案——**问 AI 是最好的办法**。
提示:搜"上拉电阻 作用 悬空"、"浮空输入 危害"。搞清楚"悬空"是什么状态,你就明白为什么引脚不能不管。
本节你要动手做的事
- [ ] 接好按钮:
VCC→3.3V,GND→GND,OUT→ 任意 GPIO - [ ] 跑一遍视频里的程序,亲眼看见那个数字在跳
- [ ] 试试把消抖的等待时间改长改短,看有什么不同
- [ ] 做完自测题