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

ESP8266 + OTA

hooligyu

New member
Добрый день.
Потихоньку вливаюсь в сферу ардуинщиков и заинтересовала тема обновления esp8266 по воздуху , т.к проект представляет из себя сбор (esp+max+dht).

CfzPuO6cMr8[1].jpg
немного про суть.
В лупе у меня 2 функции

Код:
gettime();
mcheck();
-
первая функция узнает время и выводит на панельку. и каждые 15 циклов запускается функция с парсингом погоды (openweathermap) и тоже выводит.
-
вторая функция чекает 3 диалога(vk ) ( узнает последние сообщения и записывает их в глобальные переменные которые для каждого диалога свои) , затем сверяет с нужным текстом и если есть совпадения то запускается функция с парсингом погоды (openweathermap), отправляет в нужный диалог.

Так вот решил я значит сделать обновления по воздуху.
Пересмотрел парочку роликов и прочитал парочку тем , вроде не сложно.
Сетевой порт появлялся , но при прошивки я получал ошибку "Not answer".
Решил я ради интереса залить прошивку по новой(через com порт) и закомментировал 2 функции в loop'e о которых я говорил выше.
-
Залил и теперь разкомментировал эти строчки и решил загрузить по воздуху И ....о чудо прошивка успешно за доли секунд залетела на есп , затем я решил заккоментировать снова и залить по воздуху И....о чудо прошивка никуда не залетела и снова ошибка "Нет ответа".
Что это может быть?
Я грешу на delay ибо у меня в функции с вк 3 диалога и после каждого диалога по 2 секунды остановки.
Я так понимаю delay прекращает выполнения всего?
Было ли у кого такое же или я сейчас ошибаюсь?
Буду рад любому ответу.
 

shuraf

Member
Естественно делай тормозит.
В таком случае надо чтоб есп сама 'просила' обновление, но это уже влечет 'поднятие сервера обновлений'
 

hooligyu

New member
Естественно делай тормозит.
В таком случае надо чтоб есп сама 'просила' обновление, но это уже влечет 'поднятие сервера обновлений'
чем лучше заменить делай?
какие альтернативы есть.
Прошивка по моему мнению слишком громоздкая и мне кажется , что даже замена делай не поможет.
 

Юрий Ботов

Moderator
Команда форума
чем лучше заменить делай?
какие альтернативы есть.
счетчиком в цикле, и условным оператором который выполняет то что после делея только после достижения счетчиком какого-то значения. при этом счетчик надо сбросить.
 

hooligyu

New member
счетчиком в цикле, и условным оператором который выполняет то что после делея только после достижения счетчиком какого-то значения. при этом счетчик надо сбросить.
я правильно понимаю , что вместо делея поставить цикл который будет выполнятся N раз ( нужным временем для меня)?
 

shuraf

Member
я правильно понимаю , что вместо делея поставить цикл который будет выполнятся N раз ( нужным временем для меня)?
Нет. Запоминаешь время начала паузы. + длительность паузы. Программа в цикле крутится и проверяет текущее время с "необходимым временем". Как совпало, то выполняем действие "после паузы"
 

kab

New member
shuraf правильно написал
я правильно понимаю , что вместо делея поставить цикл
Программа в цикле крутится
@shuraf - написал правильно, но не совсем понятно
Уточняю, что под словом "цикл" @shuraf имел в виду loop(), а @hooligyu - наверно, for или while :)
Это всё - циклы... :D
 

Юрий Ботов

Moderator
Команда форума
kab, учитывая что автор не предоставил текст программы считая его своей интеллектуальной собственностью то ответ shuraf абсолютно корректен
 

hooligyu

New member
kab, учитывая что автор не предоставил текст программы считая его своей интеллектуальной собственностью то ответ shuraf абсолютно корректен
дело в том , что слишком много кода.
upload_2018-2-3_2-58-27.png
И да под циклом я подразумевал for while .
Т.е я это представил так в лупе выполняется код , затем где нужна остановка на несколько секунд выполняем цикл(for while) N раз
 

kab

New member
дело в том , что слишком много кода.
Посмотреть вложение 5593
И да под циклом я подразумевал for while .
Т.е я это представил так в лупе выполняется код , затем где нужна остановка на несколько секунд выполняем цикл(for while) N раз
А @shuraf предлагает (как я понял), например, где раньше стоял delay, запомнить в oldTime время (millis()) и установить флаг ожидания (ну типа int gdem = 1 :)) . А дальше проверяем по if - если установлен флаг ожидания и (millis()- oldTime) меньше необходимого время ожидания - пропускаем дальнейшие действия, переходя на конец loop. А когда пройдет необходимое время задержки - сбрасываем флаг gdem = 0. И продолжаем выполнение операторов в loop по порядку следования ...
upd :( Несколько запутался - надо подумать как в цикле loop менять флаги только когда нужно...
 
Последнее редактирование:

hooligyu

New member
А @shuraf предлагает (как я понял), например, где раньше стоял delay, запомнить в oldTime время (millis()) и установить флаг ожидания (ну типа int gdem = 1 :)) . А дальше проверяем по if - если установлен флаг ожидания и (millis()- oldTime) меньше необходимого время ожидания - пропускаем дальнейшие действия, переходя на конец loop. А когда пройдет необходимое время задержки - сбрасываем флаг gdem = 0. И продолжаем выполнение операторов в loop по порядку следования ...
upd :( Несколько запутался - надо подумать как в цикле loop менять флаги только когда нужно...
мне каждый цикл лупа надо делать задержку в других функциях
 

Сергей_Ф

Moderator
Команда форума
@hooligyu задержек делать вообще не надо. Это вредно и моветон. Ставьте флаг для каждого действия и сбрасывайте его, когда действие выполнено. Как это делать вам уже подсказали. Забудьте про delay вообще, считайте что его нет.
 

hooligyu

New member
@hooligyu задержек делать вообще не надо. Это вредно и моветон. Ставьте флаг для каждого действия и сбрасывайте его, когда действие выполнено. Как это делать вам уже подсказали. Забудьте про delay вообще, считайте что его нет.
очень странно , что не придумали еще нормальный таймер ....
а может есть библиотеки какие нибудь? которые упрощают все это дело?
 

hooligyu

New member
а такая идея появилась , может в библиотеках которые отвечают за обновление можно подправить и изменить время ожидания ответа?
такое реально ? в какой из библиотек это может быть ?
Я убрал все delay из скетча , но время выполнения 1 цикла loop'a все равно достаточно большая ( происходит много задач с парсингом страниц вк, опенвитчермап.)
 
очень странно , что не придумали еще нормальный таймер ....
а может есть библиотеки какие нибудь? которые упрощают все это дело?

Почему таймер не придумали? Таймеры-то в ESP есть, вот почему не придумали аналог Sleep() в WinAPI, который бы позволял во время каких-то циклов отдавать "тики" системе, в общем-то понятно (это без нормальной многозадачности не сделать, а ее не сделать на столь малых ресурсах), но это печально. Выход - таки вешать все свои алгоритмы на таймерный callback, а циклы разворачивать в конечные автоматы (state machine), что, порой, крайне муторно и не наглядно. Или, я ошибаюсь, и такой вызов в ESP NONRTOS SDK есть?
 
Сверху Снизу