[ESP32]Wifi切断時に自動再接続する方法

ESP32

Wifi切断時に自動で再接続できるようにする方法

サンプルコード(コピペで動作)

使用API:WiFi.reconnect() / WiFi.begin()

[SOLVED] Reconnect ESP32 to Wi-Fi Network After Lost Connection | Random Nerd Tutorials
Reconnect your ESP32 to a Wi-Fi network after losing the connection. Reconnect when the ESP32 loses Wi-Fi signal, router...
#include <WiFi.h>

const char* ssid     = "xxxxxx";
const char* password = "xxxxxx";

unsigned long previousMillis = 0;
unsigned long interval = 30000;
uint16_t  wifistatus = 0;

void setup()
{
    Serial.begin(115200);
    delay(10);

    // We start by connecting to a WiFi network

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

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

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void loop()
{
  wificheck();

  unsigned long currentMillis = millis();
  // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
    Serial.print(millis());
    Serial.println("Reconnecting to WiFi...");
    WiFi.disconnect();
    WiFi.reconnect();
    previousMillis = currentMillis;
  }
}

void wificheck()
{
  while (WiFi.status() != wifistatus) {
    wifistatus = WiFi.status();
    switch (wifistatus) {
      case WL_NO_SHIELD:        Serial.println("WiFi NO_SHIELD.");        break;
      case WL_IDLE_STATUS:      Serial.println("WiFi IDLE_STATUS.");      break;
      case WL_NO_SSID_AVAIL:    Serial.println("WiFi NO_SSID_AVAIL.");    break;
      case WL_SCAN_COMPLETED:   Serial.println("WiFi SCAN_COMPLETED.");   break;
      case WL_CONNECTED:        Serial.println("WiFi CONNECTED.");        break;
      case WL_CONNECT_FAILED:   Serial.println("WiFi CONNECT_FAILED.");   break;
      case WL_CONNECTION_LOST:  Serial.println("WiFi CONNECTION_LOST.");  break;
      case WL_DISCONNECTED:     Serial.println("WiFi DISCONNECTED.");     break;
      default:                  Serial.println("WiFi STATUS unknown!!");
    }
  }
}

[ssid]と[password]の内容は変更します。

const char* ssid     = "xxxxxx";
const char* password = "xxxxxx";

Wifi状態がわかるように状態を表示させるための関数wificheck()を用意しました。

確認方法

サンプルコードを動作させると、以下のようにシリアルポートへ表示されます。

wifi自動接続確認画面

Wifiルータの無線を再起動したタイミングで、「WiFi DISCONNECTED.」と表示され、「Reconnecting to WiFi…」で再接続処理ができていることがわかりました。

そして、「WiFi CONNECTED.」で再接続できました。

考察

接続が切れて再接続する時、millis()を使用して30秒間隔で再接続するようにしています。

 unsigned long currentMillis = millis();
  // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {

millis()とは、以下のような説明がありました。

Arduinoボードがプログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。約50日間でオーバーフローし、ゼロに戻ります。

Arduino 日本語リファレンス

ということは、オーバーフローしたタイミングで[currentMillis]を取得すると、[previousMillis]より小さくなるため、2つの差が[interval]より大きくならず再接続処理は実施しません。

ただし、次の30秒では実施できるため、すぐに再接続しないと困るようなシステムでない限り大丈夫でしょう。

まとめ

再接続処理をいれておけば、Wifiルーターを再起動した時も再度接続してくれます。この処理は必須で入れておいた方が良いでしょう。

コメント

タイトルとURLをコピーしました