「Arduinoをはじめよう」その4 - プッシュボタンを押したらLEDが点灯、もう一回押したら消える

前回まではプッシュボタン押したときに点滅し続ける、離したら消える、ってを作ってました。今回は一回プッシュボタン押したら点灯し続け、もう一回押したら消える。また押したら点灯する。ってのを作ります。

コードは以下。

// ボタンを押したら点灯、もう一回押したら消える(はず、その3)
// ボタンの状態が変化(オフからオン、オンからオフ)したときのみstateを変更する
// バウンシング(ボタンが完全に押されていない状態)が生じるが50ms遅延させることで問題を解消

const int LED = 13;
const int BUTTON = 7;

int val = 0; // 入力ピンの状態を記憶しておく用
int old_val = 0; // 前回の入力ピンの状態を記憶
int state = 0; // LEDの状態(0ならオフ、1ならオン)

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
}

void loop() {
  val = digitalRead(BUTTON);
  
  // ボタンの状態が変化したか?
  if ((val == HIGH) && (old_val == LOW)) {
    state = 1 - state;
    delay(50); // バウンシング解消用の遅延
  }
  
  old_val = val;
  
  if (state == 1) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

ボタンが完全に押されていない、中途半端な状態を「バウンシング」っていうらしい。
それによって挙動がちょっと変になる時がある。
1度押したら着く↔1度押したら消える
の繰り返しになって欲しいのにそうならなかったり。

で、10msから50msの遅延を入れると解消するって書いてあったんだが、それでもうまくいかない時がある。
なんでかはわからないからまあ放おって置こう。そのうちわかるだろう。


プッシュボタン押したらLED点灯、消灯を繰り返す