ESP32: Полезные функции библиотеки Wi-Fi (Arduino IDE)

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

Это не ново. Существует множество примеров работы с Wi-Fi на ESP32. Тем не менее, мы решили, что будет полезно собрать воедино наиболее используемые и практичные функции Wi-Fi для ESP32.

ESP32 Полезные функции библиотеки Wi-Fi Arduino IDE

Подключение библиотеки Wi-Fi

Первое, что необходимо сделать для использования функциональности Wi-Fi ESP32 – это подключить библиотеку WiFi.h в ваш код:

#include <WiFi.h>

Эта библиотека автоматически устанавливается при установке дополнения ESP32 в Arduino IDE. Если у вас не установлена поддержка ESP32, вы можете следовать руководству:

Если вы предпочитаете использовать VS Code + PlatformIO, вам просто нужно создать новый проект с платой ESP32, чтобы иметь возможность использовать библиотеку WiFi.h и её функции.

Режимы Wi-Fi ESP32

Плата ESP32 может работать как Wi-Fi станция, точка доступа или и то, и другое одновременно. Для установки режима Wi-Fi используйте WiFi.mode() и укажите желаемый режим в качестве аргумента:

WiFi.mode(WIFI_STA)

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

WiFi.mode(WIFI_AP)

режим точки доступа: станции могут подключаться к ESP32

WiFi.mode(WIFI_AP_STA)

точка доступа и станция, подключённая к другой точке доступа

Wi-Fi станция

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

ESP32 режим станции подключение к роутеру

Роутер подключён к интернету, поэтому мы можем запрашивать информацию из интернета с помощью платы ESP32, например данные из API (данные о погоде), публиковать данные на онлайн-платформах, использовать иконки и изображения из интернета или подключать JavaScript-библиотеки для создания страниц веб-сервера.

Установка ESP32 как станции и подключение к Wi-Fi сети

Перейдите к разделу «Подключение к Wi-Fi сети», чтобы узнать, как настроить ESP32 как станцию и подключить его к сети.

В некоторых случаях это может быть не лучшей конфигурацией – когда рядом нет сети, а вы все равно хотите подключиться к ESP для управления им. В таком сценарии необходимо настроить ESP как точку доступа.

Точка доступа

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

Это также может быть полезно, если вы хотите, чтобы несколько устройств ESP32 общались друг с другом без необходимости в роутере.

ESP32 режим точки доступа

Поскольку ESP32 не подключается далее к проводной сети, как ваш роутер, это называется soft-AP (программная точка доступа). Это означает, что если вы попытаетесь загрузить библиотеки или использовать прошивку из интернета, это не сработает. Также не будут работать HTTP-запросы к сервисам в интернете для публикации показаний датчиков в облаке или использования сервисов в интернете (например, отправка электронной почты).

Настройка ESP32 как точки доступа

Для настройки ESP32 как точки доступа установите режим Wi-Fi в режим точки доступа:

WiFi.mode(WIFI_AP)

Затем используйте метод softAP() следующим образом:

WiFi.softAP(ssid, password);

ssid – это имя, которое вы хотите дать точке доступа ESP32, а переменная password – пароль для точки доступа. Если вы не хотите устанавливать пароль, задайте его как NULL.

Существуют также другие необязательные параметры, которые можно передать методу softAP(). Вот все параметры:

WiFi.softAP(const char* ssid, const char* password, int channel, int ssid_hidden, int max_connection)
  • ssid: имя точки доступа – максимум 63 символа;

  • password: минимум 8 символов; установите NULL, если хотите, чтобы точка доступа была открытой;

  • channel: номер Wi-Fi канала (1-13)

  • ssid_hidden: (0 = транслировать SSID, 1 = скрыть SSID)

  • max_connection: максимальное количество одновременно подключённых клиентов (1-4)

У нас есть полное руководство, объясняющее, как настроить ESP32 в качестве точки доступа:

Wi-Fi станция + точка доступа

ESP32 можно одновременно настроить как Wi-Fi станцию и точку доступа. Установите его режим в WIFI_AP_STA.

WiFi.mode(WIFI_AP_STA);

Сканирование Wi-Fi сетей

ESP32 может сканировать ближайшие Wi-Fi сети в пределах своего радиуса действия Wi-Fi. В Arduino IDE перейдите в File > Examples > WiFi > WiFiScan. Это загрузит скетч, который сканирует Wi-Fi сети в радиусе действия вашей платы ESP32.

ESP32 сканирование Wi-Fi сетей

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

Вот пример:

