タイマーで点灯
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 6/18。
階段の照明は、ボタンを押すと点灯し、少し経つと自動的に消灯します。点灯中にもう一度押すと、時間がリセットされます。
そのためには2つの情報が必要です。最後にボタンを押した時刻と、照明が点灯しているかどうかです。ボタンが押されたときに、時刻をunsigned longに保存します。
if (digitalRead(buttonPin) == LOW) {
pressedAt = millis(); // 時間の計測を開始(または再開)する
lightOn = true;
digitalWrite(ledPin, HIGH);
}次に、ループのたびに、どれだけ時間が経過したかを確認します。
if (lightOn && millis() - pressedAt >= onTime) {
lightOn = false;
digitalWrite(ledPin, LOW);
}どちらの処理も待機しないため、照明がすでに点灯している間でも、いつボタンを押しても検知されます。ボタンを押した後にdelay(2000)を使うと、待機中にもう一度押しても、その入力は見逃されてしまいます。
チャレンジ
簡単階段用の照明を作りましょう。
- ボタンを押すと、13番ピンのLEDがすぐに点灯します
- ボタンを押してから2秒後に、自動的に消灯します
- 点灯中にボタンを押すと、2秒のカウントが再スタートします
Runを押し、ボタンを数回押してから、Checkを押してください。
自分で試してみよう
const int ledPin = 13;
const int buttonPin = 2;
const unsigned long onTime = 2000; // ライトが点灯している時間
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// ボタンが押されたら:LEDを点灯し、その時刻を記録する
// その時刻からonTimeが経過したら:LEDを消灯する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド