ESP-NOWを使った温度測定用スケッチとスクリプト

スケッチやサーバー側スクリプト。データベース定義については以前載せたものと同様なのでこちらを参照のこと。このページの本文はこちら

ESP32_espnow_slave3.ino

Arduino core for ESP32でビルドした。バージョン番号がよく分からないのだが、2018年4月15日にgithubからそっくりzipで落として、…\[aruino-src]\hardware\espressif\esp32 に展開して使っている。esp_now.hは、…\tools\sdk\include\esp32 内にある。

追記

WiFiアクセスポイントに接続できなくなった

最初のスケッチで動かし始めてから4.5日間ほど経過した時点で、スレーブ側からWiFiルーターへの接続が失敗するようになった。コントローラからのESP-NOWによる接続は正常に行われているようで、スレーブからWiFiルーターへの接続中(実際は試行中)を示すLEDも定期的に点灯しておりESP-NOWの受信動作自体は持続していた模様。
接続不能になるまでのデータはサーバーのデータベーステーブルに格納されており、約27600行が格納されていたから、同じだけの回数WiFi.begin() による接続が成功していたことになる。

スレーブ側をリセットしたり電源をオフにしても治らないので、別のESP32モジュールに切り替え、MACアドレスを変更する都合でコントローラのスケッチも入れ替えてESP-NOWの実験は継続することにした。

問題のESP32モジュールにWiFi接続のための単純なスケッチを入れて試してみてもルーターに接続できなかった。調べてみるとWiFi.begin() による接続が失敗していた。

WiFi.status() の戻り値がしばらくの間は WL_DISCONNECTED ( == 6) を返すが、その後 WL_NO_SSID_AVAIL ( == 1) となって回復せず、スケッチが接続をあきらめていることが分かった。発生した状況は違うが、以前ESP-WROOM-02相互間での接続がうまくいかなかったときに似ている。

対策とし、現在のスケッチのように、WiFi.begin(); の前に、WiFi.disconnect(); を入れることにした。

そして、アクセスポイントへの接続が成功した場合は常にWiFi.disconnect(); してからESP-NOWの初期化を行うようにした。接続不能になった理由は不明だが、WiFi接続に関する内部状態が妙な具合になってしまうことがあるんだろう。モジュールの変更とスケッチの書き直し後、約8時間ほどで動作を再開した。

ESP_espnow_ctrl5.ino

ESP8266 Core for Arduino 2.4.1でビルド。I2Cを使った温度センサーインタフェース用の“hdc1000_bme280.h”については、こちらのページを参照のこと。

store_data.php

すべてのコントローラからのデータは単一のテーブル(envdata10) と、MACアドレスごとのテーブルに格納している。

各テーブルは、
mysql> create table envdata10 like envdata;
といった方法で作成した。このスクリプトが利用している envdata_db.php はこちらを参照。insert_array() 内で $_GET[] から値を取得する部分はムダだが問題はない。

MACアドレス先頭3バイト(Espressif社を表す)の種類も増えてきた。