M5StickC Plus + MH-Z19C の二酸化炭素計

前回に引き続いて、せっかくなので昨今流行りの二酸化炭素計を作りました。といっても先人の方の書かれたプログラムをほとんどそのまま使っているだけですが……。環境が少しずつマイナーチェンジしているので、対応したときに考えたことの雑なメモを残しておきます。

元ネタ

無印 M5StickC -> Plus へ

公式ドキュメントを見比べてみる。

M5StickC-Plus can use most programs of M5StickC. Due to hardware differences such as screens, please download the M5StickC-Plus library before compiling the program and modify the header file reference in the program as M5StickCPlus.h.

とある。ほとんどの M5StickC プログラムはヘッダファイルさえ書き換えれば Plus でも動くと言っている

-#include <M5StickC.h>
+#include <M5StickCPlus.h>

ピンマップの差分として、無印の G36 ポートが G25/G36 ポートに変更されている。今回は G36 ポートを Analog input として利用したいので G25 を floating とする。接続の際のピン配置は元ネタのままで大丈夫。

+// setup() 中の M5.begin() の後に書く
+pinMode(36, INPUT);
+gpio_pulldown_dis(GPIO_NUM_25);
+gpio_pullup_dis(GPIO_NUM_25);

LCD のサイズが 80 * 160 から 135 * 240 にサイズアップしたので、LCD への描画周りの調整が必要。こちらを参考にした。

ところで、一次ソースと思われる m5stack/m5-docsM5.Lcd.setTextFont についての記述が存在しない(2021/05/08 時点)のはなぜなんでしょうね……?一旦は気にしないことにします。

MH-Z19B -> MH-Z19C へ

データシートを確認する。

パッと見た感じシリアル通信でのデータ取得のコマンド (0x86-) は変わっていないけど、マイナーチェンジということでいくつか違いはある。例えば Detection range の下限が 400ppm, 上限が 5000ppm になっている。が、大気中の CO2 濃度は 400ppm 程度であること、1000ppm を超えると不快感を感じ始めるらしいことを考えると、実用上あまり気にしなくても良さそう。

元ネタで利用されているライブラリ MHZ19は MH-Z19C には対応していないようなので、以下を参考に MHZ_uart に差し替え。

ソースコード

動かしてみて

f:id:wrsn0:20210509005423j:plainf:id:wrsn0:20210509005437j:plain

  • 思った以上に面白いです。今までは "空気がこもっている気がするので窓を開けるか〜" 程度の感覚でやっていたので、この目安が二酸化炭素濃度という指標をもって定量化されるのがうれしい。人が居ると少しずつ ppm がきれいに増加していくし、換気すれば 400ppm 近くまで一気に下がっていきます。
  • IFTTT 連携して換気扇を回すなど、応用例もありそう。
  • 環境問題に関連し、CO2 排出量云々のお話をよく耳にしますが、二酸化炭素濃度も少しずつ上昇トレンドにあるようですね。このままだと20年後にはしょっちゅう換気する世界になっていたりするんでしょうか?
  • あまり見栄えが良くないので、100均でケースがないだろうか…… と探していたところ、3D プリンタで HAT を自作している方を発見。素晴らしい!早速買いました。自分も 3D プリンタ触ってみたいな