ずいぶん前に、温度センサLM35をarduinoに
繋いで温度を計ってみましたが、LM35は
ノーマルではマイナスの温度が計れません。
って訳で、以前秋月でLM60も買い置きをして
ありました。袋に入れっぱなしでしたが…
LM60は-40℃から+125℃まで
測ることが出来るし、S8100Bよりも出力
インピーダンスが低いので扱いもラクなはず。
便利そう。
ってことでスケッチを書いてみます。以前の
LM35用を流用します。いつものとおり
reduino-nano用なので、LEDはデジタル3ピン
に繋がっている前提です。適宜13番などに
変更して使って下さい。あと、for文のところの
不等号が全角になってるので、直して使って
ください。
int ledPin = 3; // select the pin for the LED
int analogpin0 = 0; // select the pin for analog0 input
double max = - 424.0 / 6.25; // temperature at ADC=0
int data = 0; // input data from ADC
int summary = 0; // summary of input data
int i;
double t_value; //temperature value
void setup() {
analogReference(INTERNAL); //use internal 1.1v reference
pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT
Serial.begin(9600);
Serial.println("start");
Serial.println((int)max);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1800); //1.8s//
summary = 0;
for(i=0;i<50;i++){
data = analogRead(analogpin0); //read data from analog0 pin
summary = summary + data;
delay(2);
} //0.002*50 = 0.1s//
Serial.println(summary/50);
t_value = ((double)(summary)/50.0 /1024.0 * 1100.0 / 6.25) + max;
Serial.println((int)(t_value+0.5)); //round off
digitalWrite(ledPin, LOW);
delay(100);
}
maxという変数は、adcの入力値=0の時に
該当する温度です。つまりY切片ね。
LM60は-40℃から125℃の間は
出力が直線になるように補正されているらしい
ので、adcの入力値に傾きを掛けてから
Y切片を足せば温度が求まるというわけ。
例によって50回サンプルして平均取ることで
ノイズを均しています。
実行すると最初に「start」と同時に表示される
のがY切片。adcの値が0の時に-67℃という
ことと同じ意味。(実際はそこまで計れませんが)
その次からは2秒置きにadcの測定値と該当温度
が表示されます。
表示されているのはとりあえず整数部だけ。
adcの参照電圧は内蔵1.1Vを適用しているので、
計れるのは0V~1.1V。ってことは
約108℃までしか計れません。でもまぁ
そこまで計れれば充分でしょう。
表示される温度はLM35の時よりも、
部屋にあるほかの温度計になんとなく近い
温度になってるみたい。
データシート上は±3℃の誤差を含むみたい
ですが、かなり正確な雰囲気。
まぁ、そもそもarduino(というかmega168)の
内蔵1.1V参照電圧ってデータシート上は
最大0.1Vの誤差を含んでいるので、
LM60の誤差だけでなくむしろそっちの方が
大きな誤差を生じそう…。
LM60の精度を最大限活かすには、もっと
正確な外部参照電圧を使う必要がありそうですが、
arduinoは外部参照電圧とは相性が悪いんですよね…
まぁ、arduinoならそこそこの温度が判れば充分
でしょう。多少誤差があってことだけ抑えておけば
まぁ使えるのでは?
http://nekosan0.bake-neko.net/connection_thermo.html
↑全然書き進めてなかったことに気付きました。
せっかくなのでLM35、LM60、S8100B
についてまとめておこうと思います。
|