按下按钮切换闪烁
本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 5 课,共 18 课。
一个从不等待的草图可以同时监测按钮并运行闪烁程序。每次循环只需几微秒,因此开发板每秒会检查按钮数千次,即使是很短的轻触也能检测到。
闪烁程序使用 millis() 模式。按钮检测使用“输入”单元中的边沿检查:如果按钮此刻被按下,而在上一次循环中没有被按下,就执行操作。! 表示“非”,所以 !wasPressed 的意思是“之前没有按下”。
bool wasPressed = false;
void loop() {
// 闪烁逻辑:if (now - previous >= 500) { ... }
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// 按钮刚被按下
}
wasPressed = pressed;
}把这两部分都放进 loop(),依次执行,并且不要在其中任何一部分使用 delay()。如果闪烁程序等待 500 ms,那么在等待期间开始并结束的轻触就永远不会被检测到。
挑战
中等让电路板同时完成两件事:
- 红色 LED(引脚 13)每隔 500 ms 切换一次状态,使用
millis()计时 - 每按一次按钮,黄色 LED(引脚 12)就切换一次状态:亮起,然后熄灭,再亮起
随时快速点按都必须有效,按住按钮时,黄色 LED 只切换一次。点击运行,点按按钮,然后点击检查。
亲手试试
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// 1. 使用 millis() 每隔 500 ms 切换一次红色 LED 的状态
// 2. 每按一次按钮,就切换一次黄色 LED 的开关状态
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无需 delay 的计时中的所有课
自己练习: Arduino 在线编辑器