• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP-01 валит WiFi?

Fduch

New member
Всем привет.
Я наткнулся на очень странное поведение ESP, потратил 3 дня в попытках самостоятельно разобраться, уже все перепробовал, но так и не смог понять, в чем проблема. Скорее всего, я делаю что-то не так, но для того, чтобы понять, что именно, мне нужен взгляд со стороны.
Есть ESP-01. На нее прошит следующий скетч:
Код:
#define DEBUG_ESP_WIFI
#define DEBUG_ESP_PORT Serial

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti WiFiMulti;

void setup()
{
  Serial.begin(9600);
  Serial.setDebugOutput(true);
  delay(2000);

  WiFi.mode(WIFI_STA);

  WiFiMulti.addAP("my_wifi", "my_password");

  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  while (WiFiMulti.run() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  delay(500);
}

void loop()
{
  Serial.print("WiFi Status: ");
  Serial.print(WiFi.status());
  Serial.print("; is connected: ");
  Serial.print(WiFi.isConnected());
  Serial.println();

  delay(5000);
}
Когда ESP присоединяется к WiFi, WiFi становится очень медленным. Ответы от гугла начинают приходить с большой задержкой. Если запустить тест скорости с https://www.speedtest.net , то заметны сильные скачки в скорости, например 35 -> 4 -> 15 Mb/s. Без ESP все стабильно. К WiFi подключено 2 телефона и 2 ноутбука. С большинством из них проблем не возникает, но если к WiFi подключается один ноутбук (назовем его "ноутбук Х"), то WiFi падает. Переподключение устройств к точке доступа не помогает - они просто не могут законнектиться. При этом сам роутер доступен по Ethernet и в его логах никаких ошибок нет. Единственное, что помогает - это рестарт роутера.
Вот пара тестов, которые я провел:
1. Перезагрузка роутера. НЕ присоединяю ESP и ноутбук Х. Проверяю скорость WiFi на устройствах - все нормально. Подключаю ESP. Проверяю скорость WiFi - она стала заметно ниже. Подключаю ноутбук Х - WiFi падает.
2. Перезагрузка роутера. НЕ присоединяю ESP и ноутбук Х. Проверяю скорость WiFi на устройствах - все нормально. Подключаю ESP. Проверяю скорость WiFi - она стала заметно ниже. Отключаю ESP, жду пару минут. Проверяю скорость WiFi - она все еще низкая. Подключаю ноутбук Х - WiFi падает, даже несмотря на то, что ESP уже не подключена.

Такое ощущение, что когда ESP присоединяется к роутеру, то на нем что-то меняется. Если после этого подключается ноутбук Х, то это вызывает падение WiFi. Знаю, что звучит это бредово, но я все еще не нашел объяснения происходящему.
Я подумал, что проблема может быть в роутере. Я сделал точку доступа на одном из своих телефонов, подключился к ней с другого телефона. Соединение стабильное, не падало и не тормозило несколько часов. Потом я присоединил ESP - WiFi стал заметно медленнее, но все еще не падал. Через 23-30 минут WiFi упал. Т.е. ESP влияет не только на роутер, но и на точку доступа на телефоне. Сейчас я ищу другой роутер, чтобы протестировать на нем, но вроде как роутер тут ни при чем.
Так же я пытался стереть весь флеш с помощью ESPFlasher - не помогло.
Еще я предположил, что ESP может не хватать питания, т.к. я его питаю от USB через адаптер https://www.aliexpress.com/item/32971337222.html?spm=a2g0s.9042311.0.0.6d104c4db2jeQM Я подсоединил адаптер непосредственно к USB-зарядке - не помогло.

Как думаете, в чем может быть дело? Проблема с железом? Или я что-то не так делаю?
Заранее большое спасибо за любую помощь!
 

enjoynering

Well-known member
в документации Arduino рекомендуется не подымать выходную мощность передатчика esp8366 выше +18dBm чтоб избежать проблем как у вас.
 

pvvx

Активный участник сообщества
в документации Arduino рекомендуется не подымать выходную мощность передатчика esp8366 выше +18dBm чтоб избежать проблем как у вас.
Каким образом уровень сигнала от одного устройства в сети может влиять на других? ESP шлет пакеты не вовремя, не в своё время, которое распределяет роутер?

Из гарантированного, с чем не совместима ESP в современных стандартах WiFi роутеров - это короткая преамбула. Бывает опциальна. Этой опции уже много лет, для перехода к новым стандартам, чтобы включать поддержку устаревших устройств, путем её отключения.

При короткой преамбуле ESP не видит роутер и ответов от роутера, что может привести к многочисленным повторам передач пакетов от ESP и засорению эфира.

А на дворе уже давно стандарт Wifi 6. Ни одной новой опции в нем ESP не поддерживает.
 

pvvx

Активный участник сообщества
В некоторых чипах по преамбуле производится подсинхронизация частоты на канал. У ESP с этой функциональностью давно проблемы, до аппаратного зависания или перезагрузки.
Остальное, что делает из ESP хулигана в сети WiFi, связано с распределением времени в Arduino для работы RF драйвера. Точность синхронизации часов участников в WiFi должна стремиться к 1 us между beacon, с разбросом в пару us для бытовых дешевых устройств. Следовательно, если loop() или какая процедура, которая выполняется более пары us, сбивает синхронизацию. Особенно актуально для C++ со string, которые вызывают поиск и распределение места в heap с запретом прерываний.
 

enjoynering

Well-known member
Вот таким.
If wifi connection issues are encountered due to signal noise, one thing to try is to reduce the Tx power. This has been found effective in cases where STA mode is in use with 802.11n phy (default). Reducing to e.g.: 17.5dBm or slightly lower can reduce noise and improve connectivity, although max range will also be reduced.
А на счёт ваших страшилок - сейчас к роутеру в режиме 24/7 поключен WEMOS D1 Mini (проект MatrixClock), ничего не тормозит и не отваливается.
 

Fduch

New member
На всякий случай, добавлю несколько деталей:
Используется 802.11n. Ширина канала 20/40 Мгц. Канал пробовал конкретный и "авто".
ESP, судя по всему, коннектиться к WiFi. В логах пишется "WiFi Status: 3; is connected: 1". Статус "3" - WL_CONNECTED
в документации Arduino рекомендуется не подымать выходную мощность передатчика esp8366 выше +18dBm чтоб избежать проблем как у вас.
Спасибо за идею. Сейчас разберусь, как это делается, проверю и отпишусь о результатах.
 

pvvx

Активный участник сообщества
Вот таким.
If wifi connection issues are encountered due to signal noise, one thing to try is to reduce the Tx power. This has been found effective in cases where STA mode is in use with 802.11n phy (default). Reducing to e.g.: 17.5dBm or slightly lower can reduce noise and improve connectivity, although max range will also be reduced.
Т.е. ESP ещё шумит в эфир?
А на счёт ваших страшилок - сейчас к роутеру в режиме 24/7 поключен WEMOS D1 Mini (проект MatrixClock), ничего не тормозит и не отваливается.
У меня до сих пор работает проводный телефон и механические выключатели для включения света... А так-же есть рабочий телевизор с голубым экраном и защитным стеклом, но показывает только шум с антенны - нет станций, а вот УКВ радио в нем ещё работает - есть станции...
Никто не запрещает вам создавать музеи с антикварными устройствами.
 

pvvx

Активный участник сообщества
WiFi.setOutputPower(db);
Не влияет. Описано и на github.

Описанный выше скетч, при установке на роутере поддержки устаревших устройств на 2.4ГГц соединяется не всегда.
Бывает с 20-го раза, а бывает и сразу. WiFi.setOutputPower с числами от 0 до 20 не влияет;
А на счёт ваших страшилок - сейчас к роутеру в режиме 24/7 поключен WEMOS D1 Mini (проект MatrixClock), ничего не тормозит и не отваливается.
Для теста к роутеру подключены всего 2 клиента - смарт, который измеряет и ESP.
ESP8266 c данным выше скетчем работает:
1615564708743.png
ESP8266 отключена:
1615564769486.png
Пинг падает, смарт и ESP в 1 метре от роутера.
Если разнести - ESP затмит всё.
Получается что вы опять всё соврали :oops:
 

pvvx

Активный участник сообщества
Пора ваш антикварный роутер на помойку отнести
Когда выйдет более новый то с основным, так и будет. Если вы судите о полосе 2.4ГГц, то там да - уже пора менять смарт, т.к. он не тянет более... А роутер пока 5400 Мбит/с и каналы шириной 160 МГц.
Для тестов есть десяток других, даже антикварных.

Ограничение мощности передатчика у клиента: Клиент будет видеть сеть, но не будет способен отправить пакеты точке доступа.
 

Fduch

New member
Пока уменьшение мощности не проверил, но нашел другой роутер (TP-Link) - на нем все нормально. Настройки все по умолчанию после сброса. Странно.
 

volaltd

Member
Собрал на ESP-01 6 датчиков и прошивке ESPeasy, до 3х одновременно все хорошо. Включаю 6 и канал 2.4Гц пропал. Вы не одиноки )
 

