esp32をソフトウエアでリセットするには?
家庭菜園の水やりを2台のesp32で管理しているのだが設定時間になっても水やりを停止しないことがあったのでesp32をウエブを使ってソフトウエアリセットすることにしました。
水やりが止まらない
カズは温度や、気圧、EC値など水耕栽培に必要なデータをgooglesheetに記録するようにしていますがwifiを利用すると利用できるピンが限られてきます。
そのため2台のesp32をESPNOWで情報共有しながら運用していますがある日、一つのesp32は正常に動作していたもののもう一台のesp32では水やりが停止しないということがありました。
googlesheetに記録するデータは栽培に必要な基礎データだったため原因不明ですがこのことを教訓にシステムの動作異常の場合にはインターネットを使ってソフトウエアリセットを行うようにしてみたいと思います。
esp32のリセット
esp32のソフトウエア リセットはESPクラスで用意されているrestart()で行います。
ESP.restart()
とても簡単ですね。
ということでサンプルとして5秒毎にリセットしてntpサーバから現在時刻を取得してみます。
水耕栽培では時間で諸々の動作を制御するのでリセットして最初にすることは現在時刻の取得ですね。
esp32のリセットとntp時刻合わせ
スケッチでは最初に必要なヘッダファイルと設定を行い、セットアップでntpサーバから現在時刻を取得し5病後にesp32の再起動とntp時刻を取得、この繰り返しで動作の安定性を確認しています。
試した結果は良好で問題はありませんでしたがWiFiに繋がらない場合はルーター側の設定状況(WPA,WPA2などのセキュリティアクセス)が可能かどうか確認することも必要かも知れません。
#include <WiFi.h> #include <WiFiClientSecure.h> WiFiClientSecure client; #include <time.h> const char* ssid = " アクセスポイント名"; const char* password = "パスワード"; //======= time const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3600*9; int cnt = 0; void setup() { Serial.begin(115200); //=========get time Serial.printf("Connecting to WiFi AP "); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" CONNECTED"); configTime(gmtOffset_sec,0, ntpServer); delay(2000); WiFi.disconnect(true); WiFi.mode(WIFI_OFF); time_t t; struct tm *tm; static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"}; t = time(NULL); tm = localtime(&t); Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec); } void loop() { cnt++; Serial.println(cnt); if(cnt == 5){ cnt = 0; ESP.restart(); } delay(1000); }
esp32のプログラム リセット まとめ
リセット直後の現在時刻はets Jun 8 2016 00:22:57 ですが、ntpサーバーと同期した現在時刻は2022/05/11(Wed) 13:16:29 ですので初期化・再起動していることが判ります。
時刻が同期しない場合には待機時間を2秒としていますが5秒ぐらいにしてみるのもいいかも知れません。
最初は1秒の待機時間でしたが稀に同期しないことがあったので2秒としました。
これでesp32のソフトウエア リセットの動作確認が出来ましたので実際のコードに組み込んで動作の信頼性に繋げたいと思います。