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

Нужна помощь Отваливается точка доступа, какие могут быть причины?

Legantmar

New member
И снова здравствуйте!
Предыстория:
на борту esp8266 -12 (использую e, s, f)
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <WS2812FX.h>
#include "DNSServer.h"
#include "ESP8266SSDP.h"
#include <FS.h>
#include <time.h>
#include <ArduinoJson.h>
При запуске контроллер включает режим AP - точка доступа

Столкнулся с такой непонятной ситуацией (надеюсь, что кто-то также сталкивался и нашел "источник проблемы"):
Через некоторое время, это может быть второе или десятое подключение к контроллеру по Wi-Fi (т.е. через 2 - 20 мин, к примеру), при GET запросах (открывании/загрузке html страниц) внезапно отваливается Wi-Fi. Не приходит ответ.
При отключении и подключении Wi-Fi на смартфоне, сеть AP esp8266 уже не обнаруживается. При этом контроллер продолжает нормально работать, т.е. откликается на клавиши, выдает сигналы на GPIO. Через некоторое время после отваливания WI-FI (спустя 10-20 мин) контроллер вынуждено перезагружается.
Если ввести данные роутера и перезапустить контроллер с подключением его в режиме STA (подключен как клиент к роутеру), такая проблема не наблюдается.

С чем это может быть связано? какие мысли?
1) Затыкается WI-FI ? (есть ощущение, что перегрузка канала от чего то, но как посмотреть не знаю)
2) конфликт библиотек? (пробовал отключать библиотеки и фрагменты кода WiFiUdp.h, ArduinoOTA.h, DNSServer.h, ESP8266SSDP.h, FS.h, вместо ArduinoJson.h была EEPROM.h)
3) Заметил, что эффект сильнее проявляется если изменять в настройках количество светодиодов с записью в EEPROM. Подумал, что конфликт с памятью. Переделал на Json и SPIFF, но эффект остался.
4) Бракованные контролеры ? перегрев при пайке? (перепробовал на 5-ти, одинаковый эффект)
5) Нехватка питания для Wi-Fi ? (первое о чем подумал), но блок питания на 3А MeanWell (хороший) стабилизатор 3.3В на 800мА, менял, эффект сохраняется
6) Я не ставлю подтягивающих резисторов на GPIO 0, 2 и reset (попробовал поставить, ничего не меняет)
7) Проблема с yandex браузером на смартфоне? (вот об этом не думал, другой смартфон не использовал)

Как "отловить" этот глюк, понять в чем причина? какой алгоритм поиска посоветуете?
(сори, весь код выложить не могу, но готов ответить на любые вопросы и выложить интересующие фрагменты кода)
 
Последнее редактирование:

Legantmar

New member
memory leakage точно нет?
Юр, спасибо, что откликнулся, ход мысли понятен. Я не профессиональный программист, а всего лишь любитель. Т.е. у меня все возможно )), но:
1) отваливается только точка доступа. при этом если контроллер соединен как клиент к роутеру и доступен по IP адресу, то нормально выдает все страницы и сохраняет в память переменные. контроллер может сам перезагрузиться, но через день-два-три (это уже другая история)
2) я проверял с помощью GET запроса вида /mem когда вызывается функция с телом: server.send(200, "text/html", String(ESP.getFreeHeap())); - проверка свободной оперативной памяти. Выдает от 10000 до 12000 свободных байт (цифра немного меняется при открывании разных страниц), но если ничего не трогать, а только посылать /mem то через пару секунд цифра успокаивается и прекращает меняться и выдает одно и тоже значение, к примеру 11968 байт. - т.е. в моем понимании утечки нет.
 

Legantmar

New member
мне кажется я догадываюсь в чем проблема, возможно из-за нехватки памяти.
стабильно падает wi-fi через несколько запросов загрузить любые html страницы, если установить кол-во светодиодов 100,
и более-менее стабильно работает, если кол-во светодиодов установить ~ 12
использую библиотеку WS2812FX.h от адафруит

при этом проверка через ESP.getFreeHeap() показывает небольшое увеличение свободной памяти с 12776 до 13056 байт
проблема может быть еще в том, что до использования файловой системы FS.h все страницы html у меня записаны вместе с программой как переменные вида, что значительно съедает оперативную память:
String content_led(){
String content;
content = "<!DOCTYPE html>";
content += "<html lang='en'>";
content += "<head>";
....

return content;
}
буду переделывать в нормальные .htm.gz и использовать через файловую систему

позже напишу, чем все закончилось.
 
Последнее редактирование:

Legantmar

New member
К сожалению нет.
Улучшил все, что мог, нашел пару незначительных косяков.
Но прослеживается прямая зависимость от кол-ва светодиодов в классе WS2812FX() и стабильностью WI-FI в режиме точки доступа. (в режиме клиента стабильность значительно выше, во всех тестах мне не удалось завалить wi-fi).
Выкладываю самодостаточный фрагмент кода для проверки, буду признателен любым советам.

Примечание: адрес стартовой страницы 192.168.4.1
1) для проверки скетча не нужна LED лента
2) перед заливкой скетча, сначала залить данные (из папки data) (для тех, кто не в курсе)
3) я использую более раннюю ws2812fx немного модифицированную под себя (прилагается)
4) для проверки свободной памяти - 192.168.4.1/mem

Проблема - Внезапно отваливается Wi-Fi в режиме точка доступа:
1) При загрузке web страниц
2) При включении кнопок на стартовой странице
3) проблема сильнее/быстрее проявляется, чем выше значение LED_COUNT для класса WS2812FX()
при 600 - страницы могут вообще не загружаться. Wi-Fi отваливается прям сразу
при 100 - может показаться, что все нормально, но спустя некоторое время (количество запросов, коннектов), Wi-Fi тоже отваливается.
 

