読者です 読者をやめる 読者になる 読者になる

Raspberry Pi + MMA (9): 温度センサー LM73 とVernier で湯の冷却を測る

目次へ

Wolfram Community,Reading Temperature Sensors in the Wolfram Language On the RPi の Emerson Williard 氏の記事に興味を持った。実験では2個の温度センサー DS18B20 を使って室温と湯の温度を測っている。(6) で示した SDK GoIO は シングルチャネルしかサポートしないのでセンサー2個を使った実験はできない。しかし、(5)で説明した温度センサーLM73 を使えば可能であることに気がついた。LM73 で室温を測り、お湯の温度をVernier sensor で測ることにする。さらにデータを Dropbox に転送して記録する。

実験の構成

1. Raspberry Pi   2. LM73 温度センサー  3. Go!Link interface     4. Vernier 温度センサー

f:id:MMAys:20140305120537j:plain

測定のための Mathematica notebook

$MachineName
⇒ raspberrypi
(*  LM73 sensor  *)
SetDirectory["/home/pi/workLM73"];
getTemperature[] := (Run["./LM73.sh > tmp.dat"];
  First[ToExpression[Import["tmp.dat", "Lines"]]])
lm73Temp=Table[Pause[1.]; getTemperature[], {10}]
⇒ {7.6562,7.625,7.625,7.625,7.625,7.625,7.625,7.625,7.625,7.625}
meanLM73=Mean[lm73Temp]
⇒ 7.62812
(*  Vernier sensor  *)
link = Install["/home/pi/vernier/vernier"];
getDeviceInfo[]
⇒ Go! Link,1:6,10,Stainless Temp,(C)
vernierTemp =Table[Pause[2.0]; getSimpleMeasurement[], {10}]
⇒ {8.22137, 8.21277, 8.18702, 8.21707, 8.18016, 8.19159, 8.17339, \
   8.15843, 8.1653, 8.16072}
meanVernier = Mean[vernierTemp]
⇒ 8.18678
delta = meanVernier - meanLM73
⇒ 0.558664

室温を測ってセンサーのキャリブレーションを行った。温度 8°で温度差が 0.5587° であった。自分で較正を行っていないにも関わらずこの温度の一致は実験目的に十分である。

30秒ごとに温度測定し、2分ごとにDropbox にデータを転送する。

(* Setting for Dropbox upload  *)
upload[filesourcepath_, savedir_String] := 
  Run["/home/pi/Dropbox-Uploader/dropbox_uploader.sh upload " <> 
    filesourcepath <> " " <> 
    FileNameJoin[{savedir, FileNameTake[filesourcepath]}]];
(*  Setting tasks  *)
file = "/home/pi/Desktop/temperaturedata.txt";
task1 = CreateScheduledTask[upload[file, "/za_RaspberryPi/temperaturexperiment"], 120];
task2 = CreateScheduledTask[
   PutAppend[{DateList[AbsoluteTime[]], getSimpleMeasurement[], getTemperature[]}, file], 30];
(*   Start tasks   *)
StartScheduledTask[{task1, task2}];
(*   Stop tasks   *)
StopScheduledTask[{task1, task2}];

温度データのプロット

Dropbox にデータが保存されているので、MacMathematica で測定データをプロットしたグラフが次です。

(*  Mac  *)
infile = "/Users/satouy/Dropbox/za_RaspberryPi/temperaturexperiment/temperaturedata.txt";
data = ToExpression[Import[infile, "Lines"]];
Short[data, 5]
⇒ {{2014,3,5,0,7,14.1673},79.4693,7.9062},
  {{2014,3,5,0,7,44.1593},78.5191,7.9687},<<1254>>,
  {{2014,3,5,10,42,57.2543},7.44058,7.1562}}
data1 = DeleteCases[data[[All, {1, 2}]], {x__, y_} /; y < 1.0 || y >= 90];
data2 = DeleteCases[data[[All, {1, 3}]], {x__, y_} /; y < 1.0];
grf = DateListPlot[{data1, data2}, Joined -> False, PlotRange -> {0, 90}]

f:id:MMAys:20140305151044p:plain

図中の青色はお湯の温度で、紫色は室温です。

まとめ

  • 2個の温度センサーを使って約10時間にわたって室温と湯の温度を測ることができた。
  • 温度センサー LM73 と Vernier の測定値を比較したところ室温 8° で 温度差が 0.5° で一致した。
  •  task1 とtask2 を定義し、関数 StartSchedulesTasks を使うことにより極めて見通しいのよいプログラムを書くことができた。
  • Raspberry Pi から Dropbox へのデータ転送ができた。

目次へ