Частые причины
-
📶
Слабый или нестабильный сигнал 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 выводит код причины. Вот наиболее частые:
| Код | Причина | Описание |
|---|---|---|
| 2 | AUTH_EXPIRE | Истёк срок аутентификации |
| 4 | ASSOC_EXPIRE | Истёк срок ассоциации |
| 6 | NOT_ASSOCED | Не ассоциирован |
| 7 | NOT_AUTHED | Не аутентифицирован |
| 8 | DISASSOC_LEAVE | Отключён по инициативе клиента |
| 15 | 4WAY_HANDSHAKE_TIMEOUT | Тайм-аут рукопожатия |
| 200 | BEACON_TIMEOUT | Тайм-аут маяка (потеря сигнала) |
| 201 | NO_AP_FOUND | Точка доступа не найдена |
| 202 | AUTH_FAIL | Ошибка аутентификации |
Код 200 (BEACON_TIMEOUT) — самый распространённый и обычно указывает на проблемы с сигналом или режимом сна.
Заключение
Случайные отключения Wi-Fi на ESP32 часто вызваны слабым сигналом, особенностями роутера или поведением энергосбережения. Это не баги в вашем коде — а проблемы среды или конфигурации.
Для поддержания стабильного подключения ESP32:
- Отключите режим сна
- Улучшите качество сигнала
- Обрабатывайте отключения в программном коде
- Рассмотрите статический IP или более длинную аренду DHCP
Стабильное Wi-Fi-соединение — ключ к надёжным IoT-системам, и с правильными настройками ESP32 может поддерживать подключение днями и даже неделями без проблем.
Быстрая навигация
Дополнительные ресурсы
Всё ещё есть проблема с ESP32? Давайте решим её вместе.
Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.
Регистрация не требуется. Начните решать проблемы прямо сейчас!