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つの処理で同じ前回時刻の変数を共有してはいけません。速い処理が頻繁にその値をリセットするため、遅い処理は間隔に達することがありません。
チャレンジ
簡単ピン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ごとに切り替わるようにする
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド