こんにちは、のすけです。
中華で始める Arduino入門日記の13回目になります。
この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。
今回のお題
前回は光センサーで明るさを検知してみました。
今回は、温度センサーを利用して部屋の温度を測ってみたいと思います。
チュートリアルのchapter10に対応しています。
早速始めましょう。
温度センサーを知る
LM35DZという温度センサーが入っていました。
データシートによると次のような特徴があるようです。
-
摂氏 ( ℃ ) 温度に直接較正されている
-
温度係数はリニアで+ 10.0mV/℃
-
+ 25℃において 0.5℃の精度を保証
-
- 55℃~+ 150 ℃の温度範囲
-
リモート・アプリケーションに最適
-
ウェハ・レベル・トリミングによる低コスト化
-
4 ~ 30V の動作電源電圧範囲
-
60 μA 以下の電流ドレイン
-
低自己発熱、静止空気で 0.08℃
-
± 1/4℃以下の非直線性 ( 代表値 )
-
低出力インピーダンス、1mA 負荷で0.1 Ω
と、実はそれなりに良さげなセンサーのようです。
中華キット侮れん。。。
VoutをアナログA0ピンへ、1℃上昇する毎に10mVの出力が上昇するようです。
回路
温度センサーに直接つないじゃいます。
プログラム
サンプルプログラムを実行してみます。
void loop() { int val; int dat; val = analogRead(potPin); dat = (125*val)>>8 ; // Temperature calculation formula Serial.print("Tep : ") ; //print “Tep” means temperature Serial.print(dat) ; // print the value of dat Serial.println("C"); //print “C” means degree delay(500);//delay 0.5 }
なにやら、読み取った値に125を掛けて、8ビット右シフトしているようです。
つまり,28である1024で割っているようですね。
でも実行した結果、温度が-75℃とかになりました。
そんわけないし。
なんか検索すると各所でうまく温度取れない!みたいな話がいっぱい引っかかってきます。
様々な温度の計算方法があったので全部適用してみた。
そのプログラムがこちら。
int apin = 0; //アナログpin0を利用 float v = 5; // 基準電圧 void setup() { Serial.begin(9600); // シリアル通信設定 } void loop() { int val; float aV; // アナログpinの電圧 int dat; val = analogRead(apin); Serial.print("Anagor read:"); Serial.println(val); // 方式1(samaple) dat = (125*val)>>8; Serial.print("Tep1 : ") ; //print “Tep” means temperature Serial.print(dat) ; // print the value of dat Serial.println("C"); //print “C” means degree // 方式2 aV = (v * val) / 1024; Serial.print("Anarog Voltage:"); Serial.println(aV); dat = aV * 100; Serial.print("Tep2 : ") ; //print “Tep” means temperature Serial.print(dat) ; // print the value of dat Serial.println("C"); //print “C” means degree // 方式3 dat = val/27.3; Serial.print("Tep3 : ") ; //print “Tep” means temperature Serial.print(dat) ; // print the value of dat Serial.println("C"); //print “C” means degree // 方式4 dat = ((v * val/5) / 1024) * 100; Serial.print("Tep4 : ") ; Serial.print(dat); Serial.println("C"); //print “C” means degree Serial.println(""); delay(2000); }
方式1のサンプルは125というマジックナンバーがありますし、方式3にも27.3というマジックナンバーがあります。
正直よくわかりません。
方式2と4は、アナログピンへの電圧を求めて、1℃あたり10mVであることから、100倍して温度を計算しています。
式を1つにまとめるか、分けたかの違いだけです。
その結果がこちら。
Analog read:328 Tep1 : -96C Anarog Voltage:1.60 Tep2 : 160C Tep3 : 12C Tep4 : 160C Analog read:389 Tep1 : -67C Anarog Voltage:1.90 Tep2 : 189C Tep3 : 14C Tep4 : 189C Analog read:448 Tep1 : -38C Anarog Voltage:2.19 Tep2 : 218C Tep3 : 16C Tep4 : 218C Analog read:753 Tep1 : 111C Anarog Voltage:3.68 Tep2 : 367C Tep3 : 27C Tep4 : 367C
見てわかる通りかなり違います。
方式3のTep3が一番まともだし、合っているよう見えます。
しかし、27.5を掛けるのはやはり意味がわかりません。
ロジック的には方式2,4が合っているはずだと思います。でも367℃ですからね。
また、Analog readの値が448とかになっており、電圧が2.19Vを記録しています。
LM35DZは最大1.5V(150℃)とかな気がしますけど、これはセンサーが壊れているのでしょうか。
もう良くわかりません。揺れも大きいですし、温度センサーは難しいということがわかりました。
今回はこの辺りでやめにしたいと思います。
次回はセグメントLEDを使います。