Циклы в Arduino без delay
- Войдите на сайт для отправки комментариев
Возможно уже были вопросы по поводу реализации циклов без
Delay, но я не нашел для себя подходящих ответов для реализации
данного функционала (если было то удалите тему).
Требуется за данный промежуток времени изменять значение с 0 до 100,
или наоборот с 100 до 0, но мне допустим нужно изменить параметр конечный
100 на 250 или на 1000, то нужно пересчитывать в цикле задержку.
Вопрос есть решения по данному поводу?
Чтобы получая данные допусти за 10 секунд значения равномерно изменялись
с 0 до 100, (10 сек = 10000 миллисекунд, то прирост на одно значение
соответствует 100 миллисекунд) но при этом программа выполняла остальной код.
Пробовал библиотеку SimpleTimer, но опять-таки нужно производить
предварительные расчеты..
И какие проблемы с предварительными расчетами?
Нет, действительно, совершенно непонятно, в чем Вы видите проблему.
VitalikNic, у Вас изначально порочный подход. Вы сразу уперлись в циклы. Зачем? Как раз с циклом Вы здесь ничего разумного не сделаете. Попробуйте решать задачу, а не плясать с бубном вокург конструкции, которая здесь малоприменима.
Подсказка: у Вас уже есть цикл - функция loop вызывается в бесконечном цикле. И никакие другие циклы для Вашей задаче не нужны - они только мешают.
Я задал вопро возможно уже существует решение по поводу
выполнения циклов по времени, расчитать не вопрос но когда
у меня их несколько то становится проблематично, сечас решаю
данную задачу через библиотеку SimpleTimer
timer.setTimer(100, DriverStep, 100); где функкция DriverStep
взывается 100 раз через каждые 100 миллисекунд. В самой
DriverStep я повышаю на одно деление при каждом вызове данной функции
или понижай в зависмости от полученных данных.
Это что? Если код, то он неполный и совершенно непонятный.
Как обяснить, я не знаю что, было понятно
Я думаю надо удальть данную тему...
Ясно, код секретный и показать его нельзя. Тогда, да, лучше закрывать тему.
Секрета нет
https://drive.google.com/open?id=11c2osSAeD3TMKMYiNBT5IQru1ZZsq2QM
полный код он работает у меня но пока не все реализованно
он собран со всего интернета :)
Ему на ходу скорость мотора менять надо по команде, похоже...
Я не шарюсь по посторонним сайтам. Если у Вас проблема - выкладывайте минимальный (как можно меньше) код, который, тем не менее, полный - чтобы его можно было запустить и увидеть Вашу проблему. Если не хотите выкладывать - проблема Ваша.
VitalikNic ,пришли просить помоши, не парьте мозги людям - выкладывайте код полностью. Алгоритм, который вы описываете, мне лично почти непонятен. Посмотрите темы " класс титановый велосипед для delay без delay(). " Можно еще с таймерами познокомиться если требуется МКшная суперточность.
код на коленке, в работе не проверял. не исключаю косяки
MaksVV-код на коленке, в работе не проверял. не исключаю косяки
слегка дописал и получил то что требовалось
Но ! Время выполнения на устройсте отличается от заданного, не кретично
но все же ...
и какой смысл использовать whilе? С таким же успехом можно и delay поставить. While точно также будет тормозить остальной код.
и какой смысл использовать whilе? С таким же успехом можно и delay поставить. While точно также будет тормозить остальной код.
Подскажи как тогда избавиться от цикла whilе в данном примере изложенном выше ? И да на устройстве видны задержки выполнения...
код #14 не подходит? если время исполнения не точно , можно вместо millis применить micros - будет точнее. На устройстве? итоговый код какой? Подозреваю что вы хотите начинать "цикл" по нажатию кнопки, но не правильно её опрашиваете.
Но ! Время выполнения на устройсте отличается от заданного, не кретично
но все же ...
Если приблизительно +/- iterationTime то так и должно быть - это погрешность такой реализации. Код в #14 выглядит лучше - он не работает что ли ?
Дело в том что, я как бы вызываю данную функцию из основного цикла по событию (нажатия кнопки или по выполнению какогото условие) из за этого реализовать как в #14 я не знаю как ...
Но прекрасно понимаю? что в основном цикле с #14 реализовано также как у меня в цикле
while
реализовано не также. В вашем цикле while пока все итерации не пройдут остальной код не будет выполняться. Это тоже самое что сделать цикл for. А, собственно, сабж как раз как от этого избавиться или нет?
вот код на micros (), он точнее немного. (погрешность в 20 мс примерно).
дак в #14 же показано в setup() как запускается функция? ну поставил ещё пример как из лупа запусить.
когда разница между целевым и фактическим значением переменной менее 100 - точность времени будет низкая.
Дело в том что, я как бы вызываю данную функцию из основного цикла по событию (нажатия кнопки или по выполнению какогото условие) из за этого реализовать как в #14 я не знаю как ...
Но прекрасно понимаю? что в основном цикле с #14 реализовано также как у меня в цикле
while
Фиг знает что вам собственно нужно :) но навскидку вам Cukl() надо вызывать безо всяких событий, постоянно, а проверять flag в нем не нужно (а скорее Cukl вообще не нужно и надо просто вызывать CycleChangeVar_() ,ожидая flag == 0 в основном цикле).
Общая концепция программ "без delay" заключается в прозрачности исполнения кода чтоли... что бы там ни случилось - не надо никаких зацикливаний, кроме самого loop. Случилось что то - отреагировали и тут же пошли дальше, не случилось - тоже пошли дальше (случилось / не случилось - это if или case). Вот и все ваши функции так должны работать - вы её вызвали, она что то сделала или не сделала и сразу завершилась, все равно скоро её снова вызовут.