【Home Assistant(Hass.io)】ESP32とMH-Z19Bで室内CO2濃度の測定
「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
在宅勤務が続き家にこもる毎日ですが、はたと「二酸化炭素濃度は大丈夫なのだろうか?」とか気になってきました。安価なCO2センサーを使って勉強部屋の二酸化炭素濃度を測定し、健康管理に役立てましょう。
大気中の二酸化炭素濃度は400ppm(ppmはparts per million 百万分率で、ざっくりとした定義ではどのぐらいの割合含まれているかを表す。1ppmは、0.0001%です)です。建築基準法では二酸化炭素濃度を1,000ppmを超えないように換気すべしとしています。通常の濃度の2倍ちょいぐらいですね。1,000~1,500ppmぐらいになったら換気せよ、1,500ppmを超えると眠気や倦怠感などの不具合が出てくる様子。
さて我が家の様子はどうであろうか…
この記事の前提条件 | |
---|---|
Home Assistant | 2021.5.5 |
HassOS | 5.13 |
Server | Raspberry Pi 4(2GB) |
上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)
1. 準備
MH-Z19B Winsen 赤外線 CO2センサー
売り手は「New Original」とか「High Quality」とか言っていますが、偽物だという情報もあります。確かに形と色はFake品っぽい。ちゃんと動いているように見えますが…でも安物だから…
価格:AliExpressでケーブル付きで1個2,000円ぐらいかな。
NodeMCU ESP32S
ESPHomeにMH-Z19Bの接続設定があるので今回もNodeMCU ESP32(の互換品)を使います。
分割ロングピンソケット 1×42 (42P)
MH-Z19Bは最終的にはケーブルでESP32と接続するのですが、テストではブレッドボートで接続したいのです。ジャンパワイヤー(ピン)を使えるようにピンソケットを使います。折って好きな長さで使える便利なしろものです。
秋月電子通商で買いました[通販コード:C-05779]。
2. 動作確認
最終的にはケースを作って勉強部屋のCO2濃度を監視して、1000ppmを超えたら警告が出るようにしたいのですが、まずは「Fake品」と言われているのでちゃんと測れるかテストしたいと思います。ブレッドボード上で下記の様に組みます。
(写真のMH-Z19Bは、ブレッドボード用のジャンパワイヤーが挿せるように両端の穴にピンソケットをはんだ付けしてあります)
ESPHomeで屋内センサー増量を参考にNodeMCU ESP32を初期セットアップします。初期セットアップが終わったら、EDITでMH-Z19Bセンサーの設定を書き込みます。
基本的にはESPHomeのMH-Z19の項に従って設定します。
esphome.io
1点注意はUARTでCO2センサーと通信させますが、ESPHomeのサンプルにあるTX0 (GPIO1)
、RX0 (GPIO3)
を設定すると「ESPHomeのロギングとバッティングするよん」と言われます。今回はほかのUARTのピンということで、TX2(GPIO17)
、RX2(GPIO16)
を使用します。
なおNodeMCU ESP32S(Narrow ver.)のピン配置は裏側に書いてありますのでブレッドボートを使うときは、こことかここからピン配置図を印刷すると良いでしょう。
(前略) # MH-Z19B CO2 Sensor uart: rx_pin: 16 tx_pin: 17 baud_rate: 9600 sensor: - platform: mhz19 co2: name: "MH-Z19 CO2 Value" temperature: name: "MH-Z19 Temperature" update_interval: 60s automatic_baseline_calibration: false
書き込んだ後は「UARTで通信ができないよん」と言ってすげなくされますが、慌てずいったん電源をオフにして再起動させると(たぶん)うまく計測&通信が始まります。
しばらくすると計測が始まって30分~60分ぐらいで落ち着いてきます。下記がMH-19BからのCO2濃度と温度のデータグラフです。電源を入れなおすと、まずは温度表示が50℃になり、CO2濃度もぴょこんと上昇します。その後しばらくすると温度が下がり始め、CO2濃度も少しずつ低下してゆきます。気温(ちょっと気温とは違う気がしますが)が落ち着いたらCO2濃度も落ち着く感じです。
(このグラフでは3回電源を入れなおしています。)
さてキャリブレーションしていない状態で、換気している室内のCO2濃度が450ppmぐらい*1なので、まあ目安を知るには良いのではないでしょうか。
なおキャリブレーションですが、MH-Z19Bのユーザマニュアル(PDF)のp.9 「第8章 ZERO point calibration」によれば、手動のキャリブレーションは「400ppm以下の環境に20分以上置いた後で、HDピンを0V/GNDに7秒以上繋ぐ」とのこと。(この温暖化の時代に400ppm以下の環境なんてどこに…。)
3. ケースの設計&組み立て
とりあえずちゃんと動いていそうなので、ブレッドボードではなくてケーブル接続に変更して、ケースに入れたいと思います。
3.1. ケース設計
「3Dプリンター(LABISTS X1)老化…」にも書きましたが、円筒形や四角などいろいろデザインをしてみましたが、そもそも印刷が上手くいかないのでしばらく印刷しまくりでしたよ*2。
最終的にこの形に。(縦7cmちょっと × 横5cm弱 × 高さ6cm弱)
www.thingiverse.com
NodeMCU ESP32やらMH-Z19Bやらを格納するので少なくとも上下2分割になりますが、印刷失敗に怯えてできる限り印刷高を低くする設計にして、結局3段4パーツ構成に。
3.2. 付属ケーブルの加工
MH-Z19B付属のケーブルを、NodeMCU ESP32の上面に直にはんだ付けしても良いのですが、まあ再利用とかを考えてピンソケットにケーブルをはんだ付けしてNodeMCU ESP32のピンに挿す構成にしてみました(ケースの設計もそれに合わせて、ピンの場所を切り欠いたりしていますよ)。「MH-Z19B User's Manual」のp.5を参考に付属のケーブルとピンソケットをはんだ付けします。上から見て右端が1番ケーブルです。下の写真ではオレンジ色のケーブルが1番です。下記の表の通りケーブルを加工してNodeMCU ESP32に接続します。
ケーブル番号 | MH-Z19B側 | ESP32側 | NodeMCU ESP32S ピン番号 |
|
---|---|---|---|---|
1 | (アナログ出力) | |||
2 | (無) | |||
3 | GND | ⇒ | GND | 14 |
4 | Vin | ⇒ | 5V | 19 |
5 | UART(RXD) | ⇒ | TX2(GPIO17) | 28 |
6 | UART(TXD) | ⇒ | RX2(GPIO16) | 27 |
7 | (無) |
こんな感じでしょうか*3。あまったケーブルは適当にまとめておきます。
3.3 組み立て
一番下の部品(LowerBody)にNodeMCU ESP32(MH-Z19Bケーブルは接続済み)をはめ込みます。
真ん中の部品(MiddleBody)に中蓋(MiddleLid)をはめ込んだものを、一番下の部品の上に載せます。忘れずにケーブルを穴に通しておきます。
中蓋の上に両面テープでCO2センサー(MH-Z19B)を貼り付けて、付属ケーブルを接続します。
最後に上のパーツ(UpperBody)を被せて出来上がり。
4. おわりに
これで絶対値が測れているかどうかは自信ありませんが、相対的にCO2濃度の上下はわかるようになりました。この2週間ぐらいは上が800、下が500ぐらいです。暑くなってきたので窓を開けたりする機会が増えたので、こんな感じなのでしょうか。梅雨時になってまた締め切るようになったら、様子を見てみます。
1000ppmオーバーになったら赤外線リモコン対応LEDミニライトを赤く点灯させる、とかもチャレンジしてみたい。ではでは。