enjoynering

Well-known member
Теперь попробуйте отключить сон радиомодема (в ардуино он по умолчанию включён). Делается это в STA режиме командой:

WiFi.setSleepMode(WIFI_NONE_SLEEP);
 

pvvx

Активный участник сообщества
Теперь попробуйте отключить сон радиомодема (в ардуино он по умолчанию включён). Делается это в STA режиме командой:

WiFi.setSleepMode(WIFI_NONE_SLEEP);
Ещё и это не отладили с 2015 года в ESP? Т.е. каким образом DTIM() может влиять на сеть?
В sleep режимах типа DTIM() Station просто меньше времени активна в эфире и ждет beacon от роутера. А роутер кеширует пакеты (не обязательно все) направленные к station на период beacon и флагами объявляет Station что у него есть передача, чтобы она вышла из сна.
Датчику разве нужен шаг общения с внешним миром дискретностью меньше 102.4 ms?
 

pvvx

Активный участник сообщества
В общем не понятно, как SLEEP режимы у какого-то клиента могут мешать работать другим участникам сети WiFi.
Клиент в режиме sleep спит с отключенным RF и на короткое время просыпается для прием beacon от AP следующего с точностью +-1 us каждые 102.4 ms (период следования задается в настройках роутера).
Т.е. клиент постоянно молчит и не мешает работать другим в сети.
Вот пример работы нормального WiFi SoC модуля в режиме sleep:
Модуль просыпается только на прием beacon от AP и иногда обменивается несколькими пакетами. Во время данного замера несколько раз вызывался ping ip_модуля и пропусков нет