/*
  Example from WiFi > WiFiScan
  Complete details at https://RandomNerdTutorials.com/esp32-useful-wi-fi-functions-arduino/
*/

#include "WiFi.h"

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

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
      Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(5000);
}

Просмотреть исходный код

Вы можете загрузить его на вашу плату и проверить доступные сети, а также RSSI (индикатор уровня принимаемого сигнала).

WiFi.scanNetworks() возвращает количество найденных сетей.

int n = WiFi.scanNetworks();

После сканирования вы можете получить доступ к параметрам каждой сети.

WiFi.SSID() выводит SSID для конкретной сети:

Serial.print(WiFi.SSID(i));

WiFi.RSSI() возвращает RSSI этой сети. RSSI расшифровывается как Received Signal Strength Indicator (Индикатор уровня принимаемого сигнала). Это оценочная мера уровня мощности, которую устройство-клиент получает от точки доступа или роутера.

Serial.print(WiFi.RSSI(i));

Наконец, WiFi.encryptionType() возвращает тип шифрования сети. В данном конкретном примере ставится * в случае открытых сетей. Однако эта функция может вернуть одну из следующих опций (не только открытые сети):

  • WIFI_AUTH_OPEN

  • WIFI_AUTH_WEP

  • WIFI_AUTH_WPA_PSK

  • WIFI_AUTH_WPA2_PSK

  • WIFI_AUTH_WPA_WPA2_PSK

  • WIFI_AUTH_WPA2_ENTERPRISE

ESP32 сканирование Wi-Fi сетей - пример Serial Monitor

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

Для подключения ESP32 к конкретной Wi-Fi сети необходимо знать её SSID и пароль. Кроме того, эта сеть должна находиться в зоне действия Wi-Fi ESP32 (чтобы проверить это, можно использовать предыдущий пример для сканирования Wi-Fi сетей).

Вы можете использовать следующую функцию для подключения ESP32 к Wi-Fi сети – initWiFi():

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

Переменные ssid и password содержат SSID и пароль сети, к которой вы хотите подключиться.

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

Затем вам просто нужно вызвать функцию initWiFi() в setup().

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

Давайте кратко рассмотрим, как работает эта функция.

Сначала устанавливается режим Wi-Fi. Если ESP32 будет подключаться к другой сети (точке доступа/хотспоту), он должен быть в режиме станции.

WiFi.mode(WIFI_STA);

Затем используйте WiFi.begin() для подключения к сети. В качестве аргументов необходимо передать SSID сети и её пароль:

WiFi.begin(ssid, password);

Подключение к Wi-Fi сети может занять некоторое время, поэтому обычно добавляется цикл while, который продолжает проверять, установлено ли уже соединение, используя WiFi.status(). Когда соединение успешно установлено, функция возвращает WL_CONNECTED.

while (WiFi.status() != WL_CONNECTED) {

Получение статуса Wi-Fi соединения

Для получения статуса Wi-Fi соединения можно использовать WiFi.status(). Эта функция возвращает одно из следующих значений, соответствующих константам в таблице:

Значение

Константа

Описание

0

WL_IDLE_STATUS

временный статус, назначаемый при вызове WiFi.begin()

1

WL_NO_SSID_AVAIL

когда SSID не доступен

2

WL_SCAN_COMPLETED

сканирование сетей завершено

3

WL_CONNECTED

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

4

WL_CONNECT_FAILED

когда подключение не удалось после всех попыток

5

WL_CONNECTION_LOST

когда соединение потеряно

6

WL_DISCONNECTED

когда отключено от сети

Получение уровня сигнала Wi-Fi соединения

Для получения уровня сигнала Wi-Fi соединения достаточно вызвать WiFi.RSSI() после установки Wi-Fi соединения.

Вот пример:

/*
  Complete details at https://RandomNerdTutorials.com/esp32-useful-wi-fi-functions-arduino/
*/

#include <WiFi.h>

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

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("RRSI: ");
  Serial.println(WiFi.RSSI());
}

void loop() {
  // put your main code here, to run repeatedly:
}

Просмотреть исходный код

Введите ваши учётные данные сети и загрузите код.

Откройте Serial Monitor и нажмите кнопку RST на плате ESP32. Он подключится к вашей сети и выведет RSSI (индикатор уровня принимаемого сигнала).

Получение уровня сигнала Wi-Fi соединения ESP32

Чем меньше абсолютное значение, тем сильнее Wi-Fi соединение.

Получение IP-адреса ESP32

Когда ESP32 настроен как Wi-Fi станция, он может подключаться к другим сетям (например, к вашему роутеру). В этом сценарии роутер назначает уникальный IP-адрес вашей плате ESP32. Чтобы получить IP-адрес платы, нужно вызвать WiFi.localIP() после установки соединения с сетью.

