温度センサーを使ってみる | 中華で始める Arduino入門日記13
こんにちは、のすけです。
中華で始める Arduino入門日記の13回目になります。
この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。
中華で始める Arduino入門日記1 はじめに「中華機を購入してみる」 - hollywis's diary (はりうすブログ)
今回のお題
前回は光センサーで明るさを検知してみました。
明るさセンサーを使ってみる | 中華で始める Arduino入門日記12 - hollywis's diary (はりうすブログ)
今回は、温度センサーを利用して部屋の温度を測ってみたいと思います。
チュートリアルのchapter10に対応しています。
早速始めましょう。
温度センサーを知る
LM35DZという温度センサーが入っていました。
データシートによると次のような特徴があるようです。
-
摂氏 ( ℃ ) 温度に直接較正されている
-
温度係数はリニアで+ 10.0mV/℃
-
+ 25℃において 0.5℃の精度を保証
-
- 55℃~+ 150 ℃の温度範囲
-
リモート・アプリケーションに最適
-
ウェハ・レベル・トリミングによる低コスト化
-
4 ~ 30V の動作電源電圧範囲
-
60 μA 以下の電流ドレイン
-
低自己発熱、静止空気で 0.08℃
-
± 1/4℃以下の非直線性 ( 代表値 )
-
低出力インピーダンス、1mA 負荷で0.1 Ω
と、実はそれなりに良さげなセンサーのようです。
中華キット侮れん。。。

VoutをアナログA0ピンへ、1℃上昇する毎に10mVの出力が上昇するようです。
回路
温度センサーに直接つないじゃいます。
-
緑が[5V]と[+Vs] を接続
-
黄が[A0]と[Vout]を接続
-
青が[GND]と[GND]を接続

プログラム
サンプルプログラムを実行してみます。
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を使います。
