Menu
CoddyTech

按下按钮切换闪烁

本课属于 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,那么在等待期间开始并结束的轻触就永远不会被检测到。

challenge icon

挑战

中等

让电路板同时完成两件事:

  • 红色 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 的开关状态
}
quiz icon自我测试

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

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器