Menu
CoddyTech

定时点亮一盏灯

本课属于 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),等待期间再次按下按钮就会被漏掉。

challenge icon

挑战

简单

制作一个楼梯灯:

  • 按下按钮后,立即点亮 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
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器