Arduino 不用 delay() 让两个 LED 以不同频率闪烁
所需元件
- Arduino UNO × 1
- 5 mm 红色 LED × 2
- 面包板及跳线若干
项目简介
很多初学者想让两个 LED 以不同频率闪烁,第一反应是用 delay()。但 delay() 会阻塞整个程序,一旦频率不成整数倍(如 1000 ms 和 300 ms),就极难甚至无法实现。
解决办法是放弃 delay(),改用 millis() 非阻塞计时。Arduino IDE 自带的 BlinkWithoutDelay 示例演示了单个 LED 的做法,我们只需复制这套逻辑,给第二个 LED 设置独立的时间变量和间隔即可。
核心代码
const int ledPin = LED_BUILTIN; // 内置 LED
const int ledPin2 = 12; // 外接 LED
int ledState = LOW;
int ledState2 = LOW;
unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;
const long interval = 1000; // 1 秒
const long interval2 = 300; // 300 毫秒
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
// LED 1:1 秒翻转一次
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(ledPin, ledState);
}
// LED 2:300 毫秒翻转一次
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
ledState2 = (ledState2 == LOW) ? HIGH : LOW;
digitalWrite(ledPin2, ledState2);
}
}
接线图
内置 LED 无需接线。外接 LED 长脚接 D12,短脚串联 220 Ω 电阻后接 GND。
要点总结
- 每个 LED 维护自己的
previousMillis和interval。 loop()中只做“当前时间 - 上次翻转时间 ≥ 间隔”判断,不阻塞。- 可轻松扩展到任意数量、任意频率的 LED 或其他周期性任务。
制造工艺