как выполнить функцию по событию и времени
- Войдите на сайт для отправки комментариев
Вс, 14/03/2021 - 20:47
всем привет, я новичок в это деле, пишу код для контроллера пеллетной горелки, не получается сделать один момент...
в общем суть такая, нужно если огонь не горит Х времени запустить функцию. огонь наблюдает аналоговый датчик огня, фильтруется через медианный фильтр.
пытался сделать таймер на миллисе, получается фингя... не работает...
timer_fire = millis();
if(val_f>1000 and start1 == 1 and (millis()-timer_fire>30000) and start_count<=2){
startWork();
}
не работает потому что надо переменную timer_fire записать один раз и от нее отталкиваться, а оно постоянно её переписывает:(
неделю уже пробую разные варианты:(
Так переписывай ее внутри if(){}. А первый раз назначь в сетапе.
пробовал, не подходит
пробовал, не подходит
Стесьняюсь спросить - а почему? Где-то еще используется - так создайте еще одну переменную. А так- это стандартный ход.
А может потому что
пробовал, не подходит
Стесьняюсь спросить - а почему?
посмотри на строчку 441 и 460 кода. И таких циклов у ТС в коде полно. Понятно, что с таким кодом таймер на миллис не работает
посмотри на строчку 441 и 460 кода. И таких циклов у ТС в коде полно. Понятно, что с таким кодом таймер на миллис не работает
Не долистал. Убило наповал :)
Про цикл while() похоже неизвестно. Хотя и с ним не прокатит. А for(;;) - это что то из питона?
Про цикл while() похоже неизвестно. Хотя и с ним не прокатит. А for(;;) - это что то из питона?
это ровно то же самое, как while(1)
По действию на код абсолютно аналогично delay() . У ТС этим "прогрессивным методом" написано 80% циклов, видимо избавлялся от задержек, а миллис так и не освоил. Это даже исправлять нет смысла, по мне так выкинуть в мусор и написать заново.
Я по образованию сварщик... Не зря же я в песочнице пишу... Этот код работает. греет мастерскую котел:) я понимаю что многое не правильно, но как смог... А вот сделать условие для перезапуска если огня нет определенное время не получается...
Код, возможно, и работает, но не допускает расширения функциональности.
Т.е. добавить к нему еще что-то нельзя.
греет мастерскую котел:) я понимаю что многое не правильно, но как смог... А вот сделать условие для перезапуска если огня нет определенное время не получается...
С таким кодом и не получится.
Правильно говорят - его надо переписывать с нуля.
С какой точностью Вам нужно выдержать время?
Если, скажем, 0.1с, от это значит, что весь loop() у Вас должен гарантированно заканчиваться за 0.1с. А у Вас он сколько ждет?
из того, что мы в Песочнице - вовсе не следует что кто-то бросится переписывать код из 500 строк. Если бы в нем была пара ошибок - я бы подсказал, но, на мой взгляд, код изначально написан неверно.
Логика построения программы на delay() и на millis() абсолютно разная, поменяв пару строк один в другой не переделать. А у вас ваши циклы все являются, по сути, функцией delay(), например
полностью аналогично вот такому коду:
А у Вас он сколько ждет?
Не ждёт, этих for(;;) в процессе работы нету
Я никого не прошу переписывать мой код! Да он не ПРАВИЛЬНЫЙ но он работает! Я не учился этому!!! Что за люди...
Если не правильно, скажите маленьким примером как правильно, я постараюсь исправится. А просто критиковать могу все...
Если он работает, какие еще у Вас вопросы к форуму? ("работает не так, как хочется" и "не работает" - это одно и то же)
А пример - классический: blink without delay.
Да как не ждет-то, если по тому самому условию, которое у вас не работает и с которым вы пришли на форум - запускается функция startWork(). которая просто набита подобными циклами - в строке 315 на 5 секунд, в строке 331 - на 15 сек, в строке 347 - АЖНО НА 6 МИНУТ!!
Это не считая кучи других процедур, запускаемых из startWork(), в каждой из которых могут быть свои задержки...
но самое интересное - в конце! В конце этой функции startWork(), в строке 363 - вы запускаете эту же функцию из нее самой... Да, возможно в реальной программе этого не происходит, не вникал, но в коде это есть.
Рискну сказать. что этот код просто никуда не годится.
Я имел в виду что когда горит огонь в горелке никаких фор не происходит
Когда горит огонь в горелке, эта программа не нужна вовсе. Она нужна при запуске, при выключении или в случае угасания пламени. А именно в этот момент эта программа и не работает.
А если вы считаете, что эти for никак не влияют на работу - зачем вы их туда навставляли? Вычистите их из кода.
тогда вопрос, как мне сделать без delay() подачу шнеком стокера 15сек?
тогда вопрос, как мне сделать без delay() подачу шнеком стокера 15сек?
Запустить шнек, запомнить время, продолжить выполнение программы.
Когда пройдет 15 секунд - выключить шнек.
Запустить шнек, запомнить время, продолжить выполнение программы.
Когда пройдет 15 секунд - выключить шнек.
так нечего выполнять паралельно, нужно выполнить это, потом выполнить "розжиг", а потом уже выполняется work() который выбирает режим работы и работает work_timer()
Уважаемый ТС, а Вы не пытались на бумажке, обычным языком написать алгоритм программы? А то, похоже, что Вы ее писали "как получится".
Я вижу такой минимальный алгоритм:
1) Разжигаем, если несколько раз не зажигается - уходим в ошибку.
2) Пока горит - отрабатываем алгоритмы при горении
3) Если погасло - п.1
Причем розжиг останавливает и перезапускает все остальные процессы. Пока зажигаем не делаем ничего, кроме этого. Причем первый розжиг должен быть в сетапе, а последующие вызываться из программы горения.
По моему логично.
Я уже решил свою проблему, добавил библиотеку GyverTimer. Если огня нет запускается таймер, если огонь появился раньше чем таймер сработал таймер сбрасывается. Если таймер протикал и огонь не появился запускается функция которая пытается вернуть огонь...
Уважаемый ТС, а Вы не пытались на бумажке, обычным языком написать алгоритм программы? А то, похоже, что Вы ее писали "как получится".
Я вижу такой минимальный алгоритм:
1) Разжигаем, если несколько раз не зажигается - уходим в ошибку.
2) Пока горит - отрабатываем алгоритмы при горении
3) Если погасло - п.1
Причем розжиг останавливает и перезапускает все остальные процессы. Пока зажигаем не делаем ничего, кроме этого. Причем первый розжиг должен быть в сетапе, а последующие вызываться из программы горения.
По моему логично.
В сетапе мне не нужно запускать горелку... Она запускается по нажатию кнопки.
Когда два месяца назад начинал это писать был листок бумаги с алгоритмом что примерно я хочу.
Смародина, делайте что хотите. Но запомните - так писать нельзя. Тем более программы. управляющие опасным оборудованием. Когда ваша мастерская сгорит из-за того что у вас скетч тупит по 6 минут в бесконечных циклах - надеюсь что хотя бы никто из окружающих не пострадает.
Смародина, делайте что хотите. Но запомните - так писать нельзя. Тем более программы. управляющие опасным оборудованием. Когда ваша мастерская сгорит из-за того что у вас скетч тупит по 6 минут в бесконечных циклах - надеюсь что хотя бы никто из окружающих не пострадает.
Вместо того чтобы обливать гавном можно иногда пробовать дать направление...
Мне некому помочь сделать правильно.
И чего цикл бесконечный?! Он заканчивается или по появлению огня или по прошествии отведённого времени. Как можно это сделать по другому?
Вместо того чтобы обливать гавном можно иногда пробовать дать направление...
Мне некому помочь сделать правильно.
Почему вам кто-то должен помогать, вы маленькая девочка штоль? Берите книжки, читайте интернет и осваивайте. Я вам дал направление - делать таймеры на миллис. Можно даже использовать таймеры гайвера, только нужно делать это не в одной строчке, а по всему коду. И да, логику кода придется менять полностью, в итоге вы сами поймете, что написать заново проще, чем переделать это.
чтоб сделать на таймерах мне надо будет делать кучу переменных(флагов) которые будут блокировать работу других таймеров чтоб все работало своим чередом, правильно мыслю?
не обязательно делать кучу переменных, это пишется слегка по другому.
почитайте что-нибудь о "машине состояний" или "конечных автоматах"
не обязательно делать кучу переменных, это пишется слегка по другому.
почитайте что-нибудь о "машине состояний" или "конечных автоматах"
почитал о "конечных автоматах"... да... пту образования явно маловато будет...
Smarodina, ну как Вам не стыдно!
Вам уже в сообщениях № 2, 4, 5, 7, 9, 10, 13, 14, 14, 18 и 20 несколько человек "пробовали дать направление". А Вы, вместо того, чтобы хоть чуть пошевелить пальцем, только высказываете неудовольствие.
чтоб сделать на таймерах мне надо будет делать кучу переменных(флагов) которые будут блокировать работу других таймеров чтоб все работало своим чередом, правильно мыслю?
В том то и дело, что ничего никогда не должно блокировать. Если Вы в 99 случаях напишете неблокирующий код, а одном-единственном - блокирующий, это работать не будет. Код на все 100% должен быть неблокирующим.
чтоб сделать на таймерах мне надо будет делать кучу переменных(флагов) которые будут блокировать работу других таймеров чтоб все работало своим чередом, правильно мыслю?
В том то и дело, что ничего никогда не должно блокировать. Если Вы в 99 случаях напишете неблокирующий код, а одном-единственном - блокирующий, это работать не будет. Код на все 100% должен быть неблокирующим.
тогда вы просто не понимаете как оно должно работать... нельзя сделать все сразу... нужна последовательность.
тогда вы просто не понимаете как оно должно работать... нельзя сделать все сразу... нужна последовательность.
Да, чего-то я не понимаю.
В частности, не понимаю, что именно Вы хотели сказать.
Я понимаю, как следует писать программы. И понимаю, чего следует избегать при их написании.
В то же время, я не понимаю, как должна работать Ваша программа, т.к. Вы об этом нигде подробно не написали.
Что же касается "нельзя все сделать сразу" - да, делать нужно постепенно, если хотите - последовательно. Но при этом каждый очередной шаг не должен исключать возможность сделать следующий шаг. В противном случае мы остановимся на середине и не будем иметь возможности завершить проект.
тогда вы просто не понимаете как оно должно работать... нельзя сделать все сразу... нужна последовательность.
нет, это вы не понимаете. Если у вас код неблокирующий - вы можете выполнять задачи как попеременно, так и последовательно. А когда блокирующий - только ждать, пока одна закончит, чтобы сделать что-то еще. А между тем, в подобных системах всегда есть необходимость оперативного отслеживания каких-то датчиков, например датчика пламени, ОДНОВРЕМЕННО С ВЫПОЛНЕНИЕМ ДРУГИХ ОПЕРАЦИЙ. В вашем исходном коде это в принципе невозможно.
ну почему же, мой блокирующий for(;;) отслеживает датчик огня и таймер в нем тикает
заменить этим:
будет тоже самое, но как выполнять только его?
или "конечных автоматах"
Спасибо за наводку. Очень интересно.
будет тоже самое, но как выполнять только его?
не понимаю, в чем проблема. Когда не надо ничего выполнять параллельно - не делайте. Вы о конечных автоматах прочитали? - это как раз оно
не знаю что такие "конечное автоматы", но кажись доперло как реализовать. на днях напишу новую startWork() и выложу на ваш суд!
на днях напишу новую startWork() и выложу на ваш суд!
похоже вы опять упустили то, что вам писали Андриано и я в сообщениях #31 и #26. Нельзя переписать только startWork() - в неблокирующем стиле должен быть написан ВЕСЬ КОД, иначе это бессмысленно
я не упустил, а решил начать с startWork()
for(;;) есть только в startWork() и finishWork()
да некоторым изменениям подвергнутся и остальные части кода, но не существенно.
теперь жду комментариев где не правильно!
и попутно вопрос, ячейка EEPROM Хранит значение 0...255 и только? или -128...127
в логику кода пока не вникал. но сразу замечания по структуре
1. Зачем условия в строчках 390-402 вынесены отдельно, почему бы не добавить их в Switch строка 350
2. Длинный Switch cтрочки 412-472 легко заменяется 4 строчками кода. если предварительно положить значения изменяющихся переменных в массивы с индексом по значению ключа свитча
в логику кода пока не вникал. но сразу замечания по структуре
1. Зачем условия в строчках 390-402 вынесены отдельно, почему бы не добавить их в Switch строка 350
2. Длинный Switch cтрочки 412-472 легко заменяется 4 строчками кода. если предварительно положить значения изменяющихся переменных в массивы с индексом по значению ключа свитча
1. Сначала делал их в Switch но не работает. вынес и все заработало.
2. к сожалению еще не умею.
А сворачивать код при публикации тоже "еще не умеете"?
Размещать без сворачивания код длиной больше чем один экран - mauvais ton.
А сворачивать код при публикации тоже "еще не умеете"?
Размещать без сворачивания код длиной больше чем один экран - mauvais ton.
свернул
А сворачивать код при публикации тоже "еще не умеете"?
Размещать без сворачивания код длиной больше чем один экран - mauvais ton.
а по коду комментарии будут?
и попутно вопрос, ячейка EEPROM Хранит значение 0...255 и только? или -128...127
Ячейка хранит 8 бит, а EEPROM хранит то, что скажешь. char - 1 байт, int - 2 байта, float - 4 байта. Как скажете - так и будет.
и попутно вопрос, ячейка EEPROM Хранит значение 0...255 и только? или -128...127
Ячейка хранит 8 бит, а EEPROM хранит то, что скажешь. char - 1 байт, int - 2 байта, float - 4 байта. Как скажете - так и будет.
помогите примером пожалуйста, как хранить переменную char у которой диапазон от -30 до 30. спасибо
по коду вот еще :)
искать среднее из трех значений можно быстрее, чем так:
вот например так