ESP32マイコンボードとMAX7219 LEDディスプレイ4連x2でNTPクロックを作ってみた の続き Wi-Fi自動再接続

Wi-Fiが見つからない
©いらすとや.

以前に作成したESP32マイコンボードとMAX7219 LEDディスプレイ4連x2でNTPクロックを作ってみたの時計は現在もデスク用の時計として活躍している。ただし、Wi-Fi接続が切れた後に再接続する処理を入れなかったので、何かあってWi-Fi接続が切れるとその後はずっとNTPサーバから正しい時刻を取得できなくなっていた。そして、この状態になると日付表示のスクロールが異常に遅くなったり時間がどんどん狂っていく。発生する症状が異なることがあって、日付表示のスクロールがあまり遅くならずに時刻だけ狂う場合がある。そのとき、見た目で異常が判らないので時計が正常に動作しているものだと思って時刻を見てしまうと酷い目に合うことも。
つまり実害があるので、やはりWi-Fiの再接続処理だけは入れておくべき。

[SOLVED] Reconnect ESP32 to Wi-Fi Network After Lost Connection という記事に書いてあったコードを利用させて貰った。

変更前のWi-Fi接続の処理

#include <WiFi.h>

#define SSID "APのSSID"
#define WIFIKEY "APのKey"

void setup() {
  WiFi.begin(SSID, WIFIKEY);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
  }
}

void loop(){
  //ループの処理 Wi-Fi関係は無し
}

Wi-Fi周りの処理は起動時に単純にAPに接続して終わりなので何かあって接続が途切れるとその後は切れたまま。

変更後のWi-Fi接続の処理

#include <WiFi.h>

#define SSID "APのSSID"
#define WIFIKEY "APのKey"

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  WiFi.begin(SSID, WIFIKEY);
  delay(2000);
}

void setup() {
  WiFi.disconnect(true);
  delay(1000);

  //Wi-Fi接続切れで発生するイベント ↑の任意関数WiFiStationDisconnected()を呼ぶ
  WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

  WiFi.begin(SSID, WIFIKEY);
}

void loop(){
  //ループの処理 Wi-Fi関係は無し
}

接続切れが発生するとイベントが発生して再接続のための関数が実行される。ループ内でゴチャゴチャやらなくて済むのでカンタン。

なお、Wi-Fi接続切れの時間が短い場合(1分以内程度?)は再接続されて正常な時計の動作に戻りますが、Wi-Fi接続が切れた状態で長い時間再接続できなかった場合は必ずではありませんが時計がハングアップしてしまうことがあります。この場合はWi-Fiの再接続も行われません。電源入れ直しが必要です。

関連記事: