温度センサLM35DZを複数個繋いだロガーやっとできた。

これまでの記事:
LM35DZを複数つないだ時の問題 お詫びとハードでの解決
温度センサLM35DZを複数Arduinoに繋いだ時のトラブル
LM35DZによる温度測定とanalogReference()

マイコン風雲録さんのanalogReadEx()関数で解決しました。ありがとうございました。
Arduino:温度センサー Processing + Firmata LM61BIZとLM35DZとDS18B20のメモ[マイコン風雲録]

Arduino UNOのA0〜A5ポートにLM35DZを接続。信号線は10KΩでGNDに。

 ログ時刻はRTCをつないで頑張るつもりだったが、Arduino UNOではI2Cの端子がアナログポートとかぶるのであきらめた。Arduino Microだとアナログポートはたくさんあるし次はこれ使おう。
で、肝心のタイムスタンプはTeraTermに任せた。ログを取るときに□タイムスタンプのチェックボックス入れるか、teraterm.ini内のLogTimestamp=onにする。
参考:
TeraTermログの行毎に自動的にタイムスタンプを付与する

※追記:@maris_HYさんにSPI接続のRTC教えてもらいました。
DS3234搭載のリアルタイムクロック・モジュール

以下を追加・修正した。
・Setup()内で5秒の待ち。シリアルモニタ(TeraTerm等)を立ち上げる時間を待つため
・別のセンサを付けることを考慮して、A0〜A5ポートの入れ替えを最初のほうで定義した。
・温度測定の結果は先頭に連番を付けるようにした
・Arduinoが生きているかどうか分かるようLEDを点滅させる処理を追加
・LM35DZセンサの誤差を補正できるようにした(Adj[]で定義)

さて、これで安定して測定できるようになったが、温度センサを一箇所にまとめても数℃の誤差が出る。これはセンサについてまわるので素子のばらつきと思われる(安いグレードだし)が、ADCの基準電圧が内部リファレンス1.1Vと外部リファレンス3.3Vではどう違うだろうか。

ADCの基準電圧1.1Vと3.3Vについて200回測定し、平均を求めた。
$ gawk -f 20121130.awk lm35dz1v1.txt
AVG1= 188.02
AVG2= 190.65
AVG3= 193.33
AVG4= 191.77
AVG5= 192.27
AVG6= 194.555

1.1V÷1024で分解能は1.07mV
6.54ステップのゆらぎ 約7.00mV

$ gawk -f 20121130.awk lm35dz3v3.txt
AVG1= 60.2977
AVG2= 61.1395
AVG3= 61.4512
AVG4= 61.214
AVG5= 60.9488
AVG6= 61.8791

3.3V÷1024で分解能は3.22mV
1.58ステップのゆらぎ 約5.10mV

 ということで、ATmega328の内部1.1Vよりも外部の定電圧レギュレータによる3.3Vの方がより正確。外部5Vも使えるが、USBから給電して使う場合はそちらに影響されるので3.3V参照のほうがよさそう。
 または、基準1.1Vの方がセンサの誤差に対してより敏感なのかも。ちょっとこの辺はLM35DZの良いグレードの品で比較しないといけないんだろうけど資本切れです。


プログラムはこちら。
※analogReference()の箇所がINTERNALになってますが3.3V参照ではEXTERNALでした。ただしINTERNAL設定でもAREFにかかっている電圧が優先になるようです。

https://gist.github.com/4176111


20121201terrmal

一晩測ってExcelに持っていった。おおよそ期待通り。上がったりしている箇所はストーブを使った時間。