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

esp8266 падает при выключении WIFI

Gollum

New member
Доброе всем время суток.
Есть тестовая программка которая по должна при старте подключаться к роутеру, далее в холостую молотить до 20-й секунды, после чего должен выключится WiFi, и она закольцуется в бесконечном цикле -
Код:
#include <Arduino.h>
#include <ESP8266WiFi.h>

#define SSID "XXXXXXXX"
#define PSWD "XXXXXXXX"

void setup( void ) {
    Serial.begin( 115200 );
    Serial.println( "\n\nSTART" );
  
    WiFi.persistent( false );
    WiFi.mode(WIFI_STA);
  
    Serial.print( "Connecting" );
    for( WiFi.begin( SSID, PSWD ); WiFi.status() != WL_CONNECTED; delay( 500 ) ) Serial.print( "." );
    Serial.printf( "\tOk (%s)\n", WiFi.localIP().toString().c_str() );
}

void loop( void ) {
    if (millis() > 20000){
      
        Serial.print("Disconnecting\t");          
        WiFi.disconnect();
        Serial.println("Ok");
      
        Serial.print("WiFi Off\t");      
        WiFi.mode(WIFI_OFF);
        Serial.println("Ok");
      
        Serial.print("WiFi Sleep\t");
        WiFi.forceSleepBegin();  
        delay( 1 );
        Serial.println("Ok");
      
        while(true) yield();
    }
}
Так вот, она падает на WiFi.forceSleepBegin() с выхлопом-
Код:
START
Connecting.......       Ok (192.168.1.169)
Disconnecting   Ok
WiFi Off        Ok
WiFi Sleep
Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffdd0 end: 3fffffc0 offset: 01b0
3fffff80:  0fffffff 402012b6 00000000 402012a1
3fffff90:  3ffee288 3ffe85ae 3ffee2bc 40201143
3fffffa0:  3fffdad0 00000000 3ffee2f4 40202304
3fffffb0:  feefeffe feefeffe 3ffe8508 40100449
<<<stack<<<

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

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld


