RaspberryPiで環境センサーを作る

自宅でリモートワークも多くなり、閉め切った部屋で仕事をしていると、なんとなく息苦しくなる瞬間。
部屋の二酸化炭素(Co2)の濃度が高くなっている??

定期的な換気を心がけましょうと言うことで、実際に 作業部屋の二酸化炭素濃度と気温・湿度・気圧などを測れる環境センサーをRaspberryPiで作ってみました。
動作させるプログラムもできる限り簡単にします。

使用する部材

今回 RaspberryPi環境センサーで使用した部材は次の通りです。

  • RaspberryPi 4(3でも問題ありません)
  • microSD RaspbberyPi OS インストール済み
  • BME280 DIP センサー(i2c接続)
  • MH-Z19B DIP センサー(シリアル接続)

環境センサーの作成

簡単に動作させるためにブレッドボードで作りました。
回路図は、次のような簡単な接続です。

二酸化炭素(Co2)センサーの準備: MH-Z19B

二酸化炭素(Co2)センサーには、MH-Z19B を使用しました。
ピンも実装されているタイプを購入しましたので、ジャンパーケーブルで簡単に接続できます。

接続できたら RaspberryPi でMH-Z19を使うための準備をします。

raspi-config で、シリアルポートが使えるように設定します。

3 Interface Options を選択します。

P6 Serial Port を選択して、シリアルポートが使えるようにします。
有効にするために、一度再起動します。

次ぎに、MH-Z19をPythonで使うためのモジュールがありますので、pip3でインストールします。

ソースコードやマニュアルは、GitHub で公開されています。

これで 二酸化炭素(Co2)センサーの値が取得できるようになります。

コマンドラインから python3 でmh_z19の動作を確認します。

二酸化炭素(Co2) 濃度の取得ができるようになりました。
部屋の中と言うこともあり、Co2 濃度が 556 ppm と若干高めですが、厚生労働省が換気の目安ととしている1000 ppm には余裕がありそうです。

Python3 で、 Co2 の値だけを取得するには、mh_z19.read_all() で、co2 を指定すると int の数値だけ取得できます。

温度・湿度・気圧センサー(BME280) の準備

次ぎに 温度、湿度、気圧を取得するための BME280 の環境を整えていきます。
BME280 は、すでに多くの方が記事を作成されていますが、Python3 で初期化をしたり値を取得したりと、実際に使おうとするとかなり手間がかかります。

MH-Z19と同様に、i2cでBME280にアクセスしますので、raspi-config で i2cが使えるようにしておきます。

i2cを有効にしたら、RaspberryPi で BME280 にアクセスするためのモジュールを追加します。

モジュールの追加ができたら BME280 を認識しているかを確認するために i2cdetect を実行します。

スイッチサイエンスさんが、Githubでサンプルを公開してくださっていますので、git clone してテストしてみます。

python27/bme280_sample.py を実行するのですが、今回は python3 の環境ですので、print の記述を変更します。

温度、湿度、気圧の出力で 3ヶ所 print がありますので、python3 の print の記述に変更します。

これで 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行を追加します。

追加したらドライバを有効にするために再起動します。

再起動後に、モジュールを認識しているかを確認するため、次のコマンドを実行します。

BME280 を認識していると ‘bme280’ という文字が取得できます。

今までプログラムでアクセスしていた値が、ファイルシステムの内容を確認するだけで取得できるようになりました。

温度in_temp_input実際の値の 1000 倍の値を取得
湿度in_humidityrelative_input実際の値の 1000 倍の値を取得
気圧in_pressure_inputkPa の値を取得。hPha にするには、値を 10 倍する

実際にデータを取得すると次のようになります。

ファイルの内容を取得するだけで値が取れますので、Python3 からも簡単にアクセスできるようになります。

注意点

この Linux IIO を使用して BME280 を管理すると、サンプルプログラムが動作しなくなります。

また、 Linux IIO を有効にすると i2c デバイスをすべて Linux IIO の管理下になります。
他の i2c デバイスを接続させている場合には、注意が必要です。

定期的な値の取得

MH-Z19 で Co2 の値、 BME280 で温度・湿度・気圧 が取得できるようになったので、後は定期的に値を取得するプログラムを作成してモニタリングします。

私は、すべての値を CSV形式で出力して、グラフのプロットなどに使っています。

作成した スクリプトは、 今後 Github などに置くかもしれません。

モニタリングは続けていますが、気がつかないと 二酸化炭素の濃度が高いままと言うことにもなるので、
1000 ppm 近くになったら IFTTT などと連携して、通知するなど機能を追加しようと思っています。

今回使用した MH-Z19 と BME280 は、すべて秋月電子さんの通販で購入することができます。

Translate »