ESP32で NTP時計+温湿度モニター+ZabbixSender を作った (AHT10, SSD1306 OLED)

秒針付きNTP時計と、AHT10センサーで取得した温湿度をOLED SSD1306 ディスプレイに表示するやつを作りました。

また、取得した温湿度はZabbixにも送りつけます。


接続

OLEDディスプレイの裏にあるチップ抵抗のジャンパの位置を変えると、I2Cのアドレスをデフォルトの0x3Cから0x3Dに変えることができます。小さくて地味に難しかった。

ESP32は21番がSDA, 22番がSCLです。OLEDもAHT10も3.3Vに繋ぎました。

全て並列に繋げばOKです


Zabbixサーバーの設定

ホストの作成

Configuration -> Hosts から 右上の Create Host をクリック

Host name は ESP32_clock_and_temp で、Groups は Templates/Modules にしました。

アイテムの作成

作成したホストのitemsをクリック

こんな感じに温度と湿度のアイテムを作ります

あとはZabbixのダッシュボードでグラフを表示させればOK


プログラム

汚いプログラム。半分ぐらいコピペとGPT-4oです。

使うライブラリはincludeのとこ見てください。ESP32ZabbixSender以外はPIOのLibrariesから検索すると出てきます。

ESP32ZabbixSenderはこれ。ただしなぜか名前がESP8266のままなので、ESP8266ZabbixSender.cpp, ESP8266ZabbixSender.hをESP32ZabbixSender.cpp, ESP32ZabbixSender.hにリネームする必要がありました。
PIOなら、それらをlibフォルダに投げれば設置完了です。

・時計のモニターは1秒で更新 (秒針動かすため)
・NTPサーバーと同期する時間は1024秒 (この秒数は変えてOK)
・温湿度は30秒ごとに取得 & モニター更新 (この秒数は変えないで)
・Zabbixサーバーに2分に1回送信
・delayじゃなくてlight sleepさせる(消費電力がかなり減った)

・AHT10の初期化はよく失敗する。リセットコマンド入れても無駄で、USBを物理的に差しなおさないとダメだった

・Wifi使う直前にsleep入ってるとこういう変なエラーが出て失敗するので、10秒前のループからsleepじゃなくてdelayに変更。

[WiFiUdp.cpp:172] beginPacket(): could not get host from dns: 11
[WiFiUdp.cpp:185] endPacket(): could not send data: 118

更に失敗したときはWifiを再接続して30秒後に再試行します。

・loop()内のどこかで1回はdelay(50); (最低限は1らしいけど効かなかったので50にした) を呼び出さないとウォッチドッグタイマ(WDT)にリセットされる

こんな出力でリセットがかかります

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

参考
https://lang-ship.com/blog/work/esp32-freertos-l03-multitask

ESP32には2コアあって、コア名PRO_CPUは無線の処理担当でWDT有効、APP_CPUはloop()関数担当でWDT無効らしい。
ウォッチドッグタイマのリセット条件はdelay()関数を1以上で呼び出すこと。

なぜWDT無効なはずのloop()関数側でdelay呼び出すとリセットされなくなるのかは謎です。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です