ESP32 не получает IP-адрес

Диагностика и решение проблемы, когда ESP32 подключается к WiFi, но не получает IP-адрес от DHCP-сервера.


← Назад к решению проблем

Частые причины

  • 📡

    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 состоит из двух этапов:

  1. Аутентификация Wi-Fi — ESP32 отправляет SSID и пароль, роутер подтверждает подключение
  2. Получение 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

Это самое простое действие, которое решает удивительно много проблем:

  1. Отключите роутер от питания на 30 секунд
  2. Включите роутер и дождитесь полной загрузки (1–2 минуты)
  3. Перезагрузите 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_DISCONNECTED0.0.0.0Проверьте SSID/пароль
Подключён, нет IPWL_CONNECTED0.0.0.0Проблема DHCP
Полное подключениеWL_CONNECTED192.168.x.xВсё работает
Потерян IPWL_CONNECTED0.0.0.0Истекла аренда DHCP

Значения WiFi.status():

ЗначениеКодОписание
WL_IDLE_STATUS0Ожидание
WL_NO_SSID_AVAIL1SSID не найден
WL_CONNECTED3Подключено
WL_CONNECT_FAILED4Ошибка подключения
WL_CONNECTION_LOST5Соединение потеряно
WL_DISCONNECTED6Отключено

Когда DHCP не работает: DHCP-резервирование

Лучшая альтернатива статическому IP в коде — резервирование DHCP на роутере:

  1. Узнайте MAC-адрес ESP32: Serial.println(WiFi.macAddress());
  2. В настройках роутера найдите «DHCP Reservation» или «Привязка адресов»
  3. Привяжите MAC-адрес ESP32 к желаемому IP-адресу
  4. ESP32 будет всегда получать один и тот же IP через DHCP

Преимущества перед статическим IP в коде:

  • Не нужно менять прошивку при смене сети
  • Роутер управляет конфликтами автоматически
  • DNS-настройки приходят от роутера

Заключение

Проблема «ESP32 подключён к Wi-Fi, но нет IP» обычно решается одним из этих подходов:

  • Перезагрузка роутера — самое простое и часто эффективное решение
  • Статический IP — обход DHCP, если он работает ненадёжно
  • Ожидание получения IP — дайте ESP32 больше времени на DHCP-запрос
  • Настройка роутера — расширение пула DHCP, увеличение аренды
  • DHCP-резервирование — лучшее из обоих миров

Если ни одно из решений не помогает, попробуйте подключить ESP32 к мобильной точке доступа — если это работает, проблема точно в вашем роутере.

Быстрая навигация

Дополнительные ресурсы

Всё ещё есть проблема с ESP32? Давайте решим её вместе.

Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.

Начать устранение неполадок

Регистрация не требуется. Начните решать проблемы прямо сейчас!

Узнайте больше о нашем процессе устранения неполадок →