ボタンで切り替えながら点滅
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 5/18。
決して待機しないスケッチなら、ボタンを監視しながら同時に点滅処理を実行できます。ループは数マイクロ秒で終わるため、ボードは1秒間に何千回もボタンを確認し、ごく短いタップも検知できます。
点滅処理はmillis()パターンです。ボタンの処理はInputsセクションで説明したエッジチェックです。つまり、今ボタンが押されていて、前のループでは押されていなかったときに処理します。!は「ではない」という意味なので、!wasPressedは「押されていなかった」と読みます。
bool wasPressed = false;
void loop() {
// 点滅処理: if (now - previous >= 500) { ... }
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// ボタンが押された直後
}
wasPressed = pressed;
}両方の処理をloop()に続けて書き、どちらにもdelay()を入れないでください。点滅処理が500 ms待機すると、その待機中に始まって終わるタップは検知されません。
チャレンジ
中級ボードで2つのことを同時に行いましょう。
- 13番ピンの赤色LEDが、
millis()を使って500 msごとに切り替わる - ボタンを押すたびに、12番ピンの黄色LEDがオン、オフ、オンの順に切り替わる
ボタンを軽く押してすぐ離しても、いつでも反応する必要があります。また、ボタンを押し続けても、黄色LEDが切り替わるのは1回だけです。Runを押し、ボタンを押してから、Checkを押してください。
自分で試してみよう
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// 1. millis() を使って、赤色 LED を 500 ms ごとに点灯・消灯させる
// 2. ボタンを押すたびに、黄色 LED の点灯・消灯を切り替える
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド