5.2 デジタル入力とLED点滅 その1

次は、スイッチが押された情報を使って
LEDの点滅を切り替えるプログラムを作ってみます。

プログラムを、以下のようにしてみましょう

int buttonState = 0; 
int count = 0;
int check = 0;

void setup() {
  pinMode(P1_0, OUTPUT);      
  pinMode(P1_6, OUTPUT);      

  pinMode(P1_3, INPUT_PULLUP);     
}

void loop(){
  buttonState = digitalRead(P1_3);

  if (buttonState == LOW) {
    if (check == 0) {
      count++;
      check = 1;
      digitalWrite(P1_0, LOW);
      digitalWrite(P1_6, LOW);
    }  
  }
  else check = 0;

 switch (count % 4) {
   case 0:
     digitalWrite(P1_0, LOW);
     delay(200);
     digitalWrite(P1_0, HIGH);
     delay(200);
     break;    

   case 1:
     digitalWrite(P1_6, LOW);
     delay(200);
     digitalWrite(P1_6, HIGH);
     delay(200);
     break;    
   
   case 2:
     digitalWrite(P1_0, LOW);
     digitalWrite(P1_6, LOW);
     delay(200);
     digitalWrite(P1_0, HIGH);
     digitalWrite(P1_6, HIGH);
     delay(200);
     break;    
   
   case 3:
     digitalWrite(P1_0, LOW);
     digitalWrite(P1_6, HIGH);
     delay(200);
     digitalWrite(P1_0, HIGH);
     digitalWrite(P1_6, LOW);
     delay(200);
     break;    

  }

}

このプログラムでは

setup関数で

  pinMode(P1_0, OUTPUT);      
  pinMode(P1_6, OUTPUT);      

  pinMode(P1_3, INPUT_PULLUP);     

としており、赤色LED(P1_0)と緑色LED(P1_6)を出力に設定している
そして、押しボタンS1(P1_3)を入力にしている

loop関数の冒頭で
  buttonState = digitalRead(P1_3);

としており
押しボタンの状態を読み取っている
§5.1に示しているとおり、ボタンが押されていればLOW、押されていなければHIGHである。

続いて、

  if (buttonState == LOW) {
    if (check == 0) {
      count++;
      check = 1;
      digitalWrite(P1_0, LOW);
      digitalWrite(P1_6, LOW);
    }  
  }
  else check = 0;

としており、ボタンが押されていれば2行目のif文に移る
そしてcheckの中身が0なら、3行目以降が実行される
countを1増加させ
checkの中身を1にする
そして、2つのLEDを消灯する

ボタンが押されていなければ、最後の行のelseに処理が移りcheckの中身は0になる

これは、ボタンが押しっぱなしになっている状態を検出する目的がある
ボタンが押されたらcheckの中身を1にすることで
押しっぱなしになっているときに再びloop関数の最初に処理が戻ってきたとき
再び、このif文の中の処理を行ってcountの中身が増加し続けることを避けている

なので、ボタンが離されたらcheckの中身は0にして
再度押されたときにcountを増加させることができるようにしている。

光らせ方を変えているのはswitch-case文の部分である。

switch-case文は
switchに続く( )の中の式の値によって
処理を切り替える条件分岐命令である。

ここでは( )の中が count % 4 としているのでcountの中身を4で割った余りを
分岐するための値としている
つまりcountの値が1つずつ増える毎に count % 4 の値は
0→1→2→3→0→1→2→…
と変化していく

このプログラムでは( )の中の値が

0であれば、 赤色LEDのみ200ms点灯・200ms消灯を繰り返す

1であれば、 緑色LEDのみ200ms点灯・200ms消灯を繰り返す

2であれば、 赤色と緑色LEDの両方を200ms点灯・200ms消灯を繰り返す
          (同時に点灯し同時に消灯する)

3であれば、 赤色と緑色LEDの両方を200ms点灯・200ms消灯を繰り返す
          (一方が点灯し、もう一方が消灯する)

と4つの点滅パターンを切り替えている。

動作させてみれば分かると思うが
この方法では、ボタンは400ms毎にしかチェックされないので
ボタンを押されたときの反応が良いとはいえない。

次回は、このプログラムをdelayを使わないプログラムに改良してみる

0 件のコメント:

コメントを投稿