• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Последнее редактирование:
Сверху Снизу