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

WiFi STA нестабильные подключения

businka

New member
Испытал разные танцы с бубном на своей NodeMCU. Один и тот же код подключается к WiFi через раз. С какого-то момента вообще перестает подключаться.
Код:
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, pass);
   
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
    }
в режиме отладки вижу следующую картину.
Код:
f -180, ..scandone
state: 0 -> 2 (b0)
.state: 2 -> 0 (2)
reconnect
f`r0, ..scandone
state: 0 -> 2 (b0)
.state: 2 -> 0 (2)
reconnect
f 0, ..scandone
state: 0 -> 2 (b0)
.state: 2 -> 0 (2)
reconnect
f -180, ...scandone
state: 0 ->@2 (b0)
.state: 2 -> 0 (2)
reconnect
ж т0, ..scandone
state:`0 -> 2 (b0)
.state: 2 -> 0 (2)
recпnnect
f 0, ..scandone
state: 0 -> 2 (b0)
.state: 2 -> 0 (2)
reconnect
f -180, ..scandone
state: 0 -> 2 (b0)
.state: 2 -> 0 (2)
В настройках роутера особо настраивать нечего. замечено что если передернуть канал на роутере какое то время начинает подключаться. Пробовал на двух разных роутерах. одна и та же песня.

так выглядит нормальный журнал роутера, когда ESP подключается
Код:
22 ноя 22:22:30    udhcpd[4629]    Found static lease ip address: 192.168.1.34
22 ноя 22:22:30    udhcpd[4629]    Sending OFFER of 192.168.1.34
22 ноя 22:22:30    udhcpd[4629]    Found static lease ip address: 192.168.1.34
22 ноя 22:22:30    udhcpd[4629]    Sending ACK to 192.168.1.34
В те моменты когда она подключается, логи роутера пустые.

В попытках понять причину обнаружил интересную ситуацию, что убрав весь код подключения ESP к WiFi она стала подключаться к WiFi .
Код:
#include <ESP8266WiFi.h>

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true); 
}
void loop() {
}
возник вопрос, ESP как то сама подключается к последней точке? или я чего то не врубаюсь.
Код:
reconnect
f 0, scandone
state: 0 -> 2 (b0)
state: 2 -> 0 (2)
reconnect
f -180, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 4
cnt
chg_B1:-140

connected with Businka_YarNet, channel 9
dhcp client start...
chg_B1:-100
ip:192.168.1.34,mask:255.255.255.0,gw:192.168.1.1
chg_B1:-60
pm open,type:2 0
на сайте arduiono вообще предлагаю другую концепцию подключения
Код:
int status = WL_IDLE_STATUS;                     // the Wifi radio's status

void setup() {
  
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WEP network, SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, keyIndex, key);

    // wait 10 seconds for connection:
    delay(10000);
  }
один фиг проблема та же. на ровном месте перестает подключаться к WiFi. уже всю голову сломал. помогите плз.
 

businka

New member
код из примера библиотеки WebSocket
arduinoWebSockets/WebSocketServer.ino at master · Links2004/arduinoWebSockets · GitHub
выдает следующий лог, выходит что ESP пытается установить параллельно два соединения
Код:
[SETUP] BOOT WAIT 4...
[SETUP] BOOT WAIT 3...
scandone
state: 0 -~ 2 (b0)
[SETUP] BOOT WAIT 2...
state: 2 -> 0 (2)
reconnect
f 0, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 4
cnt
[SETUP] BOOT WAIT 1...

connected with Businka_YarNet, channel 9
dhcp client start...
state: 5 -> 0 (0)
rm 0
f r0, scandone
f r0, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 4
cnt

connected with Businka_YarNet, channel 9
dhcp client start...
ip:192.168.1.34,mask:255.255.255.0,gw:192.168.1.1
pm open,type:2 0
 

pvvx

Активный участник сообщества
В попытках понять причину обнаружил интересную ситуацию, что убрав весь код подключения ESP к WiFi она стала подключаться к WiFi .
...
возник вопрос, ESP как то сама подключается к последней точке? или я чего то не врубаюсь.
Подключается сама, что не совместимо с Arduino.
Ещё много у ESP8266 различий и специфик от стандартов в Arduino.
 

pvvx

Активный участник сообщества
какой тогда правильный код подключения к wifi?
Во первых зависит от установок вашего роутера.
Функции WiFi.begin() отличаются по кол-ву и типу параметров...
Как их использовать, в цикле с проверкой на соединение или ещё как зависит от ваших предпочтений.
Вопрос поставлен не верно - "правильной код"? Какие условия и т.д.?
Вы сами привели код из "примеров". Он не всегда оптимален и не учитывает все условия.
У меня, к примеру, если установка уровня RF TX в WiFi по умолчанию (стоит на max), то соединяется плохо на предпоследней SDK. Как это сменить на Arduino я не в курсе, но думаю что можно.
 
