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);
としており、赤色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;
そして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消灯を繰り返す
0 件のコメント:
コメントを投稿