2012年8月23日木曜日

1桁の7セグメント発光ダイオードで表示(スケッチその2)

今回は、前回の1桁の7セグメント発光ダイオードを表示する基本的なスケッチを見直して実用的なスケッチに改良していきます。



前回の基本スケッチは、以下のとおりです。

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 件のコメント:

コメントを投稿