Raspi工作(気圧計)

raspbery pi専用の気象センサー「RPZ-IR-Sensor」を使って気圧計を作ってみた。
このページは自分で再現するためのメモとして記録しておくものです。

1.組み立て

気象センサーは「RPZ-IR-Sensor」を、raspiは3Bを使いました。
Eviciv-raspberry pi4用の7インチポータブルモニターの背中に子亀(raspi)孫亀(センサー)を乗せるようにセットしました。
ケースは100均で買ってきた透明プラケースを使用して中が見えるようにしました。

ディスプレイ用とraspi用にどうしても電源が2系統必要なのが厄介です。
またパッケイジ工作が野暮ったく、ちょっとアズマシくない感じです。
下図のように表示するのが目標です。

2.気象センサーの起動

raspi OSはcrontabが使えますので、10分毎に記録するようにします。
はじめに、現在crontabに何が記載されているか確かめてみましょう。

crontab -l | tail -1

次に、エディタを起動して追加します。

//cronの設定方法
$ crontab -e

//下記を加筆
*/10 * * * * /usr/bin/python3 /home/pi/rpz-sensor/python3/rpz_sensor.py -l /home/pi/rpz-sensor/log/rpz-sensor.csv

$ sudo /etc/init.d/cron start

$ sudo apt-get install chkconfig
$ chkconfig cron

//cron on ならOK、cron offなら下記
$ sudo systemctl enable cron

//cronでrpz_sensor.pyを動かすための設定
$ sudo pip3 install docopt

これで電源を入れればセンサーが10分毎に記録してくれます。

下図はディスプレイ上にThonnyでpythonプログラムを動かしているところです。

3.ディスプレイに表示する

//表示プログラムrpz-sensor-plot.pyを動かすための設定
$ sudo pip3 install pandas
$ sudo pip3 install matplotlib
$ sudo pip3 install schedule

ディスプレイに表示するためのパイソンコード(rpz-sensor-plot.py)は下記です。


import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
from datetime import datetime, timedelta
import time
import schedule
import os
def job():
print(datetime.now())

fname='/home/pi/rpz-sensor/log/rpz-sensor.csv'

ftime_linux = os.path.getmtime(fname) #ファイルゲット時刻の取得(linux time)
ftime = datetime.fromtimestamp(ftime_linux) #ファイルゲット時刻の取得(年月日)

df = pd.read_csv(
fname,
encoding='UTF8',
header=1,
names=[
'Time',
'Temp_ch1',
'Temp_ch2',
'Pressure_ch1',
'Pressure_ch2',
'Humidity_ch1',
'Humidity_ch2',
'Lux'
],
index_col=0
)
df.index = pd.to_datetime(df.index)

plt.clf()
plt.close()
fig, ax = plt.subplots(facecolor="skyblue", figsize=(14, 7))

today = datetime.today()
dayweeks = today - timedelta(weeks=3) # 3週間なら3
tomorrow = today + timedelta(days=1) # 1日なら1
#print(dayweeks) #check

plt.xlim([dayweeks,tomorrow])

ax.xaxis.set_major_locator(mdates.DayLocator(bymonthday=None, interval=1, tz=None))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.plot(df.index, df['Pressure_ch2'], linewidth=3, color="red") #気圧
#plt.plot(df.index, df['Temp_ch1']) #気温
plt.title("3 weeks trend of air pressure : " + ftime.strftime('%Y-%m-%d %H:%M'))
plt.xlabel("Date")
plt.ylabel("Air pressure(hpa)")
ax.grid()
plt.draw()
#plt.show()
#plt.show(block=False)
plt.pause(0.1)
#plt.close()


def main():
schedule.every(10).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)


if __name__ == "__main__":
main()

使用したセンサーは気圧以外に気温、湿度、照度等のデータもログに記録しています。
ただしケースの中なので気圧以外は真値とはいえません。
なので気圧の表示だけにすることにしました。

4.使用感

crontabで10分毎に記録したデータを10分毎に更新するという少々雑な表示方法です。
X軸には1日メモリの日付を、Y軸には10hpaメモリの気圧を表示しています。
過去3週間の変化が赤線で示されており右の端が現在値です。
10分位でスクリーンセーバーが起動して画面が消えますが記録は続けています。
WiFiマウスを動かすと表示が再開します。

丁度1週間前には低気圧が近くを通ったので気圧が急激に30hpaほど下がりその後2日かけて元に戻りました。
当方は気圧の変化には鈍感ですが、敏感な人ならこの時さぞ苦しかったことと思います。

このコードで1年以上ログをとっています。(※僅かの欠測値もありますが・・・)
WiFi経由でログをPCに転送できます。
2022年1月15日にトンガで起きた火山の衝撃波による津波の前に、2hpaの気圧の変化がありました。
この変化は本機でとらえることができました。下図をご覧ください。
火山から鶴岡までの距離が8,050kmで到達時間は7.48時間でした。
衝撃波が伝播してきた上空大気の温度がマイナス30度くらいだとすると1,076km/hで大体音速です。

17日の10時頃にも普通と違うピークがあります。これについて考えてみましょう。地球の外周は赤道周長で40,075km、極周長39,941です。
トンガの火山は日本の南東にありますので、トンガと日本を通る地球の周囲長は平均値の40,000kmくらいです。
衝撃波が音速の1076km/時で伝わるとすれば、1回目の気圧異常から40時間後の気圧異常は、衝撃波が地球を一周してきたものと考えられます。
気圧の変化による頭痛を察知するために作った気圧ロガーが思いもよらない情報を取っていたかもしれません。面白いものです。
だからraspi遊びはやめられません。

5.今後の課題

A.持ち運びできるようにすること。

B.誰でも使えるようにすること。

C.電池で動くようにすること。