Menu
CoddyTech

2つのLED、2つの速度

CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 4/18。

delay()を使うと、異なる速さで点滅する2つのLEDは厄介です。待機するたびに、もう一方のLEDまで待たされます。millis()なら、何も待たないので簡単です。

各処理にそれぞれの変数を用意します。それぞれに前回の時刻と状態を持たせます。次に、各処理に専用のifをloop()内に用意します。ループのたびに、各処理は自分の時計を確認し、時間が来たときだけ動作します。

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の点灯状態を切り替える
  }
}

2つの処理が互いの邪魔をすることはありません。同じ方法で3つ目、4つ目の処理も追加できます。それぞれに変数のセットとifを1つずつ用意します。

2つの処理で同じ前回時刻の変数を共有してはいけません。速い処理が頻繁にその値をリセットするため、遅い処理は間隔に達することがありません。

challenge icon

チャレンジ

簡単

ピン13の赤色LEDはすでに500 msごとに切り替わります。同時に、ピン12の緑色LEDが200 msごとに切り替わるようにしてください:

  • greenPrevious変数とgreenState変数を追加する
  • 緑色LED用に、loop()内に2つ目のifを追加する

Runを押して両方が点滅するのを確認し、それからCheckを押してください。

自分で試してみよう

const int redLed = 13;
const int greenLed = 12;

unsigned long redPrevious = 0;
int redState = LOW;

// ここに緑のLED用の変数を2つ追加する

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プレイグラウンド