[РЕШЕНО] Повторное подключение ESP32 к Wi-Fi после потери соединения

Это краткое руководство показывает, как можно переподключить ESP32 к сети Wi-Fi после потери соединения. Это может быть полезно в следующих ситуациях: ESP32 временно теряет сигнал Wi-Fi; ESP32 временно выходит из зоны действия Wi-Fi роутера; роутер перезагружается; роутер теряет интернет-соединение или в других подобных ситуациях.

ESP32 переподключение к Wi-Fi после потери соединения

Вам также может быть интересно посмотреть WiFiMulti. Эта функция позволяет зарегистрировать несколько сетей (комбинации SSID/пароль). ESP32 подключится к сети Wi-Fi с самым сильным сигналом (RSSI). Если соединение будет потеряно, он подключится к следующей сети в списке. Читайте: ESP32 WiFiMulti: подключение к самой сильной сети Wi-Fi (из списка сетей).

Переподключение к сети Wi-Fi после потери соединения

Для переподключения к Wi-Fi после потери соединения вы можете использовать WiFi.reconnect() для попытки переподключения к ранее подключённой точке доступа:

WiFi.reconnect()

Или вы можете вызвать WiFi.disconnect() с последующим WiFi.begin(ssid, password).

WiFi.disconnect();
WiFi.begin(ssid, password);

В качестве альтернативы, вы также можете перезагрузить ESP32 с помощью ESP.restart(), когда соединение потеряно.

Вы можете добавить что-то вроде фрагмента кода ниже в loop(), который периодически проверяет, подключена ли плата, и пытается переподключиться, если соединение было потеряно.

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

Не забудьте объявить переменные previousMillis и interval. Переменная interval соответствует периоду времени между каждой проверкой в миллисекундах (например, 30 секунд):

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

Вот полный пример.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/solved-reconnect-esp32-to-wifi/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <WiFi.h>

// Replace with your network credentials (STATION)
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

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

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  Serial.print("RSSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  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;
  }
}

Исходный код

Этот пример показывает, как подключиться к сети и проверять каждые 30 секунд, есть ли ещё подключение. Если подключения нет, он отключается и пытается переподключиться снова.

В качестве альтернативы, вы также можете использовать Wi-Fi Events для обнаружения потери соединения и вызова функции для обработки этой ситуации (см. следующий раздел).

ESP32 Wi-Fi Events

ESP32 способен обрабатывать различные события Wi-Fi. С помощью Wi-Fi Events вам не нужно постоянно проверять состояние Wi-Fi. Когда происходит определённое событие, автоматически вызывается соответствующая функция-обработчик.

Следующие события очень полезны для обнаружения потери или восстановления соединения:

  • ARDUINO_EVENT_WIFI_STA_CONNECTED: ESP32 подключился в режиме станции к точке доступа/хотспоту (вашему роутеру);

  • ARDUINO_EVENT_WIFI_STA_DISCONNECTED: ESP32 в режиме станции отключился от точки доступа.

Перейдите к следующему разделу, чтобы увидеть пример применения.

Переподключение к сети Wi-Fi после потери соединения (Wi-Fi Events)

Wi-Fi Events могут быть полезны для обнаружения потери соединения и попытки переподключения сразу после этого (используется событие ARDUINO_EVENT_WIFI_STA_DISCONNECTED). Вот пример кода:

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/solved-reconnect-esp32-to-wifi/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <WiFi.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Connected to AP successfully!");
}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Disconnected from WiFi access point");
  Serial.print("WiFi lost connection. Reason: ");
  Serial.println(info.wifi_sta_disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin(ssid, password);
}

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

  // delete old config
  WiFi.disconnect(true);

  delay(1000);

  WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);
  WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
  WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

  /* Remove WiFi event
  Serial.print("WiFi Event ID: ");
  Serial.println(eventID);
  WiFi.removeEvent(eventID);*/

  WiFi.begin(ssid, password);

  Serial.println();
  Serial.println();
  Serial.println("Wait for WiFi... ");
}

void loop(){
  delay(1000);
}

Исходный код

Как это работает?

В этом примере мы добавили три события Wi-Fi: когда ESP32 подключается, когда получает IP-адрес и когда отключается: ARDUINO_EVENT_WIFI_STA_CONNECTED, ARDUINO_EVENT_WIFI_STA_GOT_IP и ARDUINO_EVENT_WIFI_STA_DISCONNECTED соответственно.

Когда станция ESP32 подключается к точке доступа (событие ARDUINO_EVENT_WIFI_STA_CONNECTED), вызывается функция WiFiStationConnected():

WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);

Функция WiFiStationConnected() просто выводит сообщение о том, что ESP32 успешно подключился к точке доступа (например, вашему роутеру). Однако вы можете изменить функцию для выполнения любой другой задачи (например, зажечь светодиод для индикации успешного подключения к сети).

void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Connected to AP successfully!");
}

Когда ESP32 получает свой IP-адрес, выполняется функция WiFiGotIP().

WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);

Эта функция просто выводит IP-адрес в монитор последовательного порта.

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

Когда ESP32 теряет соединение с точкой доступа (ARDUINO_EVENT_WIFI_STA_DISCONNECTED), вызывается функция WiFiStationDisconnected().

WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

Эта функция выводит сообщение о потере соединения и пытается переподключиться:

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
  Serial.println("Disconnected from WiFi access point");
  Serial.print("WiFi lost connection. Reason: ");
  Serial.println(info.disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin(ssid, password);
}

Заключение

Это краткое руководство показывает различные способы переподключения ESP32 к сети Wi-Fi после потери соединения.

Мы рекомендуем вам ознакомиться со следующим руководством, чтобы лучше понять некоторые из наиболее часто используемых функций Wi-Fi для ESP32:

Источник: :doc:`[SOLVED] Reconnect ESP32 to Wi-Fi Network After Lost Connection <../solved-reconnect-esp32-to-wifi/index>` (Random Nerd Tutorials)