CO2センサーMH-z19の値をAWS IoTに送る

MH-ET Live ESP32 Minikitを用いて CO2センサーから値を読み出し、 Amazon Web Service (AWS) IoT に MQTT over WebSocketで送るプログラムを試した。備忘録として残しておく。

概要

Platform IDE for Visual Studio Codeでの開発したArduinoプログラム。

MH-ET Live ESP32 Minikit (ESP-WROOM-32)を用いて CO2センサーである MH-z19 のデータを AWS IoT に MQTT over Websocket で送る。

WiFiManagerを用いて WiFi接続を行う。

MH-z19 とはシリアル通信を行って、二酸化炭素濃度と温度を取得する。

WeMos D1 Mini 用の OLED display に二酸化炭素濃度と温度を表示すると共に、MQTT で AWS IoTに送信する。

ハードウェア

使用したハードウェアは以下の通り。

  • MH-ET Live Minikit ESP32
    • ESP32 ボード
    • WeMos D1 mini 互換のピン配列
  • WeMos D1 mini OLED Shield
    • CO2濃度などを表示するため
    • なくてもAWS IoTへのデータ送信には影響しない
  • WeMos D1 mini Dual Base
    • MH-ET Live Minikit ESP32 と CO2センサーボードを接続するため

CO2センサーボード(+ハードウェアリセット回路)

  • WeMos D1 mini Prototype Shield
    • MH-z19との接続のため
    • ハードリセットを行う回路を追加するため
  • CO2センサー MH-z19
    • Aliexpressで購入
    • ケーブルが付属したものを購入
  • コネクタwith基板 [CN125SS-2P]
    • MH-z19のケーブルを接続するための変換基板
    • Aitendoで購入
  • 7pin ピンソケット
    • コネクタ変換基板とPrototype Shieldを接続するため
  • (ショットキー)ダイオード
    • ハードリセットの回路に利用
      • ESP32で必要か吟味していないが、ESP8266 では必要だったのでつけてある。
    • プログラムからハードリセットしないなら不要
  • 配線材料
    • 少々

ボード図・回路図

ボード図

OLEDシールドとDual Baseの間に MH-ET Live ESP32 minikitがある。

回路図

Fritzingファイル

上記の図ではわかりづらい場合には、元となったFritzing のファイルを次のところからアクセス可能なので、それを参照して欲しい。ブレッドボード、回路図のみが有効。プリント基板は無効。

https://github.com/kunsen-an/aws-mqtt-websocket-wifimanager-mh-z19/blob/master/mh-et-live-esp32-mini-mh-z19.fzz

組み立て後の写真

プログラム開発環境

ライブラリ

AWS IoTとの通信に関するライブラリについては AWS IoTにESP32からMQTT over WebSocketでつなぐ を参照のこと。

AWS IoTとのやりとりで利用するJSONの処理には ArduinoJsonを利用した。

デバッグのためのログの処理には、ArduinoLog を利用した。

ArduinoJson

C++ JSON library for IoT. Simple and efficient.

https://arduinojson.org

ArduinoLog

Simple application log library. supporting multiple log levels, custom output & flash memory support.

ライブラリの依存関係とバージョン

利用したライブラリの依存関係およびバージョンは以下の通り。

プログラム

プログラムは GitHubの  /aws-mqtt-websocket-wifimanager-mh-z19 に置いてある。

設定

aws-mqtt-websocket.cpp 中の次のヘッダファイルに相当する設定が必要である。GitHubのリポジトリには含まれていない。

  • myAWSus-east2.h

上記のヘッダファイルでは AWS IoTと通信するために以下のマクロを定義している。

  • MY_AWS_ENDPOINT
  • MY_AWS_IAM_KEY
  • MY_AWS_IAM_SECRET_KEY
  • MY_AWS_REGION

設定方法については、MQTT でAWS IoT にアクセスするための設定 を参照のこと。

ファイル

各ファイルの主な役割は以下の通り。

  • main.cpp
    • メインプログラム
  • wifiManager.cpp
  • aws-mqtt-websocket.cpp
    • AWS IoT と MQTT over Websocketを使って通信するためのコード
    • aws-mqtt-websockets を利用している
  • mh-z19-serial.cpp
    • 二酸化炭素センサー MH-z19 からシリアル通信でCO2濃度と温度を取得するコード
    • ESP32ではハードシリアルを利用する。
  • wemos-oled-display.cpp
    • WeMos D1 mini OLED display に表示するためのコード
    • SparkFun もしくは Adafruitの OLED ライブラリを利用
  • hardReset.cpp
    • GPIO26 と RST端子を接続しておき、MQTTでのコマンドによりハードリセットするためのコード
  • setupDeviceName.cpp
    • デバイス名を設定するための補助コード

動作確認

AWS IoT でのメッセージの受信

AWS IoT consoleのテストでトピックに「iot/#」を入力することで、メッセージが受信されるようになる。

プログラムを動作させていると以下のようにメッセージが表示されるようになるはず。

AWS IoT からの制御

AWS IoT consoleのテストの「トピックへの発行」で次の形式でトピックを指定する。

iot/ESP32のMACアドレスのCの16進表記/control

メッセージに次のJSONを指定して上記のトピックに送るとソフトリセットされる。

{ "Reset": "soft" }

メッセージがESP32に送られると受信した旨のメッセージが送られてからソフトリセットがかかる。

"Start" を含むメッセージが受信されれば、リセットが実行されて初期化が行われたことがわかる。

ちなみに、メッセージ中の"soft"を次のように"hard"にし、ハードリセットの回路が接続されていればハードリセットされるはず。

{ "Reset": "hard" }