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