START
Connecting.......       Ok (192.168.1.169)
...
Пробовал выключать WiFi так-
Код:
wifi_station_disconnect();
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
wifi_fpm_open();
wifi_fpm_do_sleep(0xFFFFFFF);
но с тем же результатом - падает на wifi_fpm_do_sleep(0xFFFFFFF) :(

Люди добрые, сами мы не местные, помогите кто чем может...
Тьфу ты, одним словом подскажите что ей не так, уже неделю с ней мучаюсь.
Заранее спасибо.
 

nikolz

Well-known member
Доброе всем время суток.
Люди добрые, сами мы не местные, помогите кто чем может...
Тьфу ты, одним словом подскажите что ей не так, уже неделю с ней мучаюсь.
Заранее спасибо.
напишите так
  1. void loop( void ) {
  2. while (millis()< 20000){
  3. Serial.print("Disconnecting\t");
  4. WiFi.disconnect();
  5. Serial.println("Ok");
  6. Serial.print("WiFi Off\t");
  7. WiFi.mode(WIFI_OFF);
  8. Serial.println("Ok");
  9. Serial.print("WiFi Sleep\t");
  10. WiFi.forceSleepBegin();
  11. delay( 1 );
  12. Serial.println("Ok");
  13. }
  14. }
 

Gollum

New member
У меня работает....
Вы не могли бы сказать версии компилятора и arduino core на которых у вас заработала эта программа?
Перепробовал кучку esp всех цветов и расцветок, в том числе и Wemos D1 mini, на всех крашится, хоть ты тресни...
 
Вы не могли бы сказать версии компилятора и arduino core на которых у вас заработала эта программа?
Перепробовал кучку esp всех цветов и расцветок, в том числе и Wemos D1 mini, на всех крашится, хоть ты тресни...
В общем так:
Сейчас попробовал запуститься на Arduino IDE 1.8.9 и да, крашится на "WiFi Sleep".
Я использую 2019-07-21 10_44_55-TTT - Microsoft Visual Studio (Administrator).jpg Visual Studio 2013 с Visual Micro в Debug Mode - вот там работает.
В Release mode попробовал - там тоже свалилось на том же месте. Но я никогда не ставлю Release, т.к. давно заметил, что программы, скомпилированные в нем, занимают больше памяти и работают гораздо хуже.
 

nikolz

Well-known member
Боже упаси! Моя идея погасить WiFi ОДИН РАЗ, а не молотить эти команды 20 секунд. Да и какой в этом смысл, если после первого же вызова WiFi.forceSleepBegin() программа отвалится...
очевидно не внимательно прочитал.
относительно смысла в этой идее ,
так изначально его там нет.
-------------
если надо один раз то зачем писать это в loop
 

CodeNameHawk

Moderator
Команда форума
Пробовал, работает
Код:
void setup()
{
  Serial.begin(74880);
  Serial.println("А? Что? Я не сплю!!!");
  delay(2000);
  ESP.deepSleep(5e6);
}
void loop()
{
}
ардуино 1,8,9 плата 2,5,2
 

Gollum

New member
Значит так.
После продолжительных плясок с бубном, с легким эротическим оттенком, удалось выяснить следующее:
Если после WiFi.disconnect() подождать реальной смены статуса то отвала не происходит.
Теперь код основного цикла выглядит так-
Код:
void loop( void ) {
    if (millis() > 20000){
        Serial.println(" 20 sec. passed");
  
        Serial.print("Disconnecting");          
         for ( WiFi.disconnect(); WiFi.status() == WL_CONNECTED; delay(3) ) Serial.print( "." );
        Serial.println("\tOk");
      
        Serial.print("WiFi Off\t\t");      
        WiFi.mode(WIFI_OFF);
        Serial.println("Ok");
      
        Serial.print("WiFi Sleep\t");
        WiFi.forceSleepBegin();  
        delay( 1 );
        Serial.println("Ok");

        while(true) yield();
    }
}
Выхлоп-
Код:
START
Connecting.......   Ok (192.168.1.169)
20 sec. passed
Disconnecting....   Ok
WiFi Off            Ok
WiFi Sleep          Ok
Как видно от подачи команды WiFi.disconnect() до реального отключения проходит около 12mc.

Но меня мучают сомнения и грызут вопросы -
- почему об этом нигде не сказано? Ну ладно, бог с ней с документацией, но комьюнити по этому вопросу почему молчит? Я пересмотрел множество форумов, как наших, так и буржуйских, так в лучшем случае этот вопрос хоть и поднимается, но как правило повисает без конкретного ответа. Неужели никто не выключает WiFi? Или может все уже давно ушли с 8266?
- второй вопрос вытекает из первого - насколько корректно такое решение, и чем оно черевато? Я, конечно, сейчас сделаю циклическую включалку/выключалку вайфая, и погоняю некоторое время. Но, даже если падений не будет, неизвестно как оно себя поведет в крупной программе.
 

nikolz

Well-known member
Значит так.
После продолжительных плясок с бубном, с легким эротическим оттенком, удалось выяснить следующее:
Если после WiFi.disconnect() подождать реальной смены статуса то отвала не происходит.
Теперь код основного цикла выглядит так-
Код:
void loop( void ) {
    if (millis() > 20000){
        Serial.println(" 20 sec. passed");
 
        Serial.print("Disconnecting");         
         for ( WiFi.disconnect(); WiFi.status() == WL_CONNECTED; delay(3) ) Serial.print( "." );
        Serial.println("\tOk");
     
        Serial.print("WiFi Off\t\t");     
        WiFi.mode(WIFI_OFF);
        Serial.println("Ok");
     
        Serial.print("WiFi Sleep\t");
        WiFi.forceSleepBegin(); 
        delay( 1 );
        Serial.println("Ok");

        while(true) yield();
    }
}
Выхлоп-
Код:
START
Connecting.......   Ok (192.168.1.169)
20 sec. passed
Disconnecting....   Ok
WiFi Off            Ok
WiFi Sleep          Ok
Как видно от подачи команды WiFi.disconnect() до реального отключения проходит около 12mc.

Но меня мучают сомнения и грызут вопросы -
- почему об этом нигде не сказано? Ну ладно, бог с ней с документацией, но комьюнити по этому вопросу почему молчит? Я пересмотрел множество форумов, как наших, так и буржуйских, так в лучшем случае этот вопрос хоть и поднимается, но как правило повисает без конкретного ответа. Неужели никто не выключает WiFi? Или может все уже давно ушли с 8266?
- второй вопрос вытекает из первого - насколько корректно такое решение, и чем оно черевато? Я, конечно, сейчас сделаю циклическую включалку/выключалку вайфая, и погоняю некоторое время. Но, даже если падений не будет, неизвестно как оно себя поведет в крупной программе.
команда disconnect
не выключает WiFi а отключает его от роутера
т е потребление при этом не изменяется
поэтому какой в этом смысл?
12 мс или не 12 зависит еще от вашей сети и роутера
поэтому никто этим вопросом не заморачивается.
 
Сверху Снизу