takashiskiのブログ

覚書の殴り書き

MH-Z14使ってCO2濃度はかった(UART, ESP32)

CO2濃度測定して表示するとこまでやったので書きます。

f:id:takashiski:20170604164700j:plain

使ったのはMH-Z14Aと、例のOLED付ESP32です。

前の記事の続編的部分も一部あります。 takashiski.hatenablog.com

MH-Z14A

さて、今回使用したMH-Z14Aですが、なんとインターフェースが4つあります。

  1. デジタル出力
  2. アナログ出力
  3. PWM
  4. UART

正直オーバースペック感ありますが、相手方のインターフェースに寄らず使えるのでよいことであります。 ちなみに、インターネット上で使用例が多いMH-Z19はPWMとUARTのみです。 動作電圧は4.5-5.5Vなので、5V出力が必要です。UARTレベルは3.3Vです。 ここらへんの要件はMH-Z19とほとんど変わりません。

今回は面倒ESP32のUARTの使い方を見たかったのでUARTを使います。 思いっきりTXRXピンが存在するので楽勝ですね。 MH-Z14A側は、ピンが実装されておらず自分で実装する必要があります。 全部で19ピン(9ピン+10ピン)ありますが、16-19番の4ピンか、13-15,2番の4ピンだけがUARTに必要なピンです。

4線接続するだけなので非常に簡単です。

実装

悩んだ部分はUART接続くらいです。ArduinoMegaではSerial1とかてきとーな名前で使えましたが、ESP32ではどうやらだめなようです。 調べたところ、自動的に宣言されないようなので明示的に以下のように宣言してあげればよいとわかりました。

HardwareSerial Serial1(0);

0番を使えばいいようです。

これで、あとはSerial1に対して濃度を要求するコマンドを発行して、濃度を受け取ればよいです。 MH-Z14Aのコマンドリストが見つからなかったので、代わりに見つかったMH-Z14のコマンドを採用したところ、今のところそれっぽく動いています。 キャリブレーションはなかなか面倒なようなので(400ppmで一定の環境に20分間置き続けるとか)今回は無視します。 今回は「そろそろ換気したほうがいいんじゃない?」程度の使い方想定なので、十分でしょう。

表示は前回同様squix78のesp8266-oled-ssd1306を使いました。

コード

忘れず以下をインストールしてください。 ライブラリマネージャからも見つかります。

github.com

60秒ごとにCO2濃度を測定してOLEDに表示するだけの、特別なことは一切していないコードです。 3分間プレヒートしてねってことでしたので、setup()の最後で3分待ってます。 loop内のCO2値の読み取りの処理がなんか変ですけど気にしないでください(何か意図があって書いた気がしたけど忘れた)

CO2 measurement module MH-Z14A for ESP32 arduino c …

その他

TXRXに接続したままだと、プログラムの書き込みに失敗しますので書き込むときは抜いてください。

組み立てや検証のために、手元で動作させると思いますが、人間の呼気のCO2濃度は非常に高いので、直接息を当てないようにしましょう。非常に高い値が出やすい傾向にあります。

写真とかコードは準備してるうちにこの記事が闇に葬られそうな感じがしたので、後で載せます。

参考文献

MH-Z14 Intelligent Infrared Gas Module User’s Manual

MH-Z14 CO2 Module

MH-Z14A User’s Manual

MH-Z19 User’s Manual

機材

MH-Z14Aにはピンヘッダが付属していませんでした。 必要に応じてピンヘッダもしくはピンソケットを購入してください。