消除按钮抖动
本课属于 Coddy Arduino 学习旅程的“输入”单元。第 6 课,共 22 课。
这节课的按钮是真的,起始代码是你在上一节课中制作的计数器。运行它并按一次按钮:计数会增加不止 1。
按钮内部有两个金属触点。它们接触时会弹跳:大约 1 毫秒内,它们接触、弹开,然后再次接触。松开按钮时也会发生同样的情况。loop()会在这 1 毫秒内多次读取引脚,并把每次弹跳都计作一次按下。
解决方法叫作消抖:读数变化时,只处理一次,然后等待大约 20 ms,让触点稳定下来,再次读取。人根本察觉不到 20 ms。
if (reading != lastReading) {
if (reading == LOW) {
presses++;
Serial.println(presses);
}
delay(20);
}
lastReading = reading;每次变化后都要等待,而不只是按下后等待:松开时也会弹跳,松开的过程中每次弹跳看起来都像是一次新的按下。
挑战
中等修复计数器,让每次按下都只计数一次:
- 当
reading与lastReading不同时,如果这是一次按下(LOW),就计数,然后等待 20 毫秒 - 在
loop()末尾继续保存lastReading
按“运行”,按几次按钮并观察计数,然后按“检查”。
亲手试试
const int buttonPin = 2;
int presses = 0;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading == LOW && lastReading == HIGH) {
presses++;
Serial.println(presses);
}
lastReading = reading;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
输入中的所有课
自己练习: Arduino 在线编辑器