Последнее редактирование:

rybeg

New member
У меня, к примеру, если установка уровня RF TX в WiFi по умолчанию (стоит на max), то соединяется плохо на предпоследней SDK. Как это сменить на Arduino я не в курсе, но думаю что можно.
Изменяюсь, что влез в тему, SDK ver: 1.5.2. какой уровень RF TX ставить оптимальный ??? И еще бывает при перезагрузке модуля, нет соединения с WIFI роутером, по логам роутера, вижу, что пытается соединиться, но что то не дает, пока сам не подключусь и не перегружу. Спасибо.
 

pvvx

Активный участник сообщества
Изменяюсь, что влез в тему, SDK ver: 1.5.2. какой уровень RF TX ставить оптимальный ??? И еще бывает при перезагрузке модуля, нет соединения с WIFI роутером, по логам роутера, вижу, что пытается соединиться, но что то не дает, пока сам не подключусь и не перегружу. Спасибо.
Из доки:
Код:
Function:
Set maximum value of RF TX Power, unit : 0.25dBm
Prototype:
void system_phy_set_max_tpw(uint8 max_tpw)
Parameter:
uint8 max_tpw : maximum value of RF Tx Power, unit : 0.25dBm, range [0, 82]
it can be set refer to the 34th byte (target_power_qdb_0) of
esp_init_data_default.bin(0127byte)
Return:
none
Стоит уровень 82 ед. Ставил на о бум 75 - тогда всегда работало.
 

businka

New member
мне кажется дело было в питании. поставил более мощный блок питания. проблемы с Wifi вроде ушли. у уход в перезагрузку при подключении по websocket тоже - видимо шла нагрузка при активном WiFi и модуль ребутился.
 

businka

New member
все таки какая фигня со стандартной библиотекой WiFi. Соединение устанавливается автоматически, а статус этого не видит.
имеет ли какое то значение, что я из своей библиотеки соединение устанавливаю.
Код:
[SETUP] BOOT WAIT 3...
scandone
state: 0 -> 2 (b0)
[SETUP] BOOT WAIT 2...
state: 2 -> 0 (2)
reconnect
f 0, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 4
cnt
chg_B1:-40

connected with Rediska_VDSL, channel 5
dhcp client start...
[SETUP] BOOT WAIT 1...
ip:192.168.1.39,mask:255.255.255.0,gw:192.168.1.1

Connecting to Rediska_VDSL
f r-40, 6scandone
66pm open,type:2 0
66666666666666666666666Fatal exception 28(LoadProhibitedCause):
epc1=0x401028dc, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000220, depc=0x00000000

Exception (28):
epc1=0x401028dc epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000220 depc=0x00000000

ctx: sys
sp: 3ffffcd0 end: 3fffffb0 offset: 01a0

>>>stack>>>
3ffffe70:  3ffed7c0 40102a6e 00000000 00000000 
3ffffe80:  00000000 01b1b157 53000000 4000050c 
3ffffe90:  3fffc278 401028c4 3fffc200 00000022 
3ffffea0:  3ffffeb0 0195151f 40214ef7 3fff15b4 
3ffffeb0:  40000f68 00000030 0000001e ffffffff 
3ffffec0:  40000f58 00000000 00000020 00000000 
3ffffed0:  3ffe9d50 c162d3d8 3ff20a00 c0000000 
3ffffee0:  00002000 00000000 0000001c 3fffdab0 
3ffffef0:  00000000 3fffdcc0 3ffe9758 00000030 
3fffff00:  3ffe8004 0000003c 40101993 3ffecef0 
3fffff10:  00000000 00000000 00000020 4010184a 
3fffff20:  3ffe9640 402098c7 3ffecef0 3ffed8e0 
3fffff30:  000005e0 00000000 40103949 3ffed7c0 
3fffff40:  0000003c 00000000 00000000 00000100 
3fffff50:  0000001c 00000001 40104a72 3ffed7c0 
3fffff60:  3ffecef0 401013de 00000000 3ffed3e4 
3fffff70:  3ffecef0 401011ab 00000000 00000000 
3fffff80:  401011e6 00000000 00000002 00000000 
3fffff90:  40209582 3fffdab0 00000000 3fffdab0 
3fffffa0:  3ffe9758 40000f49 3fffdab0 40000f49 
<<<stack<<<

ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v60000318
~ld
ш
Код:
void CbWebSocketServer::setup()
{
  char ssid[] = "Rediska_VDSL";
  char pass[] = "";  // your network password

   Serial.println();
    for (uint8_t t = 3; t > 0; t--) {
        Serial.printf("[SETUP] BOOT WAIT %d...\n", t);
        Serial.flush();
        delay(3000);
    }
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);


    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {

        Serial.print(WiFi.status());
        delay(3000);
    }

    Serial.println("");
    Serial.println("WiFi connected");
 

