定时点亮一盏灯
本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 6 课,共 18 课。
按下楼梯灯的按钮时,灯会亮起,过一会儿会自动熄灭。灯亮着时再按一次,计时就会重新开始。
这需要两项信息:上次按下按钮的时刻,以及灯是否亮着。按下按钮时,用 unsigned long 存储这个时刻:
if (digitalRead(buttonPin) == LOW) {
pressedAt = millis(); // 开始计时(或重新开始计时)
lightOn = true;
digitalWrite(ledPin, HIGH);
}然后,在每次循环中检查已经过了多长时间:
if (lightOn && millis() - pressedAt >= onTime) {
lightOn = false;
digitalWrite(ledPin, LOW);
}这两个部分都不会等待,因此无论何时按下按钮,都能检测到,即使灯已经亮着也是如此。如果按下按钮后使用 delay(2000),等待期间再次按下按钮就会被漏掉。
挑战
简单制作一个楼梯灯:
- 按下按钮后,立即点亮 13 号引脚上的 LED
- 按下按钮 2 秒后,灯会自动熄灭
- 灯亮着时再次按下按钮,会重新计时 2 秒
点击运行,按几次按钮,然后点击检查。
亲手试试
const int ledPin = 13;
const int buttonPin = 2;
const unsigned long onTime = 2000; // 灯保持亮起的时长
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// 按下按钮时:点亮 LED 并记下时间
// 从那时起经过 onTime 后:关闭 LED
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无需 delay 的计时中的所有课
自己练习: Arduino 在线编辑器