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

Нужна помощь Нестабильная работа устройства на базе esp8266

Legion12

New member
Добрый день, форумчане.
Ничего похожего не нашел, поэтому делюсь в новой теме, прошу не кидать тапками, если все-таки плохо искал.

Разрабатываем устройство а-ля "умный дом", за беспроводную связь отвечает esp8266-01, код в arduino ide.
Для управления создано веб-страницы, одна основная для работы системы, другая настроечная, обе расположены внутри кода, залив в SPIFFS не используем.

Выглядит так:
Код:
const char mainPage[] PROGMEM = R"=====(
<html>многотекста</html>
)====";

const char settingsPage[] PROGMEM = R"=====(
<html>чутьменьшетекста</html>
)====";
Вызов страницы идет так:
Код:
server.on("/", []() {
    server.setContentLength(CONTENT_LENGTH_UNKNOWN);
    server.send(200, "text/html", mainPage); //------------------------------------------------------------------------------------------------ посылаем главную веб-страницу
    delay(100);
  });
Данные сохраняем и пересылаем обычными json-запросами.

Проблема раз - чуть только размер веб-страницы превышает 32кб - страница перестает грузиться. С чем это связано я не понимаю. Пробовали обойтись "сжатием", оптимизацией и заменой памяти на модуле на более емкую - не помогло. Когда прописали server.setContentLength(CONTENT_LENGTH_UNKNOWN) - работать стало чуть веселее, иногда просто отказывалось грузиться, выдавая
ERR_CONTENT_LENGTH_MISMATCH.

Проблема два
- вся система в принципе работает более-менее стабильно только в режиме WIFI_AP. станицы очень редко не подгружаются, обычно простого нажатия на F5 в браузере хватает. При переключении в WIFI_STA начинается цирк - страницы грузятся в лучшем случае по два раза, а дальше только выдернуть шнур и выдавить стекло питания и воткнуть заново.

Код переключения выглядит так и работает без проблем:
Код:
//------------------------------------------------------------------------------------------------ запуск подключения WIFI_STA
void WifiSTAconnect(){
    byte tries = 20;
  serializeJsonPretty(wifinet, Serial);
  Serial.println("Start WIFI");
  WiFi.mode(WIFI_STA); //------------------------------------------------------------------------------------------------ Запускаем WIFI_STA
  WiFi.begin(ssid, password);
  while (--tries && WiFi.status() != WL_CONNECTED) {// ждем соединения:
    delay(1000);
    Serial.print(".");
  }
 
    if (WiFi.status() != WL_CONNECTED){ // Если не удалось подключиться запускаем в режиме AP
    Serial.println("WiFi up AP");
    StartAPMode();
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    delay(500);
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    SSDP_init();//----------------------------------------------------------------запуск протокола SSDP
    }
}

void StartAPMode(){
  WiFi.disconnect(); // Отключаем WIFI
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была)
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);
 
  // Меняем режим на режим точки доступа
  WiFi.mode(WIFI_AP);
  // Задаем настройки сети
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  // Включаем WIFI в режиме точки доступа с именем и паролем
  // хронящихся в переменных ssidAP passwordAP
   WiFi.softAP(ssidAP,passwordAP);
}
Дополнительно намертво прописано:
[inline] WiFi.setPhyMode(WIFI_PHY_MODE_11N);[/inline]

... потому как в этом режиме замечена наиболее стабильная работа системы.

В общем что мне делать - я не знаю. Есть мнение что где-то не стоит очистка какого-нибудь буфера или кэша, но нигде информации я не нашел. Буду благодарен за любую помощь.
 

nikolz

Well-known member
предположу следующее:
памяти RAM не более 40 Кбайт для юзера.
Если я правильно понимаю ваша страница в 32 Кб засовывается сначала в стек TCP
сомневаюсь что он такое вместит да еще будет память на что-то еще.
 

nikolz

Well-known member
относительно второй проблемы
есть опции автоматического восстановления соединения на дурине не знаю как ее указать так как пишу на СИ
но без ее включения режим станции очень не устойчивый
 

Legion12

New member
предположу следующее:
памяти RAM не более 40 Кбайт для юзера.
Если я правильно понимаю ваша страница в 32 Кб засовывается сначала в стек TCP
сомневаюсь что он такое вместит да еще будет память на что-то еще.
.... Ну... ОЙ, что тут сказать :/ Это конечно многое объясняет, но жить легче не стало. Что же тогда делать? Есть смысл пробовать другой модуль или у всех стоит столько же RAM?

относительно второй проблемы
есть опции автоматического восстановления соединения на дурине не знаю как ее указать так как пишу на СИ
но без ее включения режим станции очень не устойчивый
В том и фокус, что соединение-то не пропадает, а стабильно держится :/
 

nikolz

Well-known member
.... Ну... ОЙ, что тут сказать :/ Это конечно многое объясняет, но жить легче не стало. Что же тогда делать? Есть смысл пробовать другой модуль или у всех стоит столько же RAM?
/
если вы про модули на ESP8266 то да RAM у всех одинаковый потому что внутри чипа.
на других чипах будет иное
например ESP32
или RDA
или RTL
---------------
напишите программу на СИ и измените алгоритм и объем страницы
выше предложили использовать файловую систему
возможно как-то разбить страницу на части
короче творите.
 

Legion12

New member
В соседней теме увидел решение(или костыль?), не знаю почему, но оно работает.

Код:
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(code, dataType);
server.sendContent_P(content, size);
Получилось так, мой код:
Код:
server.on("/", []() {
    server.setContentLength(CONTENT_LENGTH_UNKNOWN);
    server.send(200, "text/html", ""); //------- посылаем главную веб-страницу
    server.sendContent_P(mainPage);
    delay(100);
  });
На протяжении получаса тестирования ни одного сбоя ни в wifi_ap, ни в wifi_sta. Тем не менее - товарищу просто тонны благодарности.
 
Сверху Снизу