M5Stack + MH-Z19BでCO2濃度を測定してみた


きっかけ

職場の換気状況が悪そうな気がしたので…。

開発環境

M5Stackは、Arduino IDEで開発します。
ライブラリやボード情報の導入が必要ですが、解説しているサイトは山のようにあるため割愛します。

結線

レベル変換等は何もなし。以下のように繋ぐだけです。

M5Stack MH-Z19B
P17(Tx2) Rx
P16(Rx2) Tx
5V Vin
GND GND

CO2濃度の測定

UARTで以下のコマンドを送れば良いです。

uint8_t readCommand[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};

9バイトのレスポンスが返ってくるので、そこから濃度が分かります。

読み取り部だけのコードをまとめると、こんな感じ。

uint8_t readCommand[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
uint8_t resetCommand[9] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};
uint8_t response[9] = {};

void loop()
{
    Serial2.write(readCommand, 9);
    Serial2.readBytes(response, 9);
    if (response[0] == 0xFF && response[1] == 0x86)
    {
      ppm = (256 * response[2]) + response[3];
    }
}

ついでにresponse[4] - 40で温度も読めるようです。

キャリブレーション

このセンサーは外気下(400ppm)でキャリブレーションしてからでないと、正しい値になりません。
キャリブレーションする場合は、UARTで以下のコマンドを送れば良いです。

uint8_t resetCommand[9] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};

画面表示

アナログメーター風と、通常の数値表示の2パターン用意しました。

f:id:toripoyo:20200213015945p:plainf:id:toripoyo:20200213015949p:plain

コード

GitHubをご参照ください。
アナログメーター風 ディジタルメーター

参考

M5Stackで家とオフィスの二酸化炭素濃度を計測してみた
オフィス換気のため Co2 センサー作り ー Arduino, BME280, MH-Z19編