ESP32 случайно отключается от Wi-Fi

Устранение неожиданных или периодических отключений Wi-Fi на ESP32, особенно в долгоработающих приложениях или при слабом сигнале.


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

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

  • 📶

    Слабый или нестабильный сигнал Wi-Fi

    Низкие уровни RSSI, помехи или большое расстояние до роутера могут вызывать периодическую потерю Wi-Fi-соединения на ESP32.

  • Режим энергосбережения или сна

    Управление энергопотреблением ESP32 по умолчанию может периодически отключать Wi-Fi или снижать стабильность сигнала, если не настроено явно.

  • 🔧

    Несовместимость роутера или тайм-аут DHCP

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

  • 📡

    Перекрытие каналов или радиочастотные помехи

    Загруженный диапазон 2.4 ГГц (от соседних сетей, микроволновых печей и т.д.) может вызывать случайные отключения или низкокачественные соединения.

Симптомы

Serial Monitor показывает сообщения об отключении Wi-Fi

Логи показывают WiFi disconnected, Reason: 200 или аналогичные коды без явной закономерности.

Работает сначала, затем пропадает через минуты или часы

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

Работает в одной сети, не работает в другой

Стабильно работает на одних роутерах, но часто отключается в mesh-сетях, хотспотах или роутерах от провайдера.

Отключение вызывает неожиданные перезагрузки

Отключение совпадает со сбросами watchdog или вылетами loop, особенно когда логика переподключения не обработана должным образом.

Решения

Отключите режим энергосбережения Wi-Fi

Используйте WiFi.setSleep(false) в вашем setup-коде для отключения поведения энергосбережения, которое может вызывать отключения.

Переместите ближе к точке доступа или улучшите сигнал

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

Увеличьте время аренды DHCP

Настройте параметры роутера для продления времени аренды DHCP и предотвращения периодических отключений из-за истёкших аренд.

Реализуйте логику переподключения в коде

Используйте обработчики событий для обнаружения отключений и программного запуска переподключений для поддержания работоспособности.

Подробнее

ESP32 случайно отключается от Wi-Fi

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

Это руководство рассматривает наиболее распространённые причины неожиданных отключений и способы их устранения для стабильной долгосрочной работы.


Распространённые симптомы

Вы можете наблюдать:

  • Вывод в Serial Monitor вида:
[WiFi-event] Disconnected. Reason: 200
  • Отключение через фиксированный интервал (например, 1 час)
  • ESP32 перезагружается при отключении Wi-Fi (если не обработано в коде)
  • Работает нормально на одних роутерах, не работает на других

Эти подсказки указывают на одну из нескольких распространённых причин.


Ключевые причины случайных отключений Wi-Fi

📶 Слабый или нестабильный сигнал Wi-Fi

Если ESP32 находится слишком далеко от роутера или окружён помехами (стены, бытовая техника, металл), сигнал может колебаться. Это вызывает потерю пакетов и в конечном итоге отключения.

Вы можете проверить RSSI с помощью:

Serial.println(WiFi.RSSI());

Значения слабее -75 дБм часто указывают на нестабильную работу.

RSSI (дБм)Качество сигналаОжидаемая стабильность
> -50ОтличноСтабильно
-50 … -65ХорошоОбычно стабильно
-65 … -75УдовлетворительноВозможны проблемы
< -75ПлохоЧастые отключения

⏱ Режим сна Wi-Fi мешает стабильности

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

Чтобы отключить:

WiFi.setSleep(false);

Размещайте это перед WiFi.begin() в вашем setup-коде.

🔧 Тайм-аут DHCP или проблемы с арендой на роутере

Многие роутеры выдают короткие аренды DHCP (например, 1 час). Если ESP32 не успевает продлить аренду вовремя или аренда теряется из-за сбоя сигнала, роутер может разорвать соединение.

Это часто приводит к отключению через предсказуемые интервалы (например, каждые 3600 секунд).

Для решения:

  • Установите более длинное время аренды в настройках роутера (например, 24 часа или бесконечно)
  • Или назначьте статический IP:
