ラズパイはLinux (3) MathematicaからBME280を使う
ラズパイには無料で使えるMathematicaが用意されています。現在バージョン12です。数学ソフトですが、データをグラフ化する機能が多彩です。
前回、MEMSセンサのBME280を利用できるように設定し、Pythonのプログラムで温度、湿度、気圧を随時読み出しました。ここでは、MathematicaでBME280の温度を読み出し、グラフ化します。
●外部のデバイスを扱う方法
検索すると、ラズパイのGPIOをMathematicaで利用する方法が、
Using the GPIO with the Wolfram Language + Raspberry Pi
にありました。
センサのデータを読み取る事例が、
Vernier sensors and the Wolfram Language
にありました。
また、Pythonのプログラムを利用するには、ExternalSessions機能を使えば可能なことがわかりました。
ExternalSessions ExternalEvaluateでPythonファイルを実行する
●BME280の温度を読み込んでグラフにするプログラム
dataListは温度データを保存するリストです。Pythonのリストと同じように扱えるようです。Doはループ記述子で、[]でくくったループの末尾, {v, 1, 10}で10回繰り返す指定をしています。
session = StartExternalSession["Python"];は、外部関数でPythonを使うことを宣言します。
ExternalEvaluate[]は、実行するPythonのプログラム本体です。ここにプログラムを記述してもいいですし、外に置いたxxx.pyを呼び出してもよいようです。内容は、前回の温度の読み出しプログラムを関数にして、戻り値がTempとしました。
v = ExternalValue[session, "temp()"];は、前記の関数を実行し、読み取った戻り値をvに代入しました。
DeleteObject[session];で、一連の外部関数を呼ぶ作業を終了します。
AppendTo[dataList, v]では、dataListのリストに、読んだデータvの値を追加しています。
10回温度を読み取りした後の処理を次の二つで行います。
dataListは、データの入ったリストを全部表示します。
ListLinePlot[dataList]は、リストの内容を折れ線グラフにします。
dataList = {};
Do[
session = StartExternalSession["Python"];
ExternalEvaluate[session, "def temp():
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input');
Temp = round(int(f.read()) / 1000.0, 1);
f.close;
return Temp
"];
v = ExternalValue[session, "temp()"];
DeleteObject[session];
AppendTo[dataList, v]
, {v, 1, 10}
]
dataList
ListLinePlot[dataList]
実行結果です。読み取りには数秒かかっているようです。
●リアルタイムにグラフを更新するプログラム
「How to | データを動的に表示する方法」を参考に、BME280の最新データの読み込みと、グラフの更新を同時に行うプログラムを作ります。実行をキーボードで中断する方法やエラー処理がわからなかったので、ループは50回に限定しています。グラフは最新の15個のデータを表示します。したがって、最初の14個のデータを読み出しているときは、エラーが表示されます。
data = {};
Do[
session = StartExternalSession["Python"];
ExternalEvaluate[session, "def getTemp():
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input');
Temp = round(int(f.read()) / 1000.0, 1);
f.close;
return Temp
"];
v = ExternalValue[session, "getTemp()"];
DeleteObject[session];
AppendTo[data, v];
, {x, 1, 50}]
Dynamic[ListLinePlot[data[[-15 ;;]] ]]
実行中のようすです。50回のループが繰り返されているとき、グラフは、ハーフトーンで見にくいときもあります。
(※)普通にMathematicaを立ち上げると、グラフはMessagesのWindowに表示されます。ターミナルから、sudo mathematicaで立ち上げると、Out[x]=に表示されます。