先に断っておきますが、この文書の目的は私のメモです。 ここで述べるMQTTデバイスは一度作ったら数か月、あるいはそれ以上連続稼働させる装置です。 数か月先になってメンテナンスの必要が生じたときに、何も迷うことがないように記録を 残すことが目的です。
一定周期で温度・湿度・気圧をPublishするデバイスです。 ESP32-WROOM-32とBME680を使用。ソフトウェアはMicropythonで記述してあります。
ハードウェアはこんな感じです。 SwitchScience製のESP32-WROOM-32開発基板と、おなじくSwitchScience製のBME680センサモジュールを搭載です。 あと部品箱の底に眠っていたおそらく10年物のLEDを3粒添えました。 土台は秋月電子通商の片面基板です。
ここに諸元をまとめておく
Bosch製。気温・湿度・気圧・VOCを測定可能なMEMSセンサ。 SwitchScience製のモジュールに搭載されている。だいたい3000円位した。 中身一緒なので秋月電子通商のモジュールも(配線を合わせれば)使用可能。
LEDが3つ。スイッチはなし。
LEDの電流制限抵抗は470Ωです。たぶん。
GPIO No. | 接続先 |
---|---|
17 | LED_ERR |
18 | LED_STAT |
19 | LED_DEBUG |
25 | SCL |
26 | SDA |
回路図はないよ。電源はモジュールの3.3V電源同士をわすれずに繋いでね。
写真では見えませんが、SCL/SDAのプルアップ抵抗10kΩ×2本がESP-WROOM-32開発基板の 下に実装してあります。
このソフトウェアはMicropythonで記述してます。
ソフトウェアは誰もリセットボタンを押してくれない環境で使うことを想定しないといけないです。この手の開発は異常系を作りこんでこそ(十分作りこめたとは言ってないです…)。
micropython-libの一部。micropython/umqtt.simple/umqtt/simple.pyを使用しました。200行程のスクリプトでMQTTの実装ができてしまうなんて、いかにMQTTがシンプルなプロトコルであるかわかる。しゅごい。
データシートとにらめっこせずに短期間で開発できたのはこのライブラリのおかげです。 BME680.pyをつかいました。
メインループの処理の中でWiFi(WLAN)の接続状態を評価しています。 接続が切れているとisconnectedがFalseを返すようになります。 WiFiアクセスポイントが勝手に止まる状況は移設の際に電源を抜かれるくらいしか 思いつきませんが、ともかく、それを検知したら自分自身をリセットするようにしています。 ただしすぐにリセットしても元の木阿弥なので1分待ってからです。 1分も待てばWiFiアクセスポイントは再起動が完了しているだろうという目論見です。 だめならまた再起動すればよいので。
wlan = network.WLAN(network.STA_IF)
# (ものすごい中略)
while True: # ずっと繰り返す処理
if not wlan.isconnected():
# AP切断
led_err.on() # ERR_LEDを点灯させて...
time.sleep(60) # 60sec...
machine.reset() # リセット
こっち。
ライセンスはNYSLまたはWTFPLのいずれか好きなほうを使ってください。ただし対象は上述のリンクから飛べるmain.pyに限ります。
別途MQTTサブスクライバが必要なんですが、サブスクライバで適切にログを採取できれば、 こんな感じのグラフを描くことができます。
お正月から暖房をつけずにやせ我慢するとある一室の温度ログ一週間分です。
main.py, umqtt/simple.py, bme680.pyをampy等でESP32にputして動かしてください。 boot.pyはデフォルトのままで大丈夫です。
(c)2023 ぺいるだすと