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 のファイルを次のところからアクセス可能なので、それを参照して欲しい。ブレッドボード、回路図のみが有効。プリント基板は無効。
組み立て後の写真
プログラム開発環境
- Windows 10
- PlatformIO IDE for VSCode
- PlatformIO IDE for VSCode のインストールについては、PlatformIO IDE for VSCode でESP32のプログラム開発 を参照のこと
- ライブラリインストールについては、PlatformIO IDE for VSCode へのArduinoライブラリのインストール を参照のこと
ライブラリ
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
ライブラリの依存関係とバージョン
利用したライブラリの依存関係およびバージョンは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Dependency Graph |-- <ArduinoJson> 5.13.2 |-- <WebServer> 1.0 | |-- <FS> 1.0 | |-- <WiFi> 1.0 |-- <WifiManager> 0.12 | |-- <DNSServer> 1.1.0 | | |-- <WiFi> 1.0 | |-- <WebServer> 1.0 | | |-- <FS> 1.0 | | |-- <WiFi> 1.0 | |-- <ESPmDNS> 1.0 | | |-- <WiFi> 1.0 | |-- <WiFi> 1.0 |-- <Wire> 1.0 |-- <SparkFun Micro OLED Breakout> | |-- <SPI> 1.0 | |-- <Wire> 1.0 |-- <SPI> 1.0 |-- <DNSServer> 1.1.0 | |-- <WiFi> 1.0 |-- <Paho> 1.0.0 | |-- <SPI> 1.0 | |-- <WiFi> 1.0 |-- <PubSubClient> 2.6 |-- <WiFi> 1.0 |-- <WebSockets> 2.1.0 | |-- <SPI> 1.0 | |-- <WiFiClientSecure> 1.0 | | |-- <WiFi> 1.0 | |-- <WiFi> 1.0 |-- <ArduinoLog> 1.0.2 |-- <aws-mqtt-websockets> | |-- <WebSockets> 2.1.0 | | |-- <SPI> 1.0 | | |-- <WiFiClientSecure> 1.0 | | | |-- <WiFi> 1.0 | | |-- <WiFi> 1.0 | |-- <aws-sdk-arduino-ESP32> | | |-- <WiFiClientSecure> 1.0 | | | |-- <WiFi> 1.0 | | |-- <WiFi> 1.0 |
プログラム
プログラムは 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
- WiFiManager を使って、WiFi接続をする
- 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" }