Serial.println(WiFi.localIP());

Установка статического IP-адреса ESP32

Вместо получения случайно назначенного IP-адреса вы можете установить доступный IP-адрес по вашему выбору для ESP32, используя WiFi.config().

Вне функций setup() и loop() определите следующие переменные с вашим собственным статическим IP-адресом и соответствующим IP-адресом шлюза. По умолчанию следующий код назначает IP-адрес 192.168.1.184, который работает в шлюзе 192.168.1.1.

// Set your Static IP address
IPAddress local_IP(192, 168, 1, 184);
// Set your Gateway IP address
IPAddress gateway(192, 168, 1, 1);

IPAddress subnet(255, 255, 0, 0);
IPAddress primaryDNS(8, 8, 8, 8);   // optional
IPAddress secondaryDNS(8, 8, 4, 4); // optional

Затем в setup() необходимо вызвать метод WiFi.config() для применения конфигурации к ESP32.

// Configures static IP address
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
  Serial.println("STA Failed to configure");
}

Параметры primaryDNS и secondaryDNS являются необязательными, и их можно убрать.

Рекомендуем прочитать следующее руководство, чтобы узнать, как установить статический IP-адрес:

Отключение от Wi-Fi сети

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

WiFi.disconnect()
ESP32 отключение от 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 секунд проверять, есть ли подключение. Если нет – отключается и пытается переподключиться снова.

Вы можете прочитать наше руководство: [РЕШЕНО] Переподключение ESP32 к Wi-Fi сети после потери соединения.

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

События Wi-Fi ESP32

ESP32 может обрабатывать все следующие события Wi-Fi (см. исходный код):

0

ARDUINO_EVENT_WIFI_READY

ESP32 Wi-Fi готов

1

ARDUINO_EVENT_WIFI_SCAN_DONE

ESP32 завершил сканирование точек доступа

2

ARDUINO_EVENT_WIFI_STA_START

ESP32 станция запущена

3

ARDUINO_EVENT_WIFI_STA_STOP

ESP32 станция остановлена

4

ARDUINO_EVENT_WIFI_STA_CONNECTED

ESP32 станция подключена к точке доступа

5

ARDUINO_EVENT_WIFI_STA_DISCONNECTED

ESP32 станция отключена от точки доступа

6

ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE

режим аутентификации подключённой точки доступа изменился

7

ARDUINO_EVENT_WIFI_STA_GOT_IP

ESP32 станция получила IP от подключённой точки доступа

8

ARDUINO_EVENT_WIFI_STA_LOST_IP

ESP32 станция потеряла IP, и IP сброшен на 0

9

ARDUINO_EVENT_WPS_ER_SUCCESS

WPS успешно завершён в режиме enrollee

10

ARDUINO_EVENT_WPS_ER_FAILED

WPS завершился неудачей в режиме enrollee

11

ARDUINO_EVENT_WPS_ER_TIMEOUT

WPS тайм-аут в режиме enrollee

12

ARDUINO_EVENT_WPS_ER_PIN

WPS пин-код в режиме enrollee

13

ARDUINO_EVENT_WIFI_AP_START

ESP32 soft-AP запущена

14

ARDUINO_EVENT_WIFI_AP_STOP

ESP32 soft-AP остановлена

15

ARDUINO_EVENT_WIFI_AP_STACONNECTED

станция подключилась к ESP32 soft-AP

16

ARDUINO_EVENT_WIFI_AP_STADISCONNECTED

станция отключилась от ESP32 soft-AP

17

ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED

ESP32 soft-AP назначила IP подключённой станции

18

ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED

Получен probe request пакет на интерфейсе soft-AP

19

ARDUINO_EVENT_WIFI_AP_GOT_IP6

IPv6 адрес точки доступа ESP32 предпочтителен

19

ARDUINO_EVENT_WIFI_STA_GOT_IP6

IPv6 адрес станции ESP32 предпочтителен

19

ARDUINO_EVENT_ETH_GOT_IP6

IPv6 Ethernet предпочтителен

20

ARDUINO_EVENT_ETH_START

ESP32 Ethernet запущен

21

ARDUINO_EVENT_ETH_STOP

ESP32 Ethernet остановлен

22

ARDUINO_EVENT_ETH_CONNECTED

ESP32 Ethernet физическое соединение установлено

23

ARDUINO_EVENT_ETH_DISCONNECTED

ESP32 Ethernet физическое соединение разорвано

24

ARDUINO_EVENT_ETH_GOT_IP

