こんにちは、のすけです。

中華で始める Arduino入門日記の13回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回は光センサーで明るさを検知してみました。

hollywis.hatenablog.com

今回は、温度センサーを利用して部屋の温度を測ってみたいと思います。

チュートリアルのchapter10に対応しています。

早速始めましょう。

温度センサーを知る

LM35DZという温度センサーが入っていました。

データシートによると次のような特徴があるようです。

  • 摂氏 ( ℃ ) 温度に直接較正されている

  • 温度係数はリニアで+ 10.0mV/℃

  • + 25℃において 0.5℃の精度を保証

  • - 55℃~+ 150 ℃の温度範囲

  • リモート・アプリケーションに最適

  • ウェハ・レベル・トリミングによる低コスト化

  • 4 ~ 30V の動作電源電圧範囲

  • 60 μA 以下の電流ドレイン

  • 低自己発熱、静止空気で 0.08℃

  • ± 1/4℃以下の非直線性 ( 代表値 )

  • 低出力インピーダンス、1mA 負荷で0.1 Ω

と、実はそれなりに良さげなセンサーのようです。

中華キット侮れん。。。

f:id:hollywis:20151211000635p:plain

VoutをアナログA0ピンへ、1℃上昇する毎に10mVの出力が上昇するようです。

回路

温度センサーに直接つないじゃいます。

  • 緑が[5V]と[+Vs] を接続

  • 黄が[A0]と[Vout]を接続

  • 青が[GND]と[GND]を接続

f:id:hollywis:20151211133704j:plain

プログラム

サンプルプログラムを実行してみます。

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を使います。

Receive the latest news in your email
Table of content
Related articles