nikolz

Well-known member
К сожалению нет.
Улучшил все, что мог, нашел пару незначительных косяков.
Но прослеживается прямая зависимость от кол-ва светодиодов в классе WS2812FX() и стабильностью WI-FI в режиме точки доступа. (в режиме клиента стабильность значительно выше, во всех тестах мне не удалось завалить wi-fi).
Выкладываю самодостаточный фрагмент кода для проверки, буду признателен любым советам.

Примечание: адрес стартовой страницы 192.168.4.1
1) для проверки скетча не нужна LED лента
2) перед заливкой скетча, сначала залить данные (из папки data) (для тех, кто не в курсе)
3) я использую более раннюю ws2812fx немного модифицированную под себя (прилагается)
4) для проверки свободной памяти - 192.168.4.1/mem

Проблема - Внезапно отваливается Wi-Fi в режиме точка доступа:
1) При загрузке web страниц
2) При включении кнопок на стартовой странице
3) проблема сильнее/быстрее проявляется, чем выше значение LED_COUNT для класса WS2812FX()
при 600 - страницы могут вообще не загружаться. Wi-Fi отваливается прям сразу
при 100 - может показаться, что все нормально, но спустя некоторое время (количество запросов, коннектов), Wi-Fi тоже отваливается.
поищите цикл внутри класса WS2812FX()
вероятно, что при большом числе у вас длительное зависание в цикле и аварийное срабатывание WDT или невозможность корректной работы WIFI
 

Legantmar

New member
поищите цикл внутри класса WS2812FX()
вероятно, что при большом числе у вас длительное зависание в цикле и аварийное срабатывание WDT или невозможность корректной работы WIFI
спасибо за ответ.
а почему этого зависания не происходит, когда esp клиент на роутере (режим STA)?
как можно проконтролировать корректность работы Wi-Fi в режиме точка доступа (режим AP)? (для режима клиента есть WiFi.status() != WL_CONNECTED)
по поводу WDT в начале Setup() вот такие строчки не помогают?:
ESP.wdtDisable();
ESP.wdtEnable(WDTO_8S);

В Adafruit_NeoPixel (которая вызывается из ws2812fx) есть вот такая функция (я не оч. хорошо разбираюсь в С и С++):
void Adafruit_NeoPixel::updateLength(uint16_t n) {
if(pixels) free(pixels); // Free existing data (if any)
numBytes = n * ((wOffset == rOffset) ? 3 : 4);
if((pixels = (uint8_t *)malloc(numBytes))) {
memset(pixels, 0, numBytes);
numLEDs = n;
} else {
numLEDs = numBytes = 0;
}
}
Это может как то сузить круг поиска какого то длительного цикла в ws2812 или NeoPixel библиотеках?
Может быть конфликт между выделением и использованием памяти в updateLength() и какой-то функцией в библиотеке ESP8266WebServer? (это предположение, но может быть не так)
 
Последнее редактирование:

nikolz

Well-known member
спасибо за ответ.
а почему этого зависания не происходит, когда esp клиент на роутере (режим STA)?
как можно проконтролировать корректность работы Wi-Fi в режиме точка доступа (режим AP)? (для режима клиента есть WiFi.status() != WL_CONNECTED)
по поводу WDT в начале Setup() вот такие строчки не помогают?:
ESP.wdtDisable();
ESP.wdtEnable(WDTO_8S);

В Adafruit_NeoPixel (которая вызывается из ws2812fx) есть вот такая функция (я не оч. хорошо разбираюсь в С и С++):
void Adafruit_NeoPixel::updateLength(uint16_t n) {
if(pixels) free(pixels); // Free existing data (if any)
numBytes = n * ((wOffset == rOffset) ? 3 : 4);
if((pixels = (uint8_t *)malloc(numBytes))) {
memset(pixels, 0, numBytes);
numLEDs = n;
} else {
numLEDs = numBytes = 0;
}
}
Это может как то сузить круг поиска какого то длительного цикла в ws2812 или NeoPixel библиотеках?
Может быть конфликт между выделением и использованием памяти в updateLength() и какой-то функцией в библиотеке ESP8266WebServer? (это предположение, но может быть не так)
ранее Вы указали что проблема
когда увеличиваете число диодов
"при 600 - страницы могут вообще не загружаться. Wi-Fi отваливается прям сразу
при 100 - может по"
поэтому ищите где это число используется
 

Legantmar

New member
все оказалось гораздо сложнее, чем я предполагал.
благодаря наводке nikolz
и вот этому ответу: I need help. Why fall off WI-FI in AP mode with WS2812FX / NeoPixel? · Issue #176 · adafruit/Adafruit_NeoPixel
пришел к выводу, что виновата вот эта 159 строчка кода в библиотеке adafruit_neopixel (которую использует ws2812fx):
noInterrupts(); // Need 100% focus on instruction timing
закомментировав которую решается моя "проблема" - WI-FI точки доступа не отваливается при любом количестве светодиодов (страницы и команды работают безупречно).
НО появляется НОВАЯ проблема (а точнее скелет в шкафу), оно и понятно.
выглядит вот так (разноцветные сверчки в любом режиме): 20181008_213520.mp4.mp4
Как это можно "закостылить" пока не знаю. Буду смотреть в сторону FastLed.
 
Последнее редактирование:
Сверху Снизу