ESP32 Ethernet получил IP от подключённой точки доступа

25

ARDUINO_EVENT_MAX

Для полного примера использования этих событий в Arduino IDE перейдите в File > Examples > WiFi > WiFiClientEvents.

/*   This sketch shows the WiFi event usage - Example from WiFi > WiFiClientEvents
     Complete details at https://RandomNerdTutorials.com/esp32-useful-wi-fi-functions-arduino/  */
/*
* WiFi Events

0  ARDUINO_EVENT_WIFI_READY               < ESP32 WiFi ready
1  ARDUINO_EVENT_WIFI_SCAN_DONE                < ESP32 finish scanning AP
2  ARDUINO_EVENT_WIFI_STA_START                < ESP32 station start
3  ARDUINO_EVENT_WIFI_STA_STOP                 < ESP32 station stop
4  ARDUINO_EVENT_WIFI_STA_CONNECTED            < ESP32 station connected to AP
5  ARDUINO_EVENT_WIFI_STA_DISCONNECTED         < ESP32 station disconnected from AP
6  ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE      < the auth mode of AP connected by ESP32 station changed
7  ARDUINO_EVENT_WIFI_STA_GOT_IP               < ESP32 station got IP from connected AP
8  ARDUINO_EVENT_WIFI_STA_LOST_IP              < ESP32 station lost IP and the IP is reset to 0
9  ARDUINO_EVENT_WPS_ER_SUCCESS       < ESP32 station wps succeeds in enrollee mode
10 ARDUINO_EVENT_WPS_ER_FAILED        < ESP32 station wps fails in enrollee mode
11 ARDUINO_EVENT_WPS_ER_TIMEOUT       < ESP32 station wps timeout in enrollee mode
12 ARDUINO_EVENT_WPS_ER_PIN           < ESP32 station wps pin code in enrollee mode
13 ARDUINO_EVENT_WIFI_AP_START                 < ESP32 soft-AP start
14 ARDUINO_EVENT_WIFI_AP_STOP                  < ESP32 soft-AP stop
15 ARDUINO_EVENT_WIFI_AP_STACONNECTED          < a station connected to ESP32 soft-AP
16 ARDUINO_EVENT_WIFI_AP_STADISCONNECTED       < a station disconnected from ESP32 soft-AP
17 ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED         < ESP32 soft-AP assign an IP to a connected station
18 ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED        < Receive probe request packet in soft-AP interface
19 ARDUINO_EVENT_WIFI_AP_GOT_IP6               < ESP32 ap interface v6IP addr is preferred
19 ARDUINO_EVENT_WIFI_STA_GOT_IP6              < ESP32 station interface v6IP addr is preferred
20 ARDUINO_EVENT_ETH_START                < ESP32 ethernet start
21 ARDUINO_EVENT_ETH_STOP                 < ESP32 ethernet stop
22 ARDUINO_EVENT_ETH_CONNECTED            < ESP32 ethernet phy link up
23 ARDUINO_EVENT_ETH_DISCONNECTED         < ESP32 ethernet phy link down
24 ARDUINO_EVENT_ETH_GOT_IP               < ESP32 ethernet got IP from connected AP
19 ARDUINO_EVENT_ETH_GOT_IP6              < ESP32 ethernet interface v6IP addr is preferred
25 ARDUINO_EVENT_MAX
*/

#include <WiFi.h>

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

