はじめに
最近の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 |

下記を参考にしています。
シリアル信号ではないのでシリアルポート設定は必要ありません。
Python で値を取得
手順は以下の通りです。
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 での取得を行いましょう。
