押すたびに切り替える
CoddyのArduinoジャーニー「入力」セクションの一部。レッスン 4/22。
これまで、LEDはボタンの状態をそのまま反映していました。押している間は点灯し、離すと消灯します。ランプのスイッチは動作が異なります。1回押すと点灯し、もう1回押すと消灯します。これがトグルです。
トグルするには、ボタンが押された瞬間をスケッチが検知する必要があります。つまり、今は押されているけれど、前回loop()が実行されたときは押されていなかった状態です。この瞬間をエッジと呼びます。カウンターのように、最後に読み取った値をsetup()より上で変数に保持します。
int lastReading = HIGH;
void loop() {
int reading = digitalRead(2);
if (reading == LOW && lastReading == HIGH) {
// ボタンが押された
}
lastReading = reading;
}ボタンを押し続けると読み取り値はLOWのままなので、押している時間の長さにかかわらず、エッジは押すたびに1回だけ発生します。
boolの値を反転するには、「否定」を意味する!を使います。ledOn = !ledOn;はtrueをfalseに変え、またその逆にも変えます。
チャレンジ
中級ボタンはピン2(INPUT_PULLUP)、LEDはピン13に接続されています。ボタンを押すたびにLEDの状態を切り替えます:
- ボタンが押されたとき(現在は
LOW、前回はHIGH)、ledOnを反転させます loop()の最後に読み取り値をlastReadingに保存しますledOnに合わせてLEDを点灯または消灯します
Runを押し、ボタンを数回押してから、Checkを押します。
自分で試してみよう
const int buttonPin = 2;
const int ledPin = 13;
bool ledOn = false;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int reading = digitalRead(buttonPin);
// ボタンが押されたらledOnを反転させる
// 次回のために今回の読み取り値を記憶する
// ledOnに合わせてLEDをオンまたはオフにする
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
入力のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド