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.
Подключение библиотеки 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() и укажите желаемый режим в качестве аргумента:
|
режим станции: ESP32 подключается к точке доступа |
|
режим точки доступа: станции могут подключаться к ESP32 |
|
точка доступа и станция, подключённая к другой точке доступа |
Wi-Fi станция
Когда ESP32 настроен как Wi-Fi станция, он может подключаться к другим сетям (например, к вашему роутеру). В этом сценарии роутер назначает уникальный IP-адрес вашей плате ESP. Вы можете взаимодействовать с ESP, используя другие устройства (станции), которые также подключены к той же сети, обращаясь к ESP по его уникальному IP-адресу.
Роутер подключён к интернету, поэтому мы можем запрашивать информацию из интернета с помощью платы ESP32, например данные из API (данные о погоде), публиковать данные на онлайн-платформах, использовать иконки и изображения из интернета или подключать JavaScript-библиотеки для создания страниц веб-сервера.
Установка ESP32 как станции и подключение к Wi-Fi сети
Перейдите к разделу «Подключение к Wi-Fi сети», чтобы узнать, как настроить ESP32 как станцию и подключить его к сети.
В некоторых случаях это может быть не лучшей конфигурацией – когда рядом нет сети, а вы все равно хотите подключиться к ESP для управления им. В таком сценарии необходимо настроить ESP как точку доступа.
Точка доступа
Когда вы настраиваете ESP32 как точку доступа, вы можете подключаться к нему с помощью любого устройства с поддержкой Wi-Fi без подключения к роутеру. Когда вы устанавливаете ESP32 как точку доступа, вы создаёте собственную Wi-Fi сеть, и ближайшие Wi-Fi устройства (станции) могут подключаться к ней, например, ваш смартфон или компьютер. Таким образом, вам не нужно быть подключённым к роутеру для управления им.
Это также может быть полезно, если вы хотите, чтобы несколько устройств 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.
Это может быть полезно, чтобы проверить, находится ли 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
Подключение к 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 соединение.
Получение 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()
Переподключение к 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.
В библиотеке 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 с пользовательским именем хоста.
Заключение
Эта статья представляла собой сборник некоторых наиболее используемых и полезных функций Wi-Fi для ESP32. Хотя существует множество примеров использования возможностей Wi-Fi ESP32, документации, объясняющей, как использовать функции Wi-Fi с ESP32 в Arduino IDE, не так много. Поэтому мы решили подготовить это руководство, чтобы упростить использование функций, связанных с Wi-Fi ESP32, в ваших проектах.
Узнайте больше о ESP32 с помощью наших ресурсов:
Источник: ESP32 Useful Wi-Fi Library Functions (Arduino IDE)