はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

温度センサーを使ってみる | 中華で始める Arduino入門日記13

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

中華で始める 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を使います。