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); //割り込みスタート } |
なお、参考までに全体のスケッチはこちら(テキストファイル)