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

Постоянная загрузка данных.

ART_HA

Member
Появился принципиальный вопрос.
Если вот в этот код от Сергея Третьякова:
Код:
void loop() {
  ts.update(); //планировщик задач
  HTTP.handleClient(); // Работа Web сервера
  yield();
  webSocket.loop(); // Работа webSocket
  dnsServer.processNextRequest(); // Для работы DNS в режиме AP
}
я добавляю считывание данных с АЦП
Код:
value = analogRead(A0);
, то без добавления в конец loop
Код:
delay(1)
браузер ESP8266 не видит.
Но если я добавлю этот delay(1), меня не устраивает слишком редкий опрос АЦП.

Вопрос: насколько тяжело решение этой проблемы, чтобы, не мучаясь с ней, сразу перейти на ESP32?
PS. Проблема усугубляется тем, что в ESP8266 я уже наладил работу ардуины PWM из SDK, а в ESP32 эту работу придется начинать сначала.
 

ART_HA

Member
PSS. Опять же: замечательных уроков Сергей Третьякова для ESP32 я тоже не вижу....
 

ART_HA

Member
Если остальной код быстрый, то можете много раз в секунду успеть опросить.
Увы, мне нужно как минимум два раза в 1 мсек.

Я никак не могу понять, почему опрос АЦП требует введения delay(1), в то время как без этого опроса проблем нет.
 

CodeNameHawk

Moderator
Команда форума
я добавляю считывание данных с АЦП
Код:
value = analogRead(A0);
, то без добавления в конец loop
Код:
delay(1)
браузер ESP8266 не видит.
Но если я добавлю этот delay(1), меня не устраивает слишком редкий опрос АЦП.
Подозреваю, что есп отправит данные с АЦП и без делай1, просто она это сделает позже.
Скажем АЦП последняя команда в цикле(делай1 в цикл не добавлен), после вывода из цикла, есп отрабоает wifi, и снова войдёт в цикл.
Там от работает
ts.update(); //планировщик задач
HTTP.handleClient(); // Работа Web сервера

yield(); как и делай1 снова отработает wifi.
После
webSocket.loop(); // Работа webSocket
У websocketa будут новые данные АЦП и только после очередного выхода из цикла и отработки wifi, страница получит новые данные.

Проверьте при помощи millis сколько времени занимает один проход цикла...
 

ART_HA

Member
Проблема не в том, что есп не отправляет данные АЦП или поздно их отправляет, а в том, что без добавления делай(1) браузер на страничку вообще не выходит.
То есть видим крутящееся колечко, а затем:
Не удается получить доступ к сайту.
Превышено время ожидания ответа от сайта 192.168.0.243.

Для ориентировки по времени проходу цикла: если в loop поставить только два опроса АЦП, то частота цикла составляет примерно 2 кГц.
 

ART_HA

Member
Поэкспериментировал и пришел к выводу, что получается так:
поставил в loop любую команду\функцию с длительным временем исполнения, ставь delay(1), иначе МК не хватит времени на WiFi.
Видимо общее время выполнения функций в loop в примере С.Третьякова настолько велико, что обычного оборота loop для обслуживания
WiFi уже не хватает, потому и yield() у него вставлен.
Насколько я прав в своем ламерском подозрении?
 

pvvx

Активный участник сообщества
Ну вот же ссылка выше, на этой же страничке.
А - по этой ссылке в примере, после открытия 5-ой страницы возникает Exception (давненько проверял).
Хотя в видео (7:23) сказано - "десять - пятнадцать страниц" :)
 

pvvx

Активный участник сообщества
Загрузил узнать - вдруг что изменилось?
Оказалось - ничего - всё красное и черное в Wireshark:
1614002257243.png
И всё так-же постоянные Exception.
 

pvvx

Активный участник сообщества
При этом при открытии 5-ого соединения heap показывает 30 килобайт.
Вроде же писали что в Arduino давно ушли от espconn с её ограничениями в 4-ре статических буфера для открытых соединений, а перешли на прямую работу с LwIP, но так и пришли обратно? Или что?
Классно и 80 порт пашет:
1614003574805.png
Дети в садике писали?
 

ART_HA

Member
Однако проблему решить таки удалось. :)
Так как такого же примера Сергея Третьякова для ESP32 я не нашел, пришлось поискать что-нибудь другое.
Это другое оказалось вот этим: https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-web-server-arduino-ide/
Насколько я понимаю, websocket в нем нет, но при этом код легко справляется с периодичностью посылок в 0,1 сек (ниже не пробовал, мне этого с лихвой хватает).
После чего я обнаружил, что и ESP8266 есть почти такое же: https://randomnerdtutorials.com/esp...ure-and-humidity-web-server-with-arduino-ide/
И он тоже отлично заработал с поправкой: необходимость наличия в цикле delay.
Очевидно, что я некорректно поставил задачу: у меня не было необходимости часто передавать одно-два значения в большую страницу (для чего и нужен websocket), мне достаточно было часто передавать часто одно-два значения на очень маленькую страницу.
Для ESP8266 пример от Сергея Третьякова и Rui Santos работают одинаково, но пример от Rui Santos существенно меньше по объему.
Всем спасибо за помощь.
 
мне достаточно было часто передавать часто одно-два значения на очень маленькую страницу.
Если не использовать websocket получится не "передавать часто одно-два значения на очень маленькую страницу ", а "часто читать одно два значения из контроллера". В очень многих применениях это совершенно разные вещи.
Например контроллер никак не может пнуть страницу до тех пор, пока она сама не соблагоизволит к нему обратиться.
 

ART_HA

Member
Если не использовать websocket получится не "передавать часто одно-два значения на очень маленькую страницу ", а "часто читать одно два значения из контроллера". В очень многих применениях это совершенно разные вещи.
Например контроллер никак не может пнуть страницу до тех пор, пока она сама не соблагоизволит к нему обратиться.
В примерах, ссылки на которые я указал выше, ни комп, ни смартфон, ни кто либо еще не посылает никаких запросов к ESP на отправку им данных.
То есть для того, чтобы получить данные с ESP я на компе никаких кнопок не нажимаю вовсе, данные эти идут "автоматом" с периодичностью, указанной в программе ESP. Что собственно мне и требовалось.
 

Ildarmustafin86

Active member
После загрузки страницы включается скрипт в котором даже не один запрос, а два
 

Ildarmustafin86

Active member
Найдите в коде script, а в нем два setInterval, внутри которых get запрос "/temperature" и "/humidity"
 
Сверху Снизу