IPAddress local_IP(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(8, 8, 8, 8);

WiFi.config(local_IP, gateway, subnet, dns);

📡 Радиочастотные помехи или загруженность каналов

Диапазон 2.4 ГГц, используемый ESP32, разделяется с Bluetooth, микроволновыми печами и множеством других Wi-Fi-сетей. Если ваша сеть перекрывается с множеством других на том же или соседних каналах (например, канал 6), загруженность может вызывать отключения.

Используйте приложение Wi-Fi-анализатора для сканирования каналов и выберите менее загруженный в настройках роутера.


Лучшие практики предотвращения случайных отключений

✅ Отключите режим энергосбережения Wi-Fi

Это единственное наиболее эффективное исправление для долгоработающих приложений:

WiFi.setSleep(false);

Это гарантирует, что ESP32 поддерживает постоянное соединение и избегает проблем синхронизации с роутером.

✅ Добавьте логику переподключения

Обнаруживайте отключения и автоматически переподключайтесь с помощью обработчиков событий:

WiFi.onEvent([](WiFiEvent_t event) {
  if (event == SYSTEM_EVENT_STA_DISCONNECTED) {
    Serial.println("WiFi потерян, переподключение...");
    WiFi.reconnect();
  }
});

Или используйте таймер для периодической проверки WiFi.status() и переподключения.

✅ Используйте статический IP на ненадёжных роутерах

Установив фиксированный IP, вы обходите проблемы с истечением аренды DHCP:

IPAddress local_IP(192, 168, 1, 150);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(8, 8, 8, 8);

WiFi.config(local_IP, gateway, subnet, dns);
WiFi.begin(ssid, password);

✅ Улучшите положение антенны или экранирование

Даже со встроенными PCB-антеннами качество сигнала значительно улучшается, если:

  • ESP32 установлен вертикально
  • Расположен подальше от металлических корпусов
  • Используется внешняя антенна (если доступна на вашем модуле)

Полный пример: устойчивое Wi-Fi-подключение

#include <WiFi.h>

const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";

unsigned long lastReconnectAttempt = 0;
const unsigned long reconnectInterval = 10000; // 10 секунд

void WiFiEvent(WiFiEvent_t event) {
  switch (event) {
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("⚠️ Wi-Fi отключён!");
      Serial.print("Причина: ");
      // Причина будет в логах
      break;
    case SYSTEM_EVENT_STA_GOT_IP:
      Serial.print("✅ Подключено! IP: ");
      Serial.println(WiFi.localIP());
      Serial.print("RSSI: ");
      Serial.print(WiFi.RSSI());
      Serial.println(" дБм");
      break;
    default:
      break;
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  WiFi.onEvent(WiFiEvent);
  WiFi.mode(WIFI_STA);
  WiFi.setSleep(false);  // Отключить режим сна
  WiFi.begin(ssid, password);
  
  Serial.println("Подключение к Wi-Fi...");
  
  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
  }
  
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nУспешно подключено!");
  } else {
    Serial.println("\nНе удалось подключиться. Перезагрузка...");
    ESP.restart();
  }
}

void loop() {
  // Проверка подключения и переподключение
  if (WiFi.status() != WL_CONNECTED) {
    unsigned long now = millis();
    if (now - lastReconnectAttempt > reconnectInterval) {
      lastReconnectAttempt = now;
      Serial.println("Попытка переподключения...");
      WiFi.disconnect();
      WiFi.begin(ssid, password);
    }
  }
  
  // Периодический вывод состояния
  static unsigned long lastStatus = 0;
  if (millis() - lastStatus > 30000) {
    lastStatus = millis();
    if (WiFi.status() == WL_CONNECTED) {
      Serial.printf("📶 Статус: подключено | RSSI: %d дБм | IP: %s\n",
        WiFi.RSSI(), WiFi.localIP().toString().c_str());
    } else {
      Serial.println("❌ Статус: отключено");
    }
  }
  
  delay(100);
}

Коды причин отключения Wi-Fi

При отключении ESP32 выводит код причины. Вот наиболее частые:

КодПричинаОписание
2AUTH_EXPIREИстёк срок аутентификации
4ASSOC_EXPIREИстёк срок ассоциации
6NOT_ASSOCEDНе ассоциирован
7NOT_AUTHEDНе аутентифицирован
8DISASSOC_LEAVEОтключён по инициативе клиента
154WAY_HANDSHAKE_TIMEOUTТайм-аут рукопожатия
200BEACON_TIMEOUTТайм-аут маяка (потеря сигнала)
201NO_AP_FOUNDТочка доступа не найдена
202AUTH_FAILОшибка аутентификации

Код 200 (BEACON_TIMEOUT) — самый распространённый и обычно указывает на проблемы с сигналом или режимом сна.


Заключение

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

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

  • Отключите режим сна
  • Улучшите качество сигнала
  • Обрабатывайте отключения в программном коде
  • Рассмотрите статический IP или более длинную аренду DHCP

Стабильное Wi-Fi-соединение — ключ к надёжным IoT-системам, и с правильными настройками ESP32 может поддерживать подключение днями и даже неделями без проблем.

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

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

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

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

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

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

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