ラズパイは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]=に表示されます。