Частые причины
-
⏱
Режим энергосбережения Wi-Fi включён по умолчанию
ESP32 по умолчанию включает режим модемного сна (modem sleep), который периодически отключает части трансивера для экономии энергии.
-
🔋
Несовместимый интервал маяков роутера
Некоторые роутеры используют интервалы маяков (beacon), которые не совпадают с циклами пробуждения модемного сна ESP32, что приводит к пропущенным пакетам и отключениям.
-
⚠️
Блокирующие операции во время сна
Если ваше приложение выполняет блокирующие операции или отключает фоновые задачи, стек Wi-Fi может не проснуться вовремя для сохранения синхронизации.
-
🧯
Нестабильное питание усугубляется переходами сна
Провалы напряжения во время переходов сон-бодрствование могут вызвать нестабильность, если источник питания работает на пределе.
Симптомы
Отключения происходят периодически
Wi-Fi-соединение пропадает через несколько минут, особенно при простое или низком трафике.
Работает при активной передаче данных
Соединение остаётся активным при активных передачах, но пропадает при простое или в режимах низкого энергопотребления.
Улучшается после отключения режима сна
Добавление WiFi.setSleep(false) устраняет случайные отключения, подтверждая проблему, связанную со сном.
Потеря пинга или MQTT во время простоя
Устройства теряют пинги или не проходят проверку MQTT keepalive из-за сна модема во время окон рукопожатия.
Решения
Отключите режим сна Wi-Fi
Вызовите WiFi.setSleep(false) после WiFi.begin(), чтобы радиомодуль всегда оставался включённым и поддерживал непрерывное соединение.
Настройте интервалы keepalive
Увеличьте интервалы MQTT или TCP keepalive и окна прослушивания маяков для лучшей совместимости с модемным сном.
Переключите роутер на режим только 20 МГц
Некоторые модули ESP32 работают лучше, когда Wi-Fi-канал установлен на 20 МГц вместо 40 МГц в настройках роутера.
Улучшите стабильность питания
Убедитесь, что регулятор 3.3В справляется с переходами сон-бодрствование без brownout или сбоев.
Подробнее
Режим сна Wi-Fi вызывает разрывы на ESP32
Ваш ESP32 загружается и успешно подключается к Wi-Fi, но соединение пропадает через несколько минут бездействия. Или ваши MQTT-сообщения перестают приходить через некоторое время. Если это звучит знакомо, режим сна Wi-Fi может быть причиной.
По умолчанию ESP32 использует модемный сон — режим низкого энергопотребления, который периодически отключает части Wi-Fi-радиомодуля. Хотя это экономит энергию, это может вызывать периодические отключения или пропущенные пакеты, особенно на определённых роутерах или с определёнными сетевыми настройками.
Почему режим сна Wi-Fi вызывает проблемы
Модемный сон ESP32 включается автоматически при использовании WiFi.begin() в большинстве фреймворков. Этот режим разработан для снижения энергопотребления, позволяя чипу «дремать» между интервалами маяков.
Однако могут возникнуть следующие проблемы:
- ESP32 может пропускать маяки или keepalive-пакеты, если время сна не совпадает с конфигурацией роутера
- MQTT или TCP-соединения могут прерваться по тайм-ауту, если ESP32 спит во время интервалов рукопожатия или пинга
- Некоторые роутеры плохо переносят поведение ESP32 в режиме низкого энергопотребления и принудительно отключают соединение
Распознавание симптомов, связанных со сном
⏱ Отключения после простоя
Если ваш ESP32 остаётся подключённым при передаче данных, но отключается при простое (например, во время delay()), он, вероятно, находится в режиме сна.
📉 Ошибки MQTT Keepalive или пинга
MQTT-клиенты могут разрывать соединение из-за пропущенных пингов:
[MQTT] Connection lost: reason=ping timeout
🔁 Соединение восстанавливается с WiFi.setSleep(false)
Если вы добавите эту строку:
WiFi.setSleep(false);
и отключения прекратятся, проблема была в режиме сна.
🔋 Соединение пропадает при перезагрузке роутера
Модемный сон также может мешать времени переподключения, если роутер имеет длинные интервалы маяков или требует время для перезагрузки.
Как отключить режим сна Wi-Fi
Добавьте это после подключения к Wi-Fi:
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
WiFi.setSleep(false);
Это поддерживает Wi-Fi-модем полностью запитанным и отзывчивым в любое время.
Вы можете проверить режим сна с помощью:
Serial.println(WiFi.getSleep());
Другие стратегии смягчения проблемы
🛠 Настройте MQTT Keepalive и параметры TCP
Увеличьте интервалы keepalive или уменьшите частоту пинга, чтобы дать ESP32 больше времени между активностью:
mqttClient.setKeepAlive(60); // Увеличить с 15-30 секунд по умолчанию
Также рассмотрите возможность включения автоматического переподключения в вашей MQTT-библиотеке.
📡 Настройте параметры роутера
Некоторые роутеры используют 40 МГц Wi-Fi-каналы или длинные интервалы маяков (например, 1024 мс), с которыми ESP32 может плохо справляться в режиме сна. В расширенных настройках роутера:
- Используйте только 20 МГц (улучшает совместимость с ESP32)
- Установите интервал маяков на 100–300 мс
- Избегайте режимов mesh или изоляции точек доступа
🔋 Обеспечьте стабильное питание
Переходы сон-бодрствование включают быстрые изменения потребления тока. Если ваш LDO 3.3В или USB-питание слабые, эти переходы могут вызвать brownout радиомодуля или процессора.
Используйте:
- Регулятор с низким падением напряжения и быстрым откликом (например, AMS1117 или TLV75533)
- Развязывающий конденсатор рядом с ESP32 (10–47 мкФ)
Пример: полная настройка с отключением сна и переподключением
#include <WiFi.h>
const char* ssid = "ВашаСеть";
const char* password = "ВашПароль";
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Wi-Fi отключён, переподключение...");
WiFi.reconnect();
break;
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("Wi-Fi подключён");
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.print("IP-адрес: ");
Serial.println(WiFi.localIP());
break;
default:
break;
}
}
void setup() {
Serial.begin(115200);
WiFi.onEvent(WiFiEvent);
WiFi.mode(WIFI_STA);
WiFi.setSleep(false); // Отключить режим сна ДО подключения
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nПодключено!");
Serial.print("Режим сна: ");
Serial.println(WiFi.getSleep() ? "включён" : "отключён");
}
void loop() {
// Ваш основной код
delay(1000);
}
Заключение
Режим сна Wi-Fi на ESP32 энергоэффективен, но может вызывать периодические проблемы с подключением — особенно для приложений, требующих непрерывной работы 24/7.
Если вы наблюдаете случайные отключения или потерю пинга:
- Отключите режим сна с помощью
WiFi.setSleep(false) - Следите за стабильностью питания
- Настройте параметры роутера и MQTT
Эти настройки значительно улучшают надёжность, особенно для умного дома или долгоработающих IoT-приложений.
Быстрая навигация
Дополнительные ресурсы
Всё ещё есть проблема с ESP32? Давайте решим её вместе.
Наш интерактивный мастер устранения неполадок проведёт вас через распространённые проблемы ESP32 и их решения шаг за шагом.
Регистрация не требуется. Начните решать проблемы прямо сейчас!