Частые причины
-
📡
DHCP-сервер не отвечает
Если DHCP-сервер роутера перегружен, неправильно настроен или исчерпал пул адресов, ESP32 может подключиться к Wi-Fi, но не получить IP-адрес.
-
⚠️
Неправильные настройки безопасности
Несовместимые протоколы шифрования (WPA3, WPA2-Enterprise) или неправильные учётные данные могут позволить частичное подключение без выдачи IP.
-
🔧
Конфликт IP-адресов в сети
Если пул DHCP исчерпан или имеется конфликт адресов, новые устройства не смогут получить IP. Это часто происходит в сетях с множеством IoT-устройств.
-
🧯
Изоляция клиентов или ограничения роутера
Некоторые роутеры ограничивают количество одновременных подключений или блокируют DHCP-запросы от неизвестных устройств.
-
⏱
Тайм-аут DHCP-запроса
ESP32 может не дождаться ответа DHCP, если роутер отвечает медленно или сеть перегружена. По умолчанию тайм-аут достаточно короткий.
Симптомы
WiFi.localIP() возвращает 0.0.0.0
ESP32 подключается к Wi-Fi (статус WL_CONNECTED), но WiFi.localIP() показывает 0.0.0.0 вместо реального адреса.
Подключение к Wi-Fi есть, но пинг не проходит
ESP32 сообщает об успешном подключении, но не может обмениваться данными с другими устройствами в сети или с интернетом.
Serial Monitor показывает подключение без IP
Логи отображают:
WiFi connected
IP address: 0.0.0.0
или IP вообще не отображается.
MQTT, HTTP и NTP не работают
Все сетевые функции перестают работать, потому что без валидного IP-адреса ESP32 не может отправлять или принимать пакеты.
Решения
Проверьте настройки DHCP на роутере
Откройте панель управления роутером и убедитесь, что DHCP включён и пул адресов достаточно велик. Увеличьте диапазон при необходимости.
Перезагрузите роутер
Иногда простая перезагрузка роутера решает проблемы с зависшим DHCP-сервером и освобождает занятые адреса.
Используйте статический IP как обходное решение
Если DHCP не работает стабильно, назначьте ESP32 фиксированный IP-адрес вручную через WiFi.config().
Проверьте количество подключённых устройств
Убедитесь, что лимит подключений роутера не исчерпан. Отключите неиспользуемые устройства при необходимости.
Подробнее
ESP32 подключается к WiFi, но не получает IP-адрес
Это одна из самых запутанных проблем: ESP32 сообщает, что подключён к Wi-Fi (WL_CONNECTED), но при попытке узнать IP-адрес вы видите 0.0.0.0. Все сетевые операции — HTTP, MQTT, NTP — не работают.
Проблема почти всегда связана с DHCP: роутер по какой-то причине не выдаёт IP-адрес устройству, хотя Wi-Fi-аутентификация прошла успешно.
Как работает получение IP на ESP32
Процесс подключения к Wi-Fi состоит из двух этапов:
- Аутентификация Wi-Fi — ESP32 отправляет SSID и пароль, роутер подтверждает подключение
- Получение IP через DHCP — ESP32 запрашивает IP-адрес у DHCP-сервера роутера
Проблема «нет IP» означает, что первый этап прошёл успешно, а второй — нет.
Диагностика проблемы
Определите, есть ли IP-адрес
#include <WiFi.h>
const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Подключение к Wi-Fi...");
// Ожидание подключения
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 30) {
delay(1000);
Serial.printf("Попытка %d | Статус: %d\n", attempts + 1, WiFi.status());
attempts++;
}
Serial.println("\n=== Диагностика ===");
Serial.printf("Статус Wi-Fi: %d\n", WiFi.status());
Serial.printf("IP-адрес: %s\n", WiFi.localIP().toString().c_str());
Serial.printf("Gateway: %s\n", WiFi.gatewayIP().toString().c_str());
Serial.printf("Subnet: %s\n", WiFi.subnetMask().toString().c_str());
Serial.printf("DNS: %s\n", WiFi.dnsIP().toString().c_str());
Serial.printf("RSSI: %d дБм\n", WiFi.RSSI());
Serial.printf("MAC: %s\n", WiFi.macAddress().c_str());
// Проверка IP
if (WiFi.localIP() == IPAddress(0, 0, 0, 0)) {
Serial.println("\n❌ IP-адрес не получен!");
Serial.println("Возможные причины:");
Serial.println(" 1. DHCP-сервер не отвечает");
Serial.println(" 2. Пул DHCP-адресов исчерпан");
Serial.println(" 3. Роутер ограничивает подключения");
Serial.println(" 4. Несовместимые настройки безопасности");
Serial.println("\nРекомендация: попробуйте статический IP");
} else {
Serial.println("\n✅ IP-адрес получен успешно!");
}
}
void loop() {}
Решение 1: Перезагрузите роутер и ESP32
Это самое простое действие, которое решает удивительно много проблем:
- Отключите роутер от питания на 30 секунд
- Включите роутер и дождитесь полной загрузки (1–2 минуты)
- Перезагрузите ESP32
Перезагрузка сбрасывает таблицу DHCP-аренд и устраняет возможные зависания.
Решение 2: Используйте статический IP
Если DHCP работает ненадёжно, назначьте статический IP:
#include <WiFi.h>
const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";
// Статические настройки сети
IPAddress localIP(192, 168, 1, 50); // Свободный IP в вашей сети
IPAddress gateway(192, 168, 1, 1); // IP роутера
IPAddress subnet(255, 255, 255, 0); // Маска подсети
IPAddress dns1(8, 8, 8, 8); // DNS Google
IPAddress dns2(1, 1, 1, 1); // DNS Cloudflare
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA);
// ВАЖНО: config() ПЕРЕД begin()!
if (!WiFi.config(localIP, gateway, subnet, dns1, dns2)) {
Serial.println("Ошибка конфигурации статического IP");
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nПодключено!");
Serial.printf("IP: %s\n", WiFi.localIP().toString().c_str());
}
void loop() {}
Важно: Выбирайте IP вне диапазона DHCP вашего роутера, чтобы избежать конфликтов. Обычно DHCP использует адреса 192.168.1.100–254, поэтому адреса 192.168.1.2–99 обычно свободны.
Решение 3: Добавьте ожидание получения IP
Иногда ESP32 слишком быстро проверяет IP, не дождавшись ответа DHCP:
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// Ожидание подключения к Wi-Fi
Serial.println("Подключение к Wi-Fi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi подключён");
// Дополнительное ожидание получения IP
Serial.println("Ожидание IP-адреса...");
int ipWait = 0;
while (WiFi.localIP() == IPAddress(0, 0, 0, 0) && ipWait < 20) {
delay(500);
Serial.print("*");
ipWait++;
}
if (WiFi.localIP() != IPAddress(0, 0, 0, 0)) {
Serial.printf("\nIP получен: %s\n", WiFi.localIP().toString().c_str());
} else {
Serial.println("\nIP не получен. Попробуем отключиться и подключиться заново...");
WiFi.disconnect();
delay(1000);
WiFi.begin(ssid, password);
}
}
Решение 4: Используйте событие SYSTEM_EVENT_STA_GOT_IP
Вместо проверки IP в цикле, подпишитесь на событие получения IP:
#include <WiFi.h>
const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";
bool gotIP = false;
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("📶 Подключён к Wi-Fi (аутентификация пройдена)");
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.printf("✅ IP получен: %s\n", WiFi.localIP().toString().c_str());
gotIP = true;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("⚠️ Wi-Fi отключён");
gotIP = false;
break;
case SYSTEM_EVENT_STA_LOST_IP:
Serial.println("❌ IP-адрес потерян!");
gotIP = false;
break;
default:
break;
}
}
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.onEvent(WiFiEvent);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Ожидание подключения и получения IP...");
unsigned long startTime = millis();
while (!gotIP && millis() - startTime < 15000) {
delay(100);
}
if (gotIP) {
Serial.println("Все сетевые функции готовы!");
} else {
Serial.println("Не удалось получить IP за 15 секунд");
Serial.println("Рекомендация: используйте статический IP");
}
}
void loop() {
if (!gotIP) {
// Периодические попытки переподключения
static unsigned long lastAttempt = 0;
if (millis() - lastAttempt > 10000) {
lastAttempt = millis();
Serial.println("Попытка переподключения...");
WiFi.disconnect();
delay(500);
WiFi.begin(ssid, password);
}
}
delay(100);
}
Решение 5: Проверьте и настройте DHCP роутера
Зайдите в настройки роутера (обычно 192.168.1.1 или 192.168.0.1) и проверьте:
| Параметр | Рекомендация |
|---|---|
| DHCP включён | ✅ Да |
| Диапазон IP | Достаточный (например, .100–.254) |
| Время аренды | ≥ 24 часа |
| Макс. клиентов | ≥ количество ваших устройств |
| Зарезервированные IP | Создайте для ESP32 |
Если в сети много IoT-устройств (умные лампы, датчики, камеры), пул DHCP может быть исчерпан. Расширьте диапазон или используйте резервирование.
Различие между «нет подключения» и «нет IP»
| Состояние | WiFi.status() | WiFi.localIP() | Проблема |
|---|---|---|---|
| Нет подключения | WL_DISCONNECTED | 0.0.0.0 | Проверьте SSID/пароль |
| Подключён, нет IP | WL_CONNECTED | 0.0.0.0 | Проблема DHCP |
| Полное подключение | WL_CONNECTED | 192.168.x.x | Всё работает |
| Потерян IP | WL_CONNECTED | 0.0.0.0 | Истекла аренда DHCP |
Значения WiFi.status():
| Значение | Код | Описание |
|---|---|---|
| WL_IDLE_STATUS | 0 | Ожидание |
| WL_NO_SSID_AVAIL | 1 | SSID не найден |
| WL_CONNECTED | 3 | Подключено |
| WL_CONNECT_FAILED | 4 | Ошибка подключения |
| WL_CONNECTION_LOST | 5 | Соединение потеряно |
| WL_DISCONNECTED | 6 | Отключено |
Когда DHCP не работает: DHCP-резервирование
Лучшая альтернатива статическому IP в коде — резервирование DHCP на роутере:
- Узнайте MAC-адрес ESP32:
Serial.println(WiFi.macAddress()); - В настройках роутера найдите «DHCP Reservation» или «Привязка адресов»
- Привяжите MAC-адрес ESP32 к желаемому IP-адресу
- ESP32 будет всегда получать один и тот же IP через DHCP
Преимущества перед статическим IP в коде:
- Не нужно менять прошивку при смене сети
- Роутер управляет конфликтами автоматически
- DNS-настройки приходят от роутера
Заключение
Проблема «ESP32 подключён к Wi-Fi, но нет IP» обычно решается одним из этих подходов:
- Перезагрузка роутера — самое простое и часто эффективное решение
- Статический IP — обход DHCP, если он работает ненадёжно
- Ожидание получения IP — дайте ESP32 больше времени на DHCP-запрос
- Настройка роутера — расширение пула DHCP, увеличение аренды
- DHCP-резервирование — лучшее из обоих миров
Если ни одно из решений не помогает, попробуйте подключить ESP32 к мобильной точке доступа — если это работает, проблема точно в вашем роутере.
Быстрая навигация
Дополнительные ресурсы
Всё ещё есть проблема с ESP32? Давайте решим её вместе.
Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.
Регистрация не требуется. Начните решать проблемы прямо сейчас!