Texas Instruments LM35DZは手軽に使えるアナログ温度センサです。
Arduino で使用する場合には抵抗を気にせずに回路に組み込めるので、PCケースの内部温度を計測して自動的に冷却ファンを回したり、サーバ室やビニルハウスの温度を遠隔通知したりするときなどに便利に使えます。
使いどころは無限にあり、価格も安いので、いくつ持っていても困りません。中国某所でもモジュール単位で投げ売りされていたので、お土産に一つ購入してみました。
ここまでは良かったのですが、これを接続してみるとおかしな数値が出力されます。
なにこれ、絶対にありえないだろという数値ですね。
この温度だと錫や鉛の融点を超えてますので、はんだ付けされた部分が無事ではすみません。
そもそも計測範囲外です(詳細は以下のデータシートを参照して下さい)。
LM35DZ Datasheet (PDF) – Texas Instruments
https://www.alldatasheet.com/datasheet-pdf/pdf/520582/TI1/LM35DZ.html
計測結果に話をもどしまして、となりの列にある Sensor2 の出力は、同じ回路に組み込まれた同種のセンサのものです。
こちらは秋葉原で購入しました。
こいつらを2つ一緒に並べて同じ条件下で計測を行った結果が先ほどの出力になります。
より具体的には1秒間に1度の頻度で計測した温度をシリアル通信で出力することを行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const float vcc = 5.0; void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { int sensorValue0 = analogRead(A0); int sensorValue1 = analogRead(A1); Serial.println(String(getTemp(sensorValue0)) + "\t" + String(getTemp(sensorValue1))); delay(1000); } float getTemp(int sensorValue) { return sensorValue * vcc / 1023.0 * 100; } |
このスケッチを 30 分間動かして、得られた結果をファイルに書き出しています。
これでどうして、摂氏 454 度みたいなおかしな数値が出てくるのでしょう。その答えは計測中にジャンパワイヤを引っこ抜いたときに判明しました。
センサの信号がただしく伝送されていないときに、マイコンは先の異常値と似たような値を出力することを実験して確認しました。となると怪しいのは基盤か溶接部分です。
そこで、センサが生きていることを祈りながら、モジュールからセンサを分離します。
最初は はんだ吸取り線 を使って丁寧に溶接を剥がしていたのですが、途中から時間が惜しくなってきたので、ニッパーでぶった切る方針に変更しました。
ピンがだいぶ短くなりましたけれども、無事にモジュールからセンサを取り外すことができました。
これを先ほどとおなじ回路に接続し直して再度の計測を行います。
一般的にセンサは過電流では容易に壊れます。
その一方で物理的や衝撃や熱に対してはそこそこ丈夫なものが多いので、まだ使えるような気がするという目論見のもと計測再開です。
※もちろん、プラスとマイナスの向きを間違えると異常発熱して危険なので、そこは気をつけてください。
その結果は以下のとおりです。
出力を見れば一目瞭然ですが、ようやく常識的な数値が計測できました。目論見通り、センサは生きていたわけです。
しかし、同じセンサを使って同一条件で計測しているはずなのに、結構、微妙な誤差がありますね。
厳密な調査で用いるならば、プログラムの方で調整してあげる必要がありそうです。この辺り、まだ探求の余地がありますね。
ちなみにグラフは以下のようにして、直接 PNG 形式で書き出すことができます。覚えておくと便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ gnuplot -V gnuplot 5.2 patchlevel 2 $ gnuplot gnuplot> set datafile separator "," gnuplot> set grid gnuplot> set ytics gnuplot> set xtics gnuplot> set xdata time gnuplot> set timefmt "%b %d %Y %H:%M:%S" gnuplot> set xrange ["Sep 15 2019 14:01:30":"Sep 15 2019 14:21:30"] gnuplot> set format x "%M:%S" gnuplot> set xlabel "Time (Min)" gnuplot> set ylabel "Temperature (°C)" gnuplot> set terminal png gnuplot> set output "output.png" gnuplot> plot "output.txt" using 1:2 title "Sensor 1" w lines, "output.txt" using 1:3 title "Sensor 2" with lines |