businka

New member
Во первых зависит от установок вашего роутера.
Функции WiFi.begin() отличаются по кол-ву и типу параметров...
Как их использовать, в цикле с проверкой на соединение или ещё как зависит от ваших предпочтений.
Вопрос поставлен не верно - "правильной код"? Какие условия и т.д.?
Вы сами привели код из "примеров". Он не всегда оптимален и не учитывает все условия.
У меня, к примеру, если установка уровня RF TX в WiFi по умолчанию (стоит на max), то соединяется плохо на предпоследней SDK. Как это сменить на Arduino я не в курсе, но думаю что можно.
у меня нет каких то специальных условий или предпочтений. есть точка доступа с которой хочется иметь быстрое и стабильное подключение. я надеялся что код из примеров это обеспечит, иначе для чего он там написан если в большинстве случаев не работает.

по поводу мощности - спасибо за наводку. вероятно придется модернизировать библиотеку WiFi, странно что я первый столкнулся с проблемой. все таки надеюсь что это не так.

давно хочу перейти на UDK, но недостаток опыта не позволяет запустить даже тестовый пример. пост в соответствующей теме
 

Daenur

New member
Подтверждаю наличие проблем с WiFi. Имеется два роутера Zyxel. К одному получалось подключиться всего несколько раз, остальное время ошибки - как у автора темы. А к другому - с первого раза всегда подключается.

upd. Реализовал свой вариант подключения. Основной момент, влияющий на стабильность подключения, у меня - мощность передатчика.

Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

ADC_MODE(ADC_VCC);

#define DEBUG_MODE true;

static const char * enumConnectionStatus[] = { "WL_IDLE_STATUS", "WL_NO_SSID_AVAIL", "WL_SCAN_COMPLETED",
    "WL_CONNECTED", "WL_CONNECT_FAILED", "WL_CONNECTION_LOST", "WL_DISCONNECTED" };

const char* ssid = "mySSID";
const char* password = "myPass";

void setup()
{
    Serial.begin(115200);

#ifdef DEBUG_MODE
    Serial.println("Starting...");
    Serial.println("WiFi initializing...");
#endif

    WiFi.setOutputPower(20);
    //WiFi.setAutoConnect(false);
    //WiFi.setAutoReconnect(true);
    WiFi.mode(WIFI_STA);

#ifdef DEBUG_MODE
    Serial.print("WiFi connecting");
#endif
 
    uint8_t wifiStatus = WL_IDLE_STATUS;
    int attempts = 0;
    WiFi.begin(ssid, password);
    //wifiStatus = WiFi.waitForConnectResult();
    delay(100);

    while (wifiStatus != WL_CONNECTED)
    {
#ifdef DEBUG_MODE
        Serial.print(".");
#endif

        wifiStatus = WiFi.status();
        delay(1000);
        attempts++;

        if (attempts > 20)
        {
#ifdef DEBUG_MODE
            Serial.println("");
            Serial.print("Connection status: ");
            Serial.println(enumConnectionStatus[wifiStatus]);
            Serial.println("Connection failed! Rebooting...");
#endif
            ESP.restart();
        }
    }

#ifdef DEBUG_MODE
    Serial.println("");
    Serial.print("Connection status: ");
    Serial.println(enumConnectionStatus[wifiStatus]);
    Serial.print("Connected to WiFi, IP address: ");
    Serial.println(WiFi.localIP());
#endif
}

void loop()
{
    double vcc = (double)ESP.getVcc() / 1000;

#ifdef DEBUG_MODE

    Serial.print("\tVcc = ");
    Serial.println(vcc);

#endif

    delay(3000);
}
 
Последнее редактирование:

sasasa

Member
Я тоже замучился этим. Думаю как сделать автоподстройку мощности.
 

sasasa

Member
Сегодня опять замучила эта проблема. Просто не хочет ЕСПка соединятся с рутером.
WiFi.begin(ssid, password);
После 5 перезагрузки наконец подключилась, потом следующий раз опять ничего. Даже не знаю что ковырять. Может быть сама ЕСПка бракованная?
 

pvvx

Активный участник сообщества
Сегодня опять замучила эта проблема. Просто не хочет ЕСПка соединятся с рутером.
WiFi.begin(ssid, password);
После 5 перезагрузки наконец подключилась, потом следующий раз опять ничего. Даже не знаю что ковырять. Может быть сама ЕСПка бракованная?
Менять переменные в esp_init_data_default.bin не пробовали? На счет подключения - статистики нет, т.к. нет в наличии дома множества роутеров, а на десятке - это не статистика... На отваливание от любого роутера влияет байт 112 в esp_init_data_default.bin. Ставьте = 0.
 
Сверху Снизу