两个 LED,两种速度
本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 4 课,共 18 课。
使用 delay() 时,让两个 LED 以不同速度闪烁会很麻烦:每次等待都会让另一个 LED 也停下来。使用 millis() 就很简单,因为不需要等待。
为每项任务分别设置变量:各自记录上次的时间和自身的状态。然后在 loop() 中为每项任务分别设置一个 if。每次循环时,各项任务都会检查自己的时钟,只在时间到时才执行操作:
unsigned long redPrevious = 0;
unsigned long greenPrevious = 0;
void loop() {
unsigned long now = millis();
if (now - redPrevious >= 500) {
redPrevious = now;
// 切换红色 LED 的状态
}
if (now - greenPrevious >= 200) {
greenPrevious = now;
// 切换绿色 LED 的状态
}
}这两项任务互不干扰。你也可以用同样的方法添加第三项和第四项任务:每项任务各用一组变量和一个 if。
不要让两项任务共用一个记录上次时间的变量。速度较快的任务会频繁重置它,导致速度较慢的任务永远达不到自己的时间间隔。
挑战
简单引脚 13 上的红色 LED 已经每 500 ms 切换一次。让引脚 12 上的绿色 LED 同时每 200 ms 切换一次:
- 添加
greenPrevious和greenState变量 - 在
loop()中为绿色 LED 添加第二个if
按“运行”并观察两个 LED 闪烁,然后按“检查”。
亲手试试
const int redLed = 13;
const int greenLed = 12;
unsigned long redPrevious = 0;
int redState = LOW;
// 在这里添加绿色 LED 的两个变量
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
// 红色 LED 每隔 500 ms 切换一次状态
if (now - redPrevious >= 500) {
redPrevious = now;
if (redState == LOW) {
redState = HIGH;
} else {
redState = LOW;
}
digitalWrite(redLed, redState);
}
// 在这里让绿色 LED 每隔 200 ms 切换一次状态
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无需 delay 的计时中的所有课
自己练习: Arduino 在线编辑器