Sympapaです。
ホームオートメーションにどっぷりハマっているものの、個人的には自動化や遠隔操作のトリガーとして使うものならともかくモニターするだけのIoTにはあまり興味がないのですが、最近、家を建てる検討をしている中で換気システムのことを調べていたら、なんだか二酸化炭素濃度をモニターすることは大事そうな気がしてきました。
二酸化炭素濃度の健康への影響に関しては色々な見解があるようでそんなシビアなもんではなさそうですが「3000ppmくらいで倦怠感、頭痛、耳鳴り、息苦しさ等が出て来る」「1,000ppm以下が目標」ということのようです。
労働安全衛生法の事務所衛生基準規則では、二酸化炭素濃度は5,000ppm以下としなければならず、換気装置がある場合は1,000ppm以下としなければならないとされています。
ざっくり「5,000ppm以下が最低限守るべきラインで、1,000ppm以下になるように努力したい」ってことのようです。
今の我が家は24時間換気システムなんてものが義務付けられる前に建てられたものなので換気は成り行きです。
気密も低そうなので換気が不十分でもそこまで二酸化炭素濃度は上がらんのちゃうとは思いますが、現状どのくらいの二酸化炭素濃度なのかは気になりますし、新しい家では気密も高くなるからちゃんとモニターしたいと感じたので二酸化炭素濃度計を導入することにしました。
コロナ禍により「換気しろ」という世の中の流れから二酸化炭素濃度計は需要が増大したようで、Amazonで検索するとディスプレイ付きの二酸化炭素濃度計がたくさん販売されています。
そういうやつを買ってもいいんですが外部出力の無い安いものでも4500円くらいはしますし、せっかくなのでHome Assistantと連携したいところです。
ググった結果、電子工作界隈(?)ではMH-Z19というCO2センサーが有名そうで精度も高そうです。
そんなわけで今回は、マイコンボード:ESP32+CO2センサー:MH-Z19CでESP Homeアドオンを使いHome Assistantと連携できる二酸化炭素濃度モニターを導入したというお話です。
■購入した二酸化炭素センサー
秋月電子でMH-Z19Cを2個購入しました。1個2480円ですが送料500円がかかったので実質1個2730円です。
akizukidenshi.com
Aliexpressでの相場は1個2000円~2500円というところでそっちのが若干安上がりですが、ニセモノが結構出回っているようなのと、セラーの発送地域によっては上海ロックダウンによる物流混乱の影響を受けそうなので国内ショップでの購入にしました。
■ESP32とMH-Z19Cの配線
Home AssisantはRaspberry PI 4B上で動かしているので、そのGPIOにMH-Z19Cを接続すれば余計なハードを追加しなくて済みますが、Home AssistantはRaspberry PI GPIOのサポートを2022年6月に削除するとしています。Home AssistantにはDockerなどいくつかのインストール方法があり、その方法やRaspberry PI 側の環境によってはGPIOの制御が不安定であることなどが理由のようです。
Home Assistant的にはセンサーを接続したいならESP Homeを使っとけってことのようです。
github.com
まぁHome Assisantを動かしているRaspberry PIは有線LAN接続で位置が固定なのでESP32にMH-Z19Cを接続してWi-FI通信した方がCO2濃度測定箇所の自由度が高いですし、ESP Homeを使えばMH-Z19そのもののセットアップが用意されているので簡単に使えます。
そんなワケでCO2センサー:MH-Z19Cの接続にはマイコンボード:ESP32を使うことにします。
今回使用するESP32は秋月電子で購入したESP32-DevKitC-32E ESP32-WROOM-32E開発ボードです。1個1230円ですが送料がかかるので、2個同時に買ったとして1個1480円です。
ESP32とMH-Z19の接続は電源の線2本とUART通信用の線2本を繋ぐだけで抵抗なども不要ですので、試す時にもブレッドボードすら要らない簡単仕様です。
しかしUARTが何なのかは私にはわかりません(笑) まぁシリアル通信ってことのようです。
ESP32には3つのUARTポートがあり、デフォルトのピンは以下のようになっているようです。
UART0: GPIO3/GPIO1
UART1: GPIO9/GPIO10
UART2: GPIO16/GPIO17
上のESP Homeの設定例ではGPIO1/GPIO3をUART通信に使用することになっていますが、UART0はUSBでのシリアル通信用に割り当てられているし、UART1のGPIO9/GPIO10は内部フラッシュ用に割り当てされていて使用するには別のピンへの割り当てが必要みたいです。
ややこしいので、今回はUART2: GPIO16/17を使用します。
ここやここやここらへんのページが参考になりました。
ということでメス-メスのジャンパケーブルで以下のように接続します。
5V-Vin
GND-GND
GPIO16(UART2 Rx)-Tx
GPIO17(UART2 Tx)-Rx
■ESP Homeのセットアップ
Home AssistantのESP Homeアドオンを使います。ESP Homeアドオンを導入するとHome Assistantから簡単にESP32を制御できます。
ESP Homeアドオンの導入方法についてはこちらの記事で書いています。
sympapa.hatenablog.com
ESP Homeの設定(.yaml)は以下のように設定しました。
uart: rx_pin: GPIO16 tx_pin: GPIO17 baud_rate: 9600 sensor: - platform: mhz19 co2: name: "MH-Z19 CO2 Value" temperature: name: "MH-Z19 Temperature" update_interval: 60s automatic_baseline_calibration: false
■使ってみる
とりあえず使ってみると、"sensor.mh_z19_co2_value"と"sensor.mh_z19_temperature"というエンティティが出来ています。
私の部屋で一晩試してみると、睡眠中は最大2500ppmくらいまで上昇していました。
ヤバいレベルではありませんが換気の無い部屋というものはこういうもんなんでしょうか。
でも出入りのある日中だと大体1000ppm以内をキープしているようです。機密の低い住宅とはこういうもんなんでしょうか(汗)
今回はハンダ付け無しでジャンパケーブル接続のまま100均のピルケースに収めました。ジャンパケーブルの分高さが必要ですがちょうどいい大きさのピルケースが無かったのでかなり余裕のサイズになってしまいましたが(笑)
もう一対作って私の部屋とリビングに設置しました。
リビングの二酸化炭素濃度はキッチンとリビングに設置してある家のダッシュボード用タブレットに表示し、アイコンの色が1000ppm未満で青、1600ppm未満で緑、5000ppm未満でオレンジ、5000ppm以上で赤に変わるようにしてみました。