3.2 LEDの点滅 その1”if文を使う”

§3.1に示したようなプログラムでは、赤と緑のLEDの点滅する周期を、別々に指定することはできませんでした。
そこで、プログラムを次のようにしてみましょう

#define R_LED P1_0
#define G_LED P1_6

int count=0;


void setup() {                
  // initialize the digital pin as an output.
  pinMode(R_LED, OUTPUT);     
  pinMode(G_LED, OUTPUT);     
}

void loop() {

 if(count%2==0)  digitalWrite(R_LED, HIGH);
 if
(count%2==1)  digitalWrite(R_LED, LOW);

 if(count==0)    digitalWrite(G_LED, HIGH);
 if(count==5)    digitalWrite(G_LED, LOW);


 count++;

 if(count==10) count=0;

 delay(500);                
}

どうでしょうか、目標通りの動作になっていますよね
(ただし、これが唯一の正解ではありません、プログラムは山の頂上を目指すのと一緒で登山道はいくつもあります)
なぜ、このようなプログラムにする必要があったのか順に見ていきます

まずはじめに#defineのすぐ後にある

int count=0;

です。これが変数と呼ばれるものです。
数値を入れておく箱と思ってください。
箱には入れるものは何なのか定義が必要です。

実生活ではミカン箱に本を収納しても問題ないですが
コンピュータの世界では、ミカン箱にはミカンしか入らないと思ってください。

ここでは、countという名前の箱をint型で定義しています。
int型とは整数(integer)を入れるための箱ということになります。
整数しか入れることができませんので、1.23のような小数を含む実数は扱えません
1とか108、-52のように整数の値しか入れることができない箱になります。

そして、count=0としてある = とは、= の左側の変数に右側の値を代入する時に使います。

つまり、countに0を代入するということになります。

ここでは、countを定義してすぐに0を代入しておくことになります。

定義するだけでは、箱の中に何が入っているか分らないので
0を代入して、初期状態での箱の中身を決めるわけです。

ちなみに、変数の定義と同時に代入しなくても
以下のようにsetup()の中でcount=0と記述しても同じことです。

int count;

void setup() {                
  // initialize the digital pin as an output.
  pinMode(R_LED, OUTPUT);     
  pinMode(G_LED, OUTPUT);

  count=0;     
}



次にloop()を見ていきます

void loop() {
 if(count%2==0)  digitalWrite(R_LED, HIGH);
 if
(count%2==1)  digitalWrite(R_LED, LOW);

 if(count==0)    digitalWrite(G_LED, HIGH);
 if(count==5)    digitalWrite(G_LED, LOW);


 count++;

 if(count==10) count=0;


 delay(500);                
}

いきなり、loop内の1行目からif(…)などという記述になっています。
ここで出てきたifとは条件文という命令になります

if(条件) 命令;

という形式で、条件が成り立っていれば(「真なら」とか「trueなら」とも言われます)
その後ろの命令を実行し
条件が成り立っていなければ(「偽なら」とか「falseなら」とも言われます)
何もせずに ; の後の命令に進みます

1行目では

 if(count%2==0)  digitalWrite(R_LED, HIGH);

条件がcount%2==0となっています
%というのは割り算した余りを求める演算子です。

5÷2=2…1 (5わる2は 2あまり1)

ですよね
つまり、5%2は5を2で割ったときの余りを求めることになるので1となります

ここでは、countという変数の中身を2で割っています、一番最初はcountは0なので余りは0です。
続く==とは、==の右側の値と左側の値が等しければ真、等しくなければ偽となる条件式です

なので、loopが初めて実行される回は、条件式が真となりR_LEDをHIGHにする命令が実行されます。

2行目は

 if(count%2==1)  digitalWrite(R_LED, LOW);

同じようにcount%2したものが1になるかどうかを見ています。初回は偽ですので続く命令は実行されません。

3行目があいて

4行目は

 if(count==0)    digitalWrite(G_LED, HIGH);

となっています。これは先の2つのifよりわかりやすいですね
countの中身が0の時だけ真となり、命令が実行されます。

5行目も同様に

if(count==5)    digitalWrite(G_LED, LOW);

となっており、countの中身が5の時だけ真となり、命令が実行されます。

6行目があいて

7行目が

 count++;

となっています。count++とはcountを1だけ増やす命令です

 count=count+1;

と同じことです。

そして11行目で

 delay(500);                

と、500[ms]待っています。
つまり、loop()が一回実行されるたび、
countは1ずつ増えていき、状態は500[ms]保たれることになります。

ただ、これではcountは無限に増えていくので
9行目で

 if(count==10) count=0;

として、countが10になったら0に戻しています
つまりloopが実行されるたびにcountの中身は
0→1→2→3→4→5→6→7→8→9→0→1→2→…
と変化していくことになります。

そして、countが偶数になるタイミングで赤色LEDが点灯
奇数になるタイミングで赤色LEDが消灯を繰り返します

緑色LEDはcountが0の時に点灯、5の時に消灯しますから
0~4の間は点灯、5~9の間は消灯ということになります。

これで、赤色の1[s]周期と緑色の5[s]周期を作り出しています。

0 件のコメント:

コメントを投稿