Помогите поменять delay на millis
- Войдите на сайт для отправки комментариев
Втр, 14/04/2020 - 21:22
есть код
void loop() { //действие1; delay(500); //действие2; delay(500); //действие3; delay(500); //действие4; delay(500); }
Как delay заменить на millis? Нужно чтобы все 4 разных действия повторялись друг за другом. Вроде как должно быть просто, но я не догоняю.
Примерно так
u32 tmr1, tmr2, tmr3, tmr4;
bool TimerOver(u32* timer, u32 interval)
{
u32 m=millis();
if(m-*timer<interval) return false;
*timer=m;
return true;
}
void loop()
{
if(TimerOver(&tmr1, 100)) do1();
if(TimerOver(&tmr2, 1000)) do2();
if(TimerOver(&tmr3, 500)) do3();
if(TimerOver(&tmr4, 1234)) do4();
}
Не работает так как хотелось. Все действия пытаются одновременно выполняться.
delay(n) - делает задержку в n миллисекунд.
millis() - возвращает количество микросекунд.
Теперь подробнее про задачу: что нужно?
Может Вы попутали millis и delayMicroseconds ?
delayMicroseconds(n)- делает задержку в n микросекунд.
Как delay заменить на millis? Нужно чтобы все 4 разных действия повторялись друг за другом. Вроде как должно быть просто, но я не догоняю.
Посмотрите тут http://alxarduino.blogspot.com/2013/09/BlinkAndPrintWithoutDelay.html Возможно, подойдёт.
Я не очень понял задачу. Так как у Вас написан фрагмент кода, действия как раз и повторяются друг за другом с дистанцией в 500 мс. В чем смысл замены delay() на millis()?
Теперь подробнее про задачу: что нужно?
Может Вы попутали millis и delayMicroseconds ?
Нужно чтобы все 4 действия выполнялись строго друг за другом через пол секунды. Все действия разные. Delay прост и удобен и с ним всё работает. Но проблема в том что delay тормозит всю программу, а это не хорошо. И вообще использовать delay не комильфо. На каждом углу кричать что лучше использовать millis(). С millis() всё просто когда нужно повторять одно и тоже же действие. А у меня они разные. И каждое последующее действие должно выполняться после выполнения предыдущего. Не знаю как еще более подробно описать.
Ну да, ну да... "Все побежали, и я побежал" (с)
В блинке без делей счётчик от 1 до N и switch case.
Здесь что-то на эльфийском. Я не понимаю)
Что тут понимать? Берете скетч "blink без delay", в условии наращиваете переменную и прогоняете через switch.
Вавгат, ваш код ничем не отличается от delay - так же блокирует программу
Так человеку это и нужно, судя из его описания. Ему просто звёзды запрещают пользоваться delay, нужен именно millis
Во всяком случае из постановки задачи я понял именно так.
А если нужно, чтобы от начала действия 1 до начала действия 2 было 0,5 сек. (если конечно само действие не длиться дольше), то кто вам мешает переставить одну строчку?
Да. Вы всё правильно поняли. Это то что нужно, как бы странно это кому ни казалось. Спасибо. Вопрос решен)
Ребята, что за чушь вы оба пишете? Вы понимаете, что ваш код блокирует контроллер?
Вера, она такая - слепая и беспощадная. Но делей был повержен.(((((
Есть вариант как это сделать не блокируя контроллер?
Так поменьше писанины:
Так дальнейшее развитие событий в кривых руках , менее предсказуемо.
Я вот не представляю, что у него в Func'ах.
Но как убить работоспособность вашего варианта, вижу очень четко и ясно
Я извиняюсь, но чем Ваш вариант лучше моего? Тем, что в цикл добавлена ещё 1 переменная и два условия, а код стал более читабельным?
Тем что не блокирует код
Почитай про while, может дойдёт
Из сформулированной задачи, поставленной автором темы, совсем не видно, что в этот промежуток времени микроконтроллеру нужно ещё что-то делать, кроме как ждать 500 мс. Вариантов решения конечно же много, можно и таймер подключить. НО для задачи "поменять delay на millis", для начинающего - это самое оно. А то, что человек только начинает вникать, понятно из текста вопроса и ответов данного человека. А Вы его высшей математикой сразу же пытаетесь загрузить.
Убить можно всё, что угодно. Вне зависимости от того, где ++ стоит ;)
И код этот не лучше и не хуже. Он просто другой. А так, как ТС объяснил требования на пальцах, то ему все равно, как оно будет работать. Поэтому и пошли упражнения.
Так в том и прикол, что примерно так через while и реализован delay() в ядре Ардуино.
Вы его не заменили на миллис, а тупо написали свой delay2().
Точно так же тормозящий программу
Я извиняюсь, но чем Ваш вариант лучше моего?
вы реально не въезжаете, что ваш код - бредятина? Может не стоило тогда с советами вылезать?
Для проверки попробуйте написать через while мигание двумя светодиодами с некратными периодами
Я знаю про while и про то, что while (1) { действие } гораздо быстрее, чем void loop { действие }
Но каким боком это к вопросу автора? Хотите похвастаться знаниями, так прямо и скажите, что "так-то и так лучше, потому что...".
для задачи "поменять delay на millis", для начинающего - это самое оно.
похоже, что вы сами от этого "начинающего" очень недалеко ушли. Еще раз повторюсь - "ваше решение" - не решение, а бредятина. Отказ от delay() делается ради написания неблокирующего кода. ваше решение ничего общего с этим не имеет.
Вкупе с еще одним "решением" про не-прямоугольные массивы - я вижу что вы крайне мало смыслите в предмете, в которые влезли советовать.
У sadman41 и Kakmyc вообще только кусок программы, который в реальности если скопировать и тупо вставить в while или loop, будет выполнять только 1 функцию. А для того, чтобы выполнились остальные 3, нужно одну строчку перенести в секцию setup.
У sadman41 и Kakmyc вообще только кусок программы, который в реальности если скопировать и тупо вставить в while или loop, будет выполнять только 1 функцию.
похоже что вы мало того, что сами писать не умеете - вы даже чужой код прочитать не в состоянии
Как delay заменить на millis? Нужно чтобы все 4 разных действия повторялись друг за другом. Вроде как должно быть просто, но я не догоняю.
В песочницу заглядывали?
А я и не скрываю, что я далеко не профи, но я хоть какой-то вариант предложил. Думающий человек из моего варианта сможет сделать то, что нужно. А с Вашей стороны только критика сыпется и никаких дельных советов. У человека был ступор: он не понимал, как функцию, возвращающую время, использовать для создания задержки. Я наглядно показал это.
По поводу массивов - Может для Вас это будет новостью, но в некоторых языках допускаются многомерные массивы с не фиксированным количеством элементов.
Спасибо всем кто отписался по данной теме. Не ожидал такого фидбека и даже спора по такому казалось бы простому вопросу). Способ через switch действительно более подходящий.
У sadman41 и Kakmyc вообще только кусок программы, который в реальности если скопировать и тупо вставить в while или loop, будет выполнять только 1 функцию.
похоже что вы мало того, что сами писать не умеете - вы даже чужой код прочитать не в состоянии
Вы в этом уверены? Вставим к примеру в while:
Что получим?
А я и не скрываю, что я далеко не профи, но я хоть какой-то вариант предложил.
этот вариант не просто бесполезный - он категорически вредный. Если вы этого не понимаете - слушайте тех, кто понимает больше вас.
Еще раз - для саморазвития попробуйте написать на основе своего кода с while мигание двух диодов с периодами, например, 300 и 800 миллисекунд. Напишете - публично извинюсь
Вы в этом уверены? Вставим к примеру в while: Что получим?
вы совсем идиот? Спросите еще, как этот код будет работать, если от МК отключить питание? :)))
У sadman41 и Kakmyc вообще только кусок программы, который в реальности если скопировать и тупо вставить в while или loop, будет выполнять только 1 функцию.
похоже что вы мало того, что сами писать не умеете - вы даже чужой код прочитать не в состоянии
Вы в этом уверены? Вставим к примеру в while:
Что получим?
А если так ?
или так
Если так хочется запихать переменную внутрь цикла , и при этом нужно ее использовать не обнуляя в каждом проходе то тогда она и обьявляться будет по другому
или так
Так будет работать
Похоже мы присутсвуем при рождении очередного Великого. Написать чушь смелости хватило, а признать что слошил - уже нет. Теперь будет доказывать, что ТС именно этого и хотел...
Похоже мы присутсвуем при рождении очередного Великого. Написать чушь смелости хватило, а признать что слошил - уже нет. Теперь будет доказывать, что ТС именно этого и хотел...
Кое кто из этих "великих", хоть в коде что то понимал, в отличие от этого неофита
Теперь подробнее про задачу: что нужно?
Может Вы попутали millis и delayMicroseconds ?
Delay прост и удобен и с ним всё работает.
На каждом углу кричать что лучше использовать millis().
Фраза "Но проблема в том что delay тормозит всю программу, а это не хорошо. И вообще использовать delay не комильфо." скорее всего взята "из учебника". Я больше чем уверен, что человек Вам не объяснит, как именно этот delay тормозит его программу, так как она у него работает!!!
И я уже признал выше, что мой код не оптимальный. Но в данной задаче имеет право на жизнь, так как если не касаться вопроса while или loop, то он (код) эффективнее, чем вариант с switch, так как на 1 переменную и 2 условия меньше.
Больше не вижу смысла продолжать дискуссию по данному вопросу, так как некоторые начинают переходить на личности.
И я уже признал выше, что мой код не оптимальный. Но в данной задаче имеет право на жизнь, так как если не касаться вопроса while или loop, то он эффективнее, чем вариант с switch, так как на 1 переменную и 2 условия меньше.
он не просто "не-оптимальный" - он бесполезный. А рассуждение об "эффективности" звучит примерно так - "давайте вместо лекарства будем пить простую воду - она конечно ничего не лечит, зато и побочки нет"
Больше не вижу смысла продолжать дискуссию по данному вопросу, так как некоторые начинают переходить на личности.
хорошо б вы ее и не начинали вовсе. И в других темах тоже...
Интересно, по каким критериям 4 пустых цикла с условиями эффективней одного свича с предрасчитанными переходами?
А я и не скрываю, что я далеко не профи, но я хоть какой-то вариант предложил.
этот вариант не просто бесполезный - он категорически вредный. Если вы этого не понимаете - слушайте тех, кто понимает больше вас.
Еще раз - для саморазвития попробуйте написать на основе своего кода с while мигание двух диодов с периодами, например, 300 и 800 миллисекунд. Напишете - публично извинюсь
Сразу не увидел, дописываю свой вариант. Критикуйте.
Что-то я не внимательный сегодня (не выспался). На основе моего кода:
Вангую дополнительный миллис-срач.
+100 ^) Вавгат. будем обсуждать переполнение миллис? :))
Что касается вашего кода - и где в нем ваши циклы while для измерения времени? - незачет
Говорю же: не выспался. До 3-х ночи сидел читал про прерывания. В 8 утра встал.
Что-то я не внимательный сегодня (не выспался). На основе моего кода:
это код мигания одного светика с периодом 1100 мс, а не двух с периодами 300 и 800
поправка - это код мигания одного светика с периодом ON 800 и OFF 300мс
Но все равно незачет