はじめに
最近のRaspberry Pi 4 でMH-Z19Bを利用して二酸化炭素濃度を計測する場合、これまでの方法では値を取得することができませんでした。この原因はOSにあります。Raspberry Pi OSのベースがbusterからbullseye に変更されたことが原因です。bullseye ベースのOSで利用する方法を紹介します。
制限としては、精度が下がります。5ppm刻みに値が採られてしまいます。あと遅いです。自分でコードを書けば補正できるっぽい。
これまでの様々なサイトで紹介されている方法で利用するにはOSをバージョンをbusterベースにする必要があります。Raspberry Pi OS (Legacy)をダウンロードして利用します。
MH-Z19B の配線
Raspberry Pi 4 とMH-Z19Bの配線は以下になります。PWM での取得になります。
Raspberry Pi 4 | MH-Z19B |
5V | Vin |
GND | GND |
GPIO 12 | PWM |
下記を参考にしています。
-
PWM support. · UedaTakeyuki/mh-z19 Wiki · GitHub
Read CO2 concentration from mh-z19 sensor on the Raspberry Pi & handle it. Detect Raspberry Pi model ...
github.com
シリアル信号ではないのでシリアルポート設定は必要ありません。
Python で値を取得
手順は以下の通りです。
-
GitHub - UedaTakeyuki/mh-z19: Read CO2 concentration from mh-z19 sensor on the Raspberry Pi & handle it. Detect Raspberry Pi model automatically and read the value from an appropriate serial device.
Read CO2 concentration from mh-z19 sensor on the Raspberry Pi & handle it. Detect Raspberry Pi model ...
github.com
pip3 install mh-z19
以上で準備は完了です。
値を取得します。
python3 -m mh_z19 --pwm
JSONもどきで吐き出されます。シングルコーテーションのためjqにかけてもエラーがでます。面倒ですね。なので一応サインプルのスクリプトを置いておきます。
{'co2': 940.0}
サンプル(日時と値を取得してCSVに吐き出すだけのスクリプト)
事前にjqはインストールします。
apt install jq
bashスクリプト
while : do co2=`python3 -m mh_z19 --pwm` co2vol=`echo $co2 | sed -e 's/'\''/\"/g' | jq .[]` csvdate=`date "+%Y/%m/%d,%H:%M:%S"`","$co2vol echo $csvdate >> co2.csv echo $csvdate sleep 5s done
結果
# ./mhz19.sh 2023/01/17,01:41:43,960 2023/01/17,01:41:50,965 2023/01/17,01:41:57,960 2023/01/17,01:42:04,960 2023/01/17,01:42:11,955 2023/01/17,01:42:18,960
あとは適当にExcelなどでグラフ化してください。
まとめ
bullseye ベースのOSではこれまでの方法では取得できません。PWM での取得を行いましょう。