2022/08/04 暑さ指数(WBGT)を疑似的に計算 を追記
2022/08/09 ここで使用したスクリプトを、 GitHub で公開しました
自宅でリモートワークも多くなり、閉め切った部屋で仕事をしていると、なんとなく息苦しくなる瞬間。
部屋の二酸化炭素(Co2)の濃度が高くなっている??
定期的な換気を心がけましょうと言うことで、実際に 作業部屋の二酸化炭素濃度と気温・湿度・気圧などを測れる環境センサーをRaspberryPiで作ってみました。
動作させるプログラムもできる限り簡単にします。
Table of Contents
使用する部材
今回 RaspberryPi環境センサーで使用した部材は次の通りです。
- RaspberryPi 4(3でも問題ありません)
- microSD RaspbberyPi OS インストール済み
- BME280 DIP センサー(i2c接続)
- MH-Z19B DIP センサー(シリアル接続)
環境センサーの作成
簡単に動作させるためにブレッドボードで作りました。
回路図は、次のような簡単な接続です。
二酸化炭素(Co2)センサーの準備: MH-Z19B
二酸化炭素(Co2)センサーには、MH-Z19B を使用しました。
ピンも実装されているタイプを購入しましたので、ジャンパーケーブルで簡単に接続できます。
接続できたら RaspberryPi でMH-Z19を使うための準備をします。
raspi-config で、シリアルポートが使えるように設定します。
1 | sudo raspi-config |
3 Interface Options を選択します。
P6 Serial Port を選択して、シリアルポートが使えるようにします。
有効にするために、一度再起動します。
次ぎに、MH-Z19をPythonで使うためのモジュールがありますので、pip3でインストールします。
1 | sudo pip3 install mh-z19 |
ソースコードやマニュアルは、GitHub で公開されています。
これで 二酸化炭素(Co2)センサーの値が取得できるようになります。
コマンドラインから python3 でmh_z19の動作を確認します。
1 | sudo python3 -m mh_z19 |
二酸化炭素(Co2) 濃度の取得ができるようになりました。
部屋の中と言うこともあり、Co2 濃度が 556 ppm と若干高めですが、厚生労働省が換気の目安ととしている1000 ppm には余裕がありそうです。
Python3 で、 Co2 の値だけを取得するには、mh_z19.read_all() で、co2 を指定すると int の数値だけ取得できます。
1 2 3 4 | import mh_z19 if __name__ == "__main__": co2 = mh_z19.read_all()["co2"] |
温度・湿度・気圧センサー(BME280) の準備
次ぎに 温度、湿度、気圧を取得するための BME280 の環境を整えていきます。
BME280 は、すでに多くの方が記事を作成されていますが、Python3 で初期化をしたり値を取得したりと、実際に使おうとするとかなり手間がかかります。
MH-Z19と同様に、i2cでBME280にアクセスしますので、raspi-config で i2cが使えるようにしておきます。
i2cを有効にしたら、RaspberryPi で BME280 にアクセスするためのモジュールを追加します。
1 2 | sudo apt-get install i2c-tools sudo apt-get python-smbus |
モジュールの追加ができたら BME280 を認識しているかを確認するために i2cdetect を実行します。
1 2 3 4 5 6 7 8 9 10 | pi@raspberrypi:~ $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 -- |
スイッチサイエンスさんが、Githubでサンプルを公開してくださっていますので、git clone してテストしてみます。
python27/bme280_sample.py を実行するのですが、今回は python3 の環境ですので、print の記述を変更します。
1 2 | 修正前:print "pressure : %7.2f hPa" % (pressure/100) 修正後:print( "pressure : %7.2f hPa" % (pressure/100) ) |
温度、湿度、気圧の出力で 3ヶ所 print がありますので、python3 の print の記述に変更します。
1 2 3 4 | $ python3 bme280_sample.py temp : 28.04 ℃ pressure : 1002.47 hPa hum : 30.42 % |
これで BME280 から温度・湿度・気圧が取得できるようになりました。
BME280に簡単にアクセスする : Linux IIO
BME280 にアクセスできるようになりましたが、初期化や値の取得などで結構な手間がかかります。
BME280 は、 Linux の Industrial I/O Subsystem ( 以下、 Linux IIO ) というドライバも対応しているので、こちらを使ってアクセスできるようにします。
Linux IIO を使用すると、i2c 接続の BME280 のデータを簡単に取得できるようになります。
Linux IIO で BME280 の有効化
Linux IIO で BME280 を扱えるようにするために /boot/config.txt の最後の行に、次の1行を追加します。
1 | dtoverlay=i2c-sensor,bme280 |
追加したらドライバを有効にするために再起動します。
再起動後に、モジュールを認識しているかを確認するため、次のコマンドを実行します。
1 2 | pi@raspberrypi:~ $ cat /sys/bus/iio/devices/iio\:device0/name bme280 |
BME280 を認識していると ‘bme280’ という文字が取得できます。
今までプログラムでアクセスしていた値が、ファイルシステムの内容を確認するだけで取得できるようになりました。
温度 | in_temp_input | 実際の値の 1000 倍の値を取得 |
湿度 | in_humidityrelative_input | 実際の値の 1000 倍の値を取得 |
気圧 | in_pressure_input | kPa の値を取得。hPha にするには、値を 10 倍する |
実際にデータを取得すると次のようになります。
ファイルの内容を取得するだけで値が取れますので、Python3 からも簡単にアクセスできるようになります。
注意点
この Linux IIO を使用して BME280 を管理すると、サンプルプログラムが動作しなくなります。
また、 Linux IIO を有効にすると i2c デバイスをすべて Linux IIO の管理下になります。
他の i2c デバイスを接続させている場合には、注意が必要です。
暑さ指数(WBGT)を疑似的に計算:2022年追記
温度と湿度が取得できてますので、暑い夏の対策として 暑さ指数(WBGT)も計算して記録するようにしました。
ただ、正確な 暑さ指数は 複数の条件の 湿度と温度が必要になります。
そこで、「通常観測気象要素を用いたWBGTの推定」という日本生気象学会雑誌の情報から疑似的な計算式を採用して記録してみます。
この計算式を使うと「推定誤差 1.0°C 以内:98.3~99.8%」という精度で 暑さ指数を計算できるようです。
Pythonで記述した計算式は、次の通りです( Ta が温度、RHが湿度です)。
室内(indoor)と屋外(outdoors)では、係数が異なりますのでセンサーを配置する場所によって計算を変えます。
1 2 3 4 | # indoor wbgt = round( float( Ta *0.725 + RH *0.0368 + 0.00364* Ta * RH - 3.246 ), 2 ) # outdoors wbgt = round( float( Ta *0.735 + RH *0.0374 + 0.00292* Ta * RH - 4.064 ), 2 ) |
暑さ指数の詳しい内容は、以下のWEBページで確認できます。
基本的には、28以上 と 31以上 が注意が必要になる値なので、28 と 31 以上を閾値として監視します。
定期的な値の取得
MH-Z19 で Co2 の値、 BME280 で温度・湿度・気圧 が取得できるようになったので、後は定期的に値を取得するプログラムを作成してモニタリングします。
私は、すべての値を CSV形式で出力して、グラフのプロットなどに使っています。
1 2 3 4 5 6 | pi@iotdev001:~ $ tail -5 /tmp/sensor.log 2022/08/04 11:30:02,26.51,79.55,997.6,463.0,26.58 2022/08/04 12:00:02,26.67,76.84,997.6,483.0,26.38 2022/08/04 12:30:02,26.69,81.95,997.5,456.0,27.08 2022/08/04 13:00:02,26.77,77.12,997.4,461.0,26.52 2022/08/04 13:30:02,26.92,75.88,997.1,439.0,26.5 |
値は、左から次の通りです。
- 日時
- 温度
- 湿度
- 気圧
- Co2濃度
- 暑さ指数
2022/08/09 : ここで使用したスクリプトを、 GitHub で公開しました
温度や湿度・気圧は目安ですが、Co2濃度(1000ppm以上) と 暑さ指数(28以上)は数字を確認して、超過したら警告をTwitterのDMと Slackにポストするようにしています。
今回使用した MH-Z19 と BME280 は、すべて秋月電子さんの通販で購入することができます。
最後にこのセンサーを作った経緯や今までの内容などをまとめた「せいさくのおと」も作成しました。