WiFi на ESP32: подключение к сети за 5 минут
WiFi это главная причина взять ESP32 вместо Uno: сеть на борту, а подключение укладывается в пять строк кода. Нужно лишь один раз установить пакеты плат ESP32 в Arduino IDE.
Пошаговые уроки: первое подключение, HTTP-запросы и веб-сервер.
Ниже разбираем статусы подключения, которые дают WiFi.status(), почему сеть не видна при полностью рабочем роутере, что делать, когда связь обрывается через сутки, и как проверить, что плата вышла в сеть, по семи шагам.
Установка поддержки ESP32 (один раз)
- File → Preferences → Additional boards manager URLs: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- Tools → Board → Boards Manager, найти esp32 и нажать Install (Espressif Systems).
- Выберите плату: Tools → Board → ESP32 Dev Module.
- Подключите DevKit кабелем, порт появится как COMx или /dev/ttyUSB0 (драйвер CP2102 или CH340).
Код: подключение и IP
#include <WiFi.h> const char* ssid = "MoyaSet";const char* pass = "parol12345"; void setup() { Serial.begin(115200); WiFi.begin(ssid, pass); Serial.print("Подключение"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("IP: "); Serial.println(WiFi.localIP());} void loop() {}Строка Serial.begin(115200) важна: на ESP32 скорость по умолчанию 115200, а не 9600, как на Uno. Если открыть монитор порта на другой скорости, вместо текста вы увидите мусор, и новичок решит, что плата сломалась. Дальше WiFi.begin(ssid, pass) запускает подключение и возвращает управление сразу, поэтому следующая строка это цикл ожидания: пока статус не равен WL_CONNECTED, печатаем точку и ждём полсекунды. Как только статус стал WL_CONNECTED, у платы появляется IP-адрес, и его выдаёт WiFi.localIP(). Посмотреть MAC-адрес и уровень сигнала можно функциями WiFi.macAddress() и WiFi.RSSI().
Статусы WiFi.status(): о чём они говорят
| Статус | Значение | Что делать |
|---|---|---|
| WL_IDLE_STATUS | подключение не начиналось или сброшено | вызовите WiFi.begin() ещё раз |
| WL_NO_SSID_AVAIL | сеть с таким именем не найдена | проверьте имя, диапазон 2.4 ГГц и видимость SSID |
| WL_CONNECT_FAILED | сеть найдена, но не подключиться | проверьте пароль и режим шифрования роутера |
| WL_CONNECTED | плата в сети, адрес получен | работайте |
| WL_CONNECTION_LOST | связь пропала | переподключитесь и проверьте питание и дальность |
| WL_DISCONNECTED | соединение закрыто | проверьте настройки роутера и DHCP |
В современных версиях ядра у WiFi.begin() есть таймаут подключения, по умолчанию около десяти секунд. За это время плата успевает найти сеть и обменяться с ней, и если что-то не вышло, статус становится WL_CONNECT_FAILED или WL_NO_SSID_AVAIL вместо бесконечного ожидания. Это удобно: цикл ожидания в примере выше на практике не зависает, а выходит с конкретным диагнозом.
2.4 ГГц и другие нюансы
ESP32 видит только диапазон 2.4 ГГц, и сеть 5 ГГц он не найдёт. Это самая частая причина «сетей не видно», причём роутер при этом полностью исправен: в его настройках сети на 2.4 и 5 ГГц разнесены по разным SSID, а плата видит только первый. Вторая особенность: оригинальный ESP32 не понимает WPA3, поэтому роутер с шифрованием только WPA3 приметит его, а вот связка WPA2 или смешанный режим работает всегда. Третий момент: скрытая сеть не видна в списке, но подключиться к ней можно, если имя указать прямо в коде, тогда как WiFi.scan() такую сеть не покажет.
Для проектов на батарейке используйте режимы модема (WiFi.setSleep) или deep sleep с периодическим подключением. Простое правило: радиомодуль ESP32 в активном режиме потребляет сотни миллиампер, и батарейка на ESP32 живёт в разы меньше, чем на Uno с той же периодичностью опроса. Ещё одна настройка, которая стоит сделать в проектах с датчиками: повесить свой логин и пароль вместо заводских, если устройство выставляет точку доступа SoftAP.
Тупик: плата не видит сеть
Первый наш стенд с ESP32 не видел ни одной сети, хотя рядом стоял роутер с включённым WiFi и телефон видел сеть прекрасно. Мы перезагружали плату, переустанавливали пакеты ESP32, проверяли антенну и в итоге почти решили, что модуль повреждён.
Дело было в том, что роутер раздавал две сети с разными именами: одну на 2.4 ГГц, другую на 5 ГГц, и мы вписали имя второй. После правки имени плата увидела сеть за секунду. Второй случай с той же симптоматикой: роутер был настроен на WPA3 only, а плата такой режим не понимает. Мы добавили в закладки две проверки, которые теперь делаем первыми: имя сети из настроек самого роутера и режим шифрования. Обе проверки занимают меньше минуты и снимают большинство вопросов «не видит сеть».
Личный опыт: как выглядит обрыв связи
Отдельная проблема, которую мы ловили не раз: плата подключается, работает, а через несколько часов или сутки перестаёт отвечать, причём WiFi.status() при этом показывает WL_CONNECTED. Мы проверили и увидели, что так ведёт себя связь с роутером, у которого в настройках короткая аренда адреса: по истечении срока аренды клиент должен обновить адрес, и если в этот момент что-то пошло не так, связь остаётся «подключённой» по статусу, но данных по ней нет.
Лечение простое: в коде следите за статусом и переподключайтесь при обрыве, а для проектов, где важна предсказуемость, задавайте статический IP-адрес. В ядре есть готовый пример с настройкой WiFi, где задаются адрес, шлюз, маска и DNS, и мы этот путь использовали для стендов с несколькими платами, чтобы адреса не менялись при перезагрузке. Второе, что мы делаем теперь всегда: автопереподключение с задержкой, чтобы после обрыва плата не ломилась к роутеру каждую секунду и не забивала эфир.
Авторская позиция: зачем ESP32, если есть Uno
Мы советуем брать ESP32, если проект хотя бы раз в своей жизни выйдет из дома: телеметрия на телефон, управление через браузер, данные в облако или MQTT. Все эти вещи на Uno требуют либо дополнительной платы с Ethernet, либо длинного USB-кабеля, что меняет саму конструкцию. Скорость процессора и объём памяти тоже больше, и на ESP32 спокойно живут проекты с JSON и шифрованием.
Но если задача остаётся настольной, Uno честно проще. У неё нет лишних прошивок и пакетов, питание 5 В совпадает с большинством модулей, и нет риска, что сеть пропадёт в худший момент. Мы идём по простому пути: сначала Uno для понимания железа, потом ESP32, когда понадобится сеть. Покупать сразу два набора ради любопытства мы не советуем, а вот держать один ESP32 и один Uno под рукой в учебном шкафу разумно: они закрывают почти все учебные задачи между собой.