void WiFiEvent(WiFiEvent_t event){
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch (event) {
        case ARDUINO_EVENT_WIFI_READY:
            Serial.println("WiFi interface ready");
            break;
        case ARDUINO_EVENT_WIFI_SCAN_DONE:
            Serial.println("Completed scan for access points");
            break;
        case ARDUINO_EVENT_WIFI_STA_START:
            Serial.println("WiFi client started");
            break;
        case ARDUINO_EVENT_WIFI_STA_STOP:
            Serial.println("WiFi clients stopped");
            break;
        case ARDUINO_EVENT_WIFI_STA_CONNECTED:
            Serial.println("Connected to access point");
            break;
        case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
            Serial.println("Disconnected from WiFi access point");
            break;
        case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE:
            Serial.println("Authentication mode of access point has changed");
            break;
        case ARDUINO_EVENT_WIFI_STA_GOT_IP:
            Serial.print("Obtained IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case ARDUINO_EVENT_WIFI_STA_LOST_IP:
            Serial.println("Lost IP address and IP address is reset to 0");
            break;
        case ARDUINO_EVENT_WPS_ER_SUCCESS:
            Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
            break;
        case ARDUINO_EVENT_WPS_ER_FAILED:
            Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
            break;
        case ARDUINO_EVENT_WPS_ER_TIMEOUT:
            Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
            break;
        case ARDUINO_EVENT_WPS_ER_PIN:
            Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
            break;
        case ARDUINO_EVENT_WIFI_AP_START:
            Serial.println("WiFi access point started");
            break;
        case ARDUINO_EVENT_WIFI_AP_STOP:
            Serial.println("WiFi access point  stopped");
            break;
        case ARDUINO_EVENT_WIFI_AP_STACONNECTED:
            Serial.println("Client connected");
            break;
        case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED:
            Serial.println("Client disconnected");
            break;
        case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED:
            Serial.println("Assigned IP address to client");
            break;
        case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED:
            Serial.println("Received probe request");
            break;
        case ARDUINO_EVENT_WIFI_AP_GOT_IP6:
            Serial.println("AP IPv6 is preferred");
            break;
        case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
            Serial.println("STA IPv6 is preferred");
            break;
        case ARDUINO_EVENT_ETH_GOT_IP6:
            Serial.println("Ethernet IPv6 is preferred");
            break;
        case ARDUINO_EVENT_ETH_START:
            Serial.println("Ethernet started");
            break;
        case ARDUINO_EVENT_ETH_STOP:
            Serial.println("Ethernet stopped");
            break;
        case ARDUINO_EVENT_ETH_CONNECTED:
            Serial.println("Ethernet connected");
            break;
        case ARDUINO_EVENT_ETH_DISCONNECTED:
            Serial.println("Ethernet disconnected");
            break;
        case ARDUINO_EVENT_ETH_GOT_IP:
            Serial.println("Obtained IP address");
            break;
        default: break;
    }}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

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

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

    delay(1000);

    // Examples of different ways to register wifi events
    WiFi.onEvent(WiFiEvent);
    WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
    WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
        Serial.print("WiFi lost connection. Reason: ");
        Serial.println(info.wifi_sta_disconnected.reason);
    }, 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 вам не нужно постоянно проверять состояние Wi-Fi. Когда происходит определённое событие, автоматически вызывается соответствующая функция-обработчик.

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

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

/*
  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-адрес в Serial Monitor.

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.wifi_sta_disconnected.reason);
  Serial.println("Trying to Reconnect");
  WiFi.begin(ssid, password);
}

ESP32 WiFiMulti

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

Чтобы узнать, как использовать WiFiMulti, прочитайте следующее руководство:

Изменение имени хоста ESP32

Для установки пользовательского имени хоста (hostname) для вашей платы вызовите WiFi.setHostname(YOUR_NEW_HOSTNAME); перед WiFi.begin();

Имя хоста ESP32 по умолчанию – espressif.

ESP32 имя хоста по умолчанию

В библиотеке WiFi.h есть метод, позволяющий установить пользовательское имя хоста.

Сначала определите ваше новое имя хоста. Например:

String hostname = "ESP32 Node Temperature";

Затем вызовите функцию WiFi.setHostname() перед вызовом WiFi.begin(). Также необходимо вызвать WiFi.config(), как показано ниже:

WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
WiFi.setHostname(hostname.c_str()); //define hostname

Вы можете скопировать полный пример ниже:

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-set-custom-hostname-arduino/
  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
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Change the hostname
const char* hostname = "esp32-node-temperature";

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
  WiFi.setHostname(hostname);

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

  Serial.print("\nESP32 IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.print("ESP32 HostName: ");
  Serial.println(WiFi.getHostname());
  Serial.print("RRSI: ");
  Serial.println(WiFi.RSSI());
}

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

void loop() {
  // put your main code here, to run repeatedly:
}

Просмотреть исходный код

Вы можете использовать этот фрагмент кода в своих проектах для установки пользовательского имени хоста ESP32.

Важно: для вступления изменений в силу может потребоваться перезагрузка роутера.

После этого, если вы зайдёте в настройки роутера, вы увидите ESP32 с пользовательским именем хоста.

ESP32 пользовательское имя хоста

Заключение

Эта статья представляла собой сборник некоторых наиболее используемых и полезных функций Wi-Fi для ESP32. Хотя существует множество примеров использования возможностей Wi-Fi ESP32, документации, объясняющей, как использовать функции Wi-Fi с ESP32 в Arduino IDE, не так много. Поэтому мы решили подготовить это руководство, чтобы упростить использование функций, связанных с Wi-Fi ESP32, в ваших проектах.

Узнайте больше о ESP32 с помощью наших ресурсов:


Источник: ESP32 Useful Wi-Fi Library Functions (Arduino IDE)