Menu
CoddyTech

两个 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。

不要让两项任务共用一个记录上次时间的变量。速度较快的任务会频繁重置它,导致速度较慢的任务永远达不到自己的时间间隔。

challenge icon

挑战

简单

引脚 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 切换一次状态
}
quiz icon自我测试

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

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器