前回の基本スケッチは、以下のとおりです。
void setup(){
//1~7番ピン デジタル出力へセット
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
void loop(){
//0を表示
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
delay(10000);
}
Setup(){ }の中から、見直し!!
void setup(){
//1~7番ピン デジタル出力へセット
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
どう見ても、同じ命令を繰り返し実行しています。
違うのはピン番号だけです。
決まった回数だけ、同じ命令を繰り返す場合には、For文が便利です。
【構文】
for (初期化; 条件式; 加算) {
//実行される文;
}
For文では、条件式を満たす間は、For文の{ } に囲まれた実行文を繰り返します。
For文を使って、Setup(){ }のブロックを書き換えると、次のようになります。
void setup(){
//1~7番ピン デジタル出力へセット
for (int i=1; i<=7; i++){
pinMode(i,OUTPUT);
}
}
かなりスッキリしましたね。
つぎに、Loop(){ }の中を見直し!!
基本スケッチでは、全力で0を表示していますが、1~9だって、自由に表示したいです。このままでは、使い勝手が悪いです。
数字を表示する部分をvoidを使って関数にし、Loop(){}のメイン処理から必要に応じて呼び出すほうが実用的です。
void Num0(){
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}
void loop(){
Num0;
delay(10000);
}
voidを使って、"0"を表示する Num0 関数を作り、Loop(){ }の中から、Num0; 関数を実行しています。
関数にしたけど、まだ長い!!
同じように、"1"を表示する Num1 関数から "9"を表示する Num9 関数を作るのも悪くはありませんが、もう少し工夫が欲しいです。
なぜかと言えば、1つの関数で、9行必要です。これを10個の数字分作ると、それだけで、90行の大きなスケッチなってしまうからです。
そこで、配列を使って点灯すべきピン番号と消灯すべきピン番号を定義し、その配列に応じて表示するように改良してみます。
boolean Num0_Array[]={0,0,0,0,0,0,1};
void Num0(){
for (int w=1; w<=7; w++){
digitalWrite(w,Num0_Array[w]);
}
}
void loop(){
Num0;
delay(10000);
}
boolean 文は、ブール型のtrueかfalseどちらか一方の値を持つ変数を表しています。
そして、Num0_Array[]の部分が配列であることを示しています。
配列の定義の = の右側には、配列内の要素に保存しておく、値を羅列します。
そして、Num0関数内では、各要素を配列内から読み込み、点灯か消灯かを切り替えています。
配列内の各要素は、添え字を使って指定します。
Num0_Array[0]とすれば、配列内の先頭(0番目)の要素の値を読み込むことができます。
配列の要素を指定する場合には、0からです。
7つの要素があるので、添え字は0から6となります。
添え字の0から6までの値を繰り返し読み込むので、For文を使っています。
試しに"0"と"1"を表示するスケッチを書いてみましょう。
boolean Num0_Array[]={0,0,0,0,0,0,1};
boolean Num1_Array[]={1,1,0,0,1,1,1};
void Num0(){
for (int w=1; w<=7; w++){
digitalWrite(w,Num0_Array[w]);
}
}
void Num1(){
for (int w=1; w<=7; w++){
digitalWrite(w,Num1_Array[w]);
}
}
void loop(){
Num0;
delay(10000);
Num1;
delay(10000);
}
かなりスッキリしたと思います。いかがでしょうか。一つの数字を表示するために、6行で済むので全体で60行、30%減です。
良く見てみると、まだ改良の余地があった!!
でも、上のスケッチを見たときに気が付きませんか?
Num0関数とNum1関数の中身の違いは、使っている配列だけが違っているだけで、それ以外は同じです。
そもそも、関数を10個も用意せずに、ひとつの関数にまとめたいと思うのが、自然です。
なので、次回は関数をひとつにまとめて、スケッチ全体を完成させたいと思います。
・電子工作の基本100
・図解でわかるはじめての電子回路
・Android×Arduinoでつくるクラウド連携デバイス―Android ADKで電子工作
0 件のコメント:
コメントを投稿