Если клиенту надо что передать, то он оповещает AP - производит согласование-оповещение выхода из DTIM в момент сразу за beacon и работает как обычно.
Аналогично и обратное - AP (по возможности) кеширует пакет направленный к спящему клиенту и сразу после пакета beacon производит согласование-оповещение выхода клиента из DTIM и далее передает ему накопившиеся пакетики (если хватило памяти для кеширования - имеет право и отбросить часть)...

enjoynering - объясните свою рекомендацию, или приведите пример где это помогает - мы разберем, если вы не можете понять.
 

pvvx

Активный участник сообщества
Одно из хулиганств ESP в сети WiFI вызвано тем, что ей пофигу периоды следований beacon от AP. Она и вызывает сбой приема другим клиентам beacon-а, точнее сдвиг выдачи beacon у AP. Каждый пакет beacon подписан меткой времени его выдачи в эфир с точностью 1 us. Если нерадивый клиент продолжает передачу пакета(ов) в момент следования beacon, то AP (чтобы не лепить горбатого – коллизии в сети)ждет и посылает beacon позже, но с уточнением штампа времени его следования. Другие спящие и не спящие клиенты AP при этом, проснувшись, ждут этот beacon расходуя батарейку.

По этому, если у вас есть какой смартфон подключенный к той-же AP, что и ESP, то он садится и изнашивает AKБ значительно быстрее.

Особое влияние на это оказывают процедуры в Arduino с запретом прерываний и не отдающие время для работы дров WiFi. Т.е. длящиеся более 1 us, что описано в документации ESP мелким шрифтом. Любой вызов string в C++ на ESP уже длится более, т.к. работает с запросами памяти в heap, которая распределяется с запретом прерываний.
 

pvvx

Активный участник сообщества
enjoynering - Из-за конкуренции за эфир в древнющем первом стандарте WiFi, ESP (да ещё со своими "оптимаза" от Espressif) по аналогии с дорогой является обочечником. Это сильно влияет на общий трафик AP, аналогично дорожной ситуации при присутствии обочечников. В новых стандартах WiFi эта конкуренция решена, что позволяет обслуживать большее кол-во клиентов одной AP или получать больший трафик.
 

volaltd

Member
В моем случае не самый новый, но приличный брэндовый роутер на BCM4331 с допиленной энтузиастами прошивкой. WiFi укладывается практически до перезагрузки. Отправление ESP-01 в sleep с разными интервалами между модулями не сильно помогло делу. А так сначала все красиво выглядело: дешевый модуль, только флешу поставить побольше и бросить перемычку чтобы не грелся и не нагревал температурный датчик, готовый наворочанный софт с поддержкой всего что душе угодно, но на деле так или иначе глючит оно у всех и в разных масштабах.

@pvvx Восхищаюсь вашим подходом брать всю новую китайщину и выполнять правильные тесты с отсеиванием маркетинга!
 

Fduch

New member
Теперь попробуйте отключить сон радиомодема (в ардуино он по умолчанию включён). Делается это в STA режиме командой:

WiFi.setSleepMode(WIFI_NONE_SLEEP);
Сегодня постараюсь попробовать.
Я очень признателен за ответы и попытки помочь. К сожалению, не всегда находится время, чтобы проверить в тот же момент :)
 
Сверху Снизу