7セグメントLED表示のArduino(あちゃんでいいの)温度計の試作

2016年3月


以前にArduinoで温度計を作りました。(記事はこちら)これはLCD表示でした。
今回は、3桁7セグメントLEDに温度を表示します。7セグメントLEDは、明るく大きく見やすいです。
7セグメントLEDは、秋月電子で販売しているC-533SRというカソードコモンのものを使用しました。
Arduinoで7セグメントLEDに表示するには、どうするのでしょう。あちこちのWebサイトを参考にさせていただきました。
SevSegライブラリというのがあり、4桁の7セグメントLEDを簡単に使うことができますが、今回は、それを使わずにプログラミングします。

この図は、こちらからお借りしています。

7セグメントLEDの各セグメント(a〜g)を文字のパターンに合わせて点灯すれば0〜9の数字を表示することができます。
出力がHIGHで点灯、LOWで消灯と2つの値しかとりませんので、boolean(ブーリアン)というデータ型を使い、
各パターンを配列にa,b,c,d,e,f,g順に0から9と空白(space)のデータを格納します。

 boolean Num_Array[11][7]={
{1.1.1.1.1.1.0},
{0,1,1,0,0,0,0},
{1,1,0,1,1,0,1},
{1,1,1,1,0,0,1},
{0,1,1,0,0,1,1},
{1,0,1,1,0,1,1},
{1,0,1,1,1,1,1},
{1,1,1,0,0,1,0},
{1,1,1,1,1,1,1},
{1,1,1,1,0,1,1}.
{0,0,0,0,0,0,0}
};

//0
//1
//2
//3
//4
//5
//6
//7
//8
//9
//space

数字(Number)に対応したセグメントを点灯させるには、a〜gに接続されたpin2〜8にデータを出力します。

void Num_Print(int Number){
 for(w=0;w<=6;w++){
  digitalWrite(w+2,Num_Array[Number][w]);
 }
}

また、LEDを1桁ずつ点灯させるダイナミック点灯のためのデータを格納します。

boolean Led_Array[3][3]={
{1,0,0,},
{0,1,0}.
{0,0,1}
};

//LED1
//LED2
//LED3 

1つのLED(Number番目)を点灯させるには

void Led_Active(int Number){
 for(w=0;w<=2;w++){
 digitalWrite(w+11,Led_Array[Number][w])
 }

表示すべき数値をN[0],N[1],N[2]に入れておいて、loop()の中でLEDを順にLED1,LED2,LED3の順に早い間隔で点灯すれば
人間の目には、3桁の数字に見えます。(今回は、5msずつ各LEDを点灯させています)

 void loop(){
 for(int i=0;i<=2;i++){
 Num_Print(N[i]))
 }
 Led_Active(i);
 delay(5);
}

温度センサーは、定番のLM35DZという測定範囲0℃〜100℃、出力10mV/℃の半導体センサーを使いました。
10kΩのボリュームを調整してAREFに1.023Vを加えることにより、アナログ入力を1000mV=1000という値で読むことができます。
例えば、20℃の場合、LM35DZの出力は、200mVですから、analogReadで読むと200になります。
この値を10で割れば、温度の値20.0を得ます。ただ、今回は、200と表示して、2桁目に「.」を表示して、見かけ上20.0に見せています。

温度の測定は、1秒ごとに行います。普通はloop()の中に1秒ごとの測定をプログラムしますが、
今回は、Arduino(ATmega328P)の内部のTimer2を利用した割り込みを使いました。
1秒ごとに割り込みを発生させて、温度を測定し、数値をN[0]〜N[2]にセットします。
10の位が0の場合は、空白にして、0消しを行います。

 void Temp_mes(){
 Temp=analogRead(0);//A0の電圧を読む
 Num_set(Temp);
}

void Num_set(int X){
 N[0] = X / 100:
 if(N[0] == 0){
  N[0] = 10;
  }
 Nx=X % 100;
 N[1] = Nx / 10;
 N[2] = Nx % 10;
}

1秒ごとに割り込みを発生させるには、ここからMsTimer2.zipをダウンロードしてライブラリにMsTimer2を加えておき、
次のようなスケッチを書きます。

 #include <MsTimer2.h>



void setup(){
 for(int i=2;i<=9;i++){
 pinMode(i,OUTPUT);
 }

 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(13,OUTPUT);

 analogReference(EXTERNAL);

 MsTimer2 :: set(1000,Temp_mes);//割り込み間隔1000=1000ms,割り込みが発生したときに実行する関数
 MsTimer2 :: set(start); //割り込みスタート
}

なお、参考までに全体のスケッチはこちら(テキストファイル)

inserted by FC2 system