Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: ESP32+MH-Z19CでCO2モニター構築(2) [キャリブレーション編]

Sympapaです。

1週間ほど前に二酸化炭素センサー:MH-Z19CとESP32を組み合わせ、Home AssistantのESP Homeアドオンを使ってHome Assistantで使える二酸化炭素モニターを構築しました。
sympapa.hatenablog.com


前回はMH-Z19Cを2個購入してリビングと自分の部屋の二酸化炭素濃度をモニターし始めたんですが、なかなか気に入ったのでもう1個MH-Z19Cを追加購入しました。前回は2個が同等の値を示していたので「キャリブレーションしなくていいか」と思ったのですが、今回追加で購入したMH-Z19Cは前の2個より1.8倍くらい高い値を示しています。そして部屋にずっと誰もいない状態でも550ppmくらいまでしか下がりません。
別のESP32に繋いでも同じなのでセンサー個体の問題と判断し「やっぱりキャリブレーションが必要か」ということになりました。ロットは同じみたいなんですけどねぇ。。。

そんなワケでキャリブレーションしていきます。

■MH-Z19Cのキャリブレーションの仕様

キャリブレーション方法をググると、前バージョンであるMH-Z19Bの情報が多く出てきます。
MH-Z19BのCO2濃度測定レンジは0ppm-5000ppmでしたがMH-Z19CのCO2濃度測定レンジは400ppm-5000ppmとなっていて測定レンジが異なるようです。なのでMH-Z19Cでは400ppm=Zero pointということになっています。
MH-Z19BのDATA SHEETではZero pointは400ppm以下の環境でキャリブレーションを実施し、Span pointは1000-2000ppmの環境でキャリブレーションするということになっていましたが、MH-Z19CのDATA SHEETからはSpan pointのキャリブレーションの記述は消えています。

https://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf

https://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19c-pins-type-co2-manual-ver1_0.pdf


「1ポイントのキャリブレーションで大丈夫なんかいな?」と思いつつ、実際のところ一般人には安定して1000-2000ppmの環境を作ることなど出来ないので、どのみちZero pointキャリブレーションしか出来ないとは思います。


そしてMH-Z19にはバージョンに関わらずオートキャリブレーション機能があってこれを有効にしておくと、「24Hr中の一番低い値」を400ppmということにして24Hrに1回キャリブレーションするそうです。私はこの機能はOFFにして使用していますが、人が居なくなると数時間すれば二酸化炭素濃度は400ppmくらいまで下がるようなので、仕事で出かける平日であればオートキャリブレーションでZero pointキャリブレーションしても良さそうですね。ただ、休日に一日中家に居る日があったりすると、その日のキャリブレーションはおかしなことになりそうです。
手動でZero pointをキャリブレーションする場合は、以下の方法があります。


【方法1】
1) 400ppm以下の場所で20分動作させる。
2) HDピンとGNDを7秒間短絡させる。するとこの時を400ppmとしてキャリブレーションされる。


【方法2】
1)400ppm以下の場所で20分動作させる。
2)Calibrate Zero Point (ZERO)コマンドを呼び出す。


自分の息(二酸化炭素)の影響を与えずに7秒間ピンを短絡させるのは、長いケーブルでも繋がない限り結構至難の業のように思います。
ESP HomeではZero pointキャリブレーションのコマンド呼び出しにも対応しているので、今回はこれを使いたいと思います。
esphome.io


■ESP Homeの設定

ESP Homeでは service: mhz19_calibrate_zero として、Zero pointキャリブレーションがサービスとして提供されています。
このサービスをAPIでHome Assistantから呼び出せるように設定します。
この例ですと、Home Assistant側に"ESPHome: (ESP32の名前)_mhz19_calibrate_zero”というサービスが現れ、それを実行することでZero pointキャリブレーションが発動します。
ESP Home簡単すぎる素敵。

# Enable Home Assistant API
api:
  services:
    - service: mhz19_calibrate_zero
      then:
        - mhz19.calibrate_zero: MH_Z19_ESP32
        
# MH-Z19B CO2 Sensor
uart:
  rx_pin: 16
  tx_pin: 17
  baud_rate: 9600

sensor:
  - platform: mhz19
    id: MH_Z19_ESP32
    co2:
      name: "MH-Z19_ESP32_CO2_Value"
    temperature:
      name: "MH-Z19_ESP32_Temperature"
    update_interval: 60s
    automatic_baseline_calibration: false

■いざキャリブレーション

400ppm以下の環境を用意しろとのことなので、窓の外に設置しキャリブレーションすることにしました。

我が家はド田舎なのでこれで十分に400ppm以下のはずです(笑)
今回購入したものと前回購入した2個のMH-Z19Cを全部キャリブレーションします。
キャリブレーション前に400ppm以下の環境で20分間動作させろとのことなんですが、今回購入分はやはり外に向けて作動させても550ppm程度までしか下がりませんでした。
20分程度動作させた後でHome Assistantからサービス”ESPHome: (ESP32の名前)_mhz19_calibrate_zero”を呼び出しキャリブレーションします。

■結果は。。。

Zero pointはちゃんと400ppmになったしキャリブレーション前よりはマシですが、今回購入したもの(一番上)はそれでもまだ30%ほど高い値を示しています。。。


とか思ってあーだこーだ弄ったり放置したりまた弄ったりしている内(その間10時間くらい)に何故かそこそこいい感じになってました(笑)
まぁそれでも3台で100~200ppmのレンジがありますけどね。

もしかしてエージング要るの!??
ドリフトした感があるので今回購入したMH-Z19Cを再度Zeroキャリブレーションしてみましたが、キャリブレーション前と同じくらいの値が出ています。


結局、今回購入したMH-Z19Cの値が最初の内はキャリブレーションしても高かった原因は判らないままです。
ESP32へ給電する電源を変更したりもしたのでそのあたりの影響?なんてことも思いました。でも使用するESP32を入れ替えても同じだったし、そもそも電源の問題で一見ちゃんと動いているのに値だけおかしくなるとかあったりあるのかな?
ちょっと様子見ですね。


それでは。