Как убрать delay в ардуино
Arduino.ru
Помогите избавиться от delay
Всем привет! Знаю что не кашерно задавать такие вопросы, когда есть интернет и все гуглится, поэтому пишу в песочнице.
Нет ничего беспощаднее и ужаснее delay в коде, это я уже понял)))
Вроде переечитал все, тыкался и так и так, получается ерунда, удалил все нафиг. Помогите кто советом, кто кодом избавиться от delay в двух частях кода.
А вот вторая часть кода в которой даже я спусть день трудно разбираюсь
Ну чего я хочу добиться? избавиться от delay в коде в местах где он есть. пауза должна произайти но без delay.
Я могу выложить весь проэкт целиком и объяснять на три листа что к чему и как должно работать, но есть ли в этом смысл? Если есть я напишу, мне не сложно.
Нет ничего беспощаднее и ужаснее delay в коде
Что ж в нём такого ужасного и беспощадного?
Ну чего я хочу добиться? избавиться от delay в коде в местах где он есть.
Т.е. delay в общем-то не мешает, а цель не достичь каких-то результатов, а просто избаиться от delay? Правильно? А для чего от него избавляться? Ради упражнения? Ну, тогда сами упражняйтесь, мы ты Вам зачем?
Или есть какая-то другая цель, которую Вы от нас скрываете?
Нет ничего беспощаднее и ужаснее delay в коде
Что ж в нём такого ужасного и беспощадного?
Ну чего я хочу добиться? избавиться от delay в коде в местах где он есть.
Т.е. delay в общем-то не мешает, а цель не достичь каких-то результатов, а просто избаиться от delay? Правильно? А для чего от него избавляться? Ради упражнения? Ну, тогда сами упражняйтесь, мы ты Вам зачем?
Или есть какая-то другая цель, которую Вы от нас скрываете?
Нет конечно не в упражнении:)) Цель избавления в том что, пока происходят эти delay замедляется работа программы. Остальной код стоит. А мне нужен мгновенный отклик программы на изменения в датчиках, что бы мгновенно их отобразить на дисплее.
Некомментированную протыню не нужно выкладывать и кусок кода, без объяснения что он должен делать и чего из задуманного не делает, тоже не надо.
Ну, тогда приведите маленький, но полный (чтобы запустить можно было) пример в котором была бы понятна проблема. А то из того, что Вы привели никак не следует наличие какого-то другого кода, и никак непонятно что там за код такой. А от этого во-многом зависит то, как следует поступить. Например, если там всё на прерываниях, то и плевать на делэй с высокого уровня.
Вот общий пример «Как избавиться от трупа delay()» :
Некомментированную протыню не нужно выкладывать и кусок кода, без объяснения что он должен делать и чего из задуманного не делает, тоже не надо.
Я не програмист и не имею опыта общения с програмистами, наверное просто не умею задавать корректно вопросы по этой теме.
Сейчас ниже выложу программу целиком
Одна из причин почему не стал выкладывать код целиком это то что, боюсь за такой код вы меня просто из интренета удалите)) Понимаю что код не грамотен, но пишу как получается.
Установлено в авто, подключено к штатному монитору.
Контроллер переключает источник видео сигнала с помощью реле. Чтобы перключать без помех нужно сначало отключить сигнал, затем переключить сигнал синхронизации и только потом подключить другой сигнал.
Между этими действиями должна быть задержка в 50 милисекунд, обусловленна эта необходимость физической работой реле.
А в этой части при включении заднего хода, должен включиться сигнал от автомобиля, но после выключения заднего хода должен остаться активным тот источник сигнала который был активен до включения заднего хода.
Все так и работает, но мне просто нужно сменить источник сигнала не мгновенно, а пока запустится камера в авто, примерно 700 милисекунд.
Ниже код целиком и схема.
Одна из причин почему не стал выкладывать код целиком это то что, боюсь за такой код вы меня просто из интренета удалите))
Да, удалят Вас не за это, а за то, что читать не умеете. Я Вам ясно написал
приведите маленький, но полный (чтобы запустить можно было) пример в котором была бы понятна проблема.
А Вы что привели? Вы не можете написать маленький код, иллюстрирующий проблему? Значит, Вы пока её (проблему) не осознаёте, работайте дальше.
Одна из причин почему не стал выкладывать код целиком это то что, боюсь за такой код вы меня просто из интренета удалите))
Да, удалят Вас не за это, а за то, что читать не умеете. Я Вам ясно написал
приведите маленький, но полный (чтобы запустить можно было) пример в котором была бы понятна проблема.
А Вы что привели? Вы не можете написать маленький код, иллюстрирующий проблему? Значит, Вы пока её (проблему) не осознаёте, работайте дальше.
Я и написал всю суть с самого начала. И написал проблемные куски, подругому я их не могу написать потому что они именно такие.
Указал отдельно, не устроило, написал целликом, опять не устроило.
Я как должен написать рабочий маленький код когда аппартной части у вас нет?
Эту простыню читать врядли кто станет.
И да, как ты понимаешь свою задержку в 700мс между двумя операторами, которые ничего никуда не выводят? ;))))))))))
«Погодите, медведь, не ревите,
объясните, чего вы хотите?
А в ответ, только му да му,
А к чему, почему, непойму.
Повесьте пожалуйста трубку.» (с).
А за три года, можно было и блинку без делеев почитать. Считаете, что нахамив Евгению, повысили шансы на помощь?
Я сразу написал код который имеет значение, в том порядке как он есть.
В правилах написано, не лезь со своими правилами, я вот прохожий но не понимаю для чего нужны открытые форумы куда могут придти и спросить по нормальному без негатива, пусть даже не корректно задавая вопрос по незнанию, а на человека негативить начинают.
Авторитно подхамить это позволительно, а на грубость ответить тем же нельзя.
Я считаю что евгений начал хамить.
Дата регистрации никак не означает что я подходил к ней с тех пор. Попытаться подковырнуть человека я так пологаю тоже считается нормой, это не хамство получается.
Не, не, как и у Дракулы, вопрос риторический был.
Я считаю что евгений начал хамить.
Евгений, здесь, один из самых вежливых и терпеливых профи.
Постом выше того где якобы я нахамил предложением пройти мимо.
Такое же хамство как и от меня в ответ
Всем кто ответил по делу пытаясь помочь спасибо, я буду читать, изучать, пробовать.
И вот прлиожу код как просили «маленький рабочий» не расчитывая на помощь, а лишь для того, кто невзирая на авторитеты старожил сравнит мой изначальный пост с кодом без всего лишнего как и просили.
Ну, давайте разберемся с 33 строкой delay(700)
Помогите кто советом, кто кодом избавиться от delay
Чтобы избавиться от delay. нужно поменять своё мировозрение. «смотреть ширше». для начала.
У вас же там крутотень атмэловская. с каким-то типа железом. а вы как с детской лопаткой в песочнице.
Такие проблемы решаются при помощи конечных автоматов, прерываний, ОС, программных таймеров и хардварных таймеров. на выбор. Не всё это, правда, вяжется с концепцией ардуины. но это уже вам решать.
Ну, давайте разберемся с 33 строкой delay(700)
сегодня нет возможности проверить код, я правильно понимаю, если между 31 и 33 строкой не пройдёт 700 милисек то получается программа просто пройдёт мимо, а в следующие проходы программы когда будет 700 она выполнит действие с «key»?
Помогите кто советом, кто кодом избавиться от delay
Чтобы избавиться от delay. нужно поменять своё мировозрение. «смотреть ширше». для начала.
У вас же там крутотень атмэловская. с каким-то типа железом. а вы как с детской лопаткой в песочнице.
Такие проблемы решаются при помощи конечных автоматов, прерываний, ОС, программных таймеров и хардварных таймеров. на выбор. Не всё это, правда, вяжется с концепцией ардуины. но это уже вам решать.
что вы подразумеваете под «смотреть шире»?
как я должен обращаться если я не родился с познаниями программиста и на данный момент не умею иначе?
А что вяжется с концепцией ардуины? Вернее, в какой язык стоит податься с этим железом?
Помогите кто советом, кто кодом избавиться от delay
Чтобы избавиться от delay. нужно поменять своё мировозрение. «смотреть ширше». для начала.
У вас же там крутотень атмэловская. с каким-то типа железом. а вы как с детской лопаткой в песочнице.
Такие проблемы решаются при помощи конечных автоматов, прерываний, ОС, программных таймеров и хардварных таймеров. на выбор. Не всё это, правда, вяжется с концепцией ардуины. но это уже вам решать.
что вы подразумеваете под «смотреть шире»?
как я должен обращаться если я не родился с познаниями программиста и на данный момент не умею иначе?
А что вяжется с концепцией ардуины? Вернее, в какой язык стоит податься с этим железом?
зачем фатализировать какую-то мелочную если это можно назвать стычку, ничего такого смертельного никто не сказал. Что за чувствительность то такая? Я не думаю что Евгений хоть как-то обиделся, а заступников нашлось зато сколько.
Не нашли общего языка, не велика потеря. Не захотели меня понять, не ясно я выражался. Ничего страшного.
я никого обидеть не пытался. Чуть грубее выразился, так начали тыкать хамством, при этом писать язвительные стишки и тому подобное.
а комментарий от вас «ищу исполнителя» от глубокого взаимного уважения ко всем участникам? и скажите мне что это не намёк на мою какую-то тупость, мол ты то не разберёшься никогда.
я пришёл не в поиске халявы, что бы за меня все сделали, а чтобы разобраться всё-таки да что бы пнули в нужную сторону. Тыкнули носом может в какую ссылку которая кажется для вас очевидной, а я ее не вижу.
Ну, если не хотите менять структуру программы и одновременно боитесь пропустить событие во времы delay(); создайте дополнительную функцию delay_(); и в ней отслеживайте своё событие.
я правильно понимаю, если между 31 и 33 строкой не пройдёт 700 милисек то получается программа просто пройдёт мимо, а в следующие проходы программы когда будет 700 она выполнит действие с «key»?
Но, надеюсь, направление куда копать я дал.
я правильно понимаю, если между 31 и 33 строкой не пройдёт 700 милисек то получается программа просто пройдёт мимо, а в следующие проходы программы когда будет 700 она выполнит действие с «key»?
Но, надеюсь, направление куда копать я дал.
Да этого. Я пока делаю упор на железо, поэтому программа должна как-то работать и пишу код как вот получается. А то что нужно переделать программу я понимаю, но это после того когда уже будет готово железо. Спасибо)
Я пока делаю упор на железо, поэтому программа должна как-то работать и пишу код как вот получается. А то что нужно переделать программу я понимаю, но это после того когда уже будет готово железо. Спасибо)
Простите, но тогда совершенно непонятно, нафига вы вообще подняли этот вопрос.
Я пока делаю упор на железо, поэтому программа должна как-то работать и пишу код как вот получается. А то что нужно переделать программу я понимаю, но это после того когда уже будет готово железо. Спасибо)
Простите, но тогда совершенно непонятно, нафига вы вообще подняли этот вопрос.
Я же написал что я буду переписывать программу после того как доделаю железо. Я не писал что слишком сложно или мне лень или меня устраивает и так. Ждал простого рецепта, потому что не шарю попросту говоря и не знал что такого решения нет. Видимо у меня самого и не вышло разобраться из за отсутствия такого решения.
Сейчас я уже понимаю что надо иначе делать все, осталось понять как иначе)
нужно чтиво полезное найти что бы грамотнее делать структуру программы изначально под мои задачи
Arduino.ru
Заменить delay на millis()
Хочу в коде заменить delay на millis(). Не понимаю, почему не работает. Код можно разделить на 2 блока. один выполняется при помощи delay, а второй я хочу выполнить при помощи millis. Задача на LED дисплее написать, какая кнопка нажата. Проблема в том, что без задержки запись сразу пропадает. В следствии появляется задержка в 1 секунду.
Мое понятия написанного мной кода в том, что как только срабатывает положительное значение, то на дисплей выводится надпись. Она там будет написана, пока не сотрется. Стирание происходит при помощи millis. Я создал интервал времени в 1 секунда, далее millis приравнивается к значению к прошлому значению. Если интервал закончился, то выполняется стирание надписи. блок заканчивается. начинается новый цикл.
После какого события нужно начинать отсчитывать миллисекунды?
Приведите скетч целиком
После какого события нужно начинать отсчитывать миллисекунды?
отсчет миллисекунд должен начаться после нажатия на кнопку. Соответсвенно после того, как условие if (val Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
я выложил почти полный код.
Я понимаю строку 6 и 7 так.
При условии, что я правильно все понимаю.
я выложил почти полный код.
Ну, а Вам почти помогли разобраться.
отсчет миллисекунд должен начаться после нажатия на кнопку. Соответсвенно после того, как условие if (val Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Извините, пожалуйста, в коде пропущена одна самая важная строчка. Добавил строку 10. значение val считывается при помощи аналогового входа. Исходя из этих данных я могу определить, какая кнопка нажата и какую информацию мне нужно выводить на дисплей. Далее я пишу информацию на дисплее, которая сама по себе не стирается. Остается написанной пока не будет дана команда стереть или будет дана команда написать поверх этой надписи.
Соотвественно, проблема состоит в том, что бы стереть надпись через интервал времени 1 секунду. При помощи delay у меня нет никаких проблем, но это в корне не правильно и я написал альтернативу при помощи millis().
по видимому оно стирается и тут же выводится вновь, так написано по крайней мере
После какого события нужно начинать отсчитывать миллисекунды?
отсчет миллисекунд должен начаться после нажатия на кнопку. Соответсвенно после того, как условие if (val last_time не помещается кол-во мс?
Вам нужно для начала сделать для двух кнопок следующее: определили, что кнопка нажата, запомнили в какой момент была нажата, вывели что-то на экран. Лишнее пока убрать. Пусть временно будут наслоения.
Окей, тогда почему после того, как условие стало верным, в переменную last_time не помещается кол-во мс?
Вам нужно для начала сделать для двух кнопок следующее: определили, что кнопка нажата, запомнили в какой момент была нажата, вывели что-то на экран. Лишнее пока убрать. Пусть временно будут наслоения.
Верно. Я сейчас осознал 1 ошибку. нажатие на кнопку может быть в любой момент и у меня не было точки отсчета. Я исправил.
Я хотел бы разобраться на 1-ой кнопке, потому что с остальным у меня уже не будет проблем. Вторая кнопка оставлена только для того, что бы Вы могли бы понять, какая стоит задача, провести аналогию.
Исправленный код. Я фиксирую момент нажатия кнопки.
В таком варианте у меня надпись появляется на дисплее сразу после нажатия. Надпись все время отображается. Можно только поверх нее что-то написать.
Далее я добавляю условие millis(). По истечению 1 секунды дисплей очищается.
Arduino.ru
как заменить delay
Доброе время суток. Делаю свой первый проект на Arduino где необходимо реализовать плавное включение светодиода, нашёл с примеров вот такое
Все работает отлично, только delay останавливает остальные действия ардуины, подскажите как поменять delay на Millis. Все примеры с Millis какие находил не смог связать вместе. Спасибо!
Все примеры с Millis какие находил не смог связать вместе. Спасибо!
Если даже с примерами не доходит, вряд ли кто сможет помочь.
Добрый день. Извините, что влез в Вашу тему со своим вопросом, но просто не хотелось плодить новую. Подскажите пожалуйста, никак код не могу написать. Суть в следующем. Есть подсветка лесенки. Все вроде замечательно работает. Решил еще что-то прикрутить, например управление остальным светом. Я так понимаю, столкнусь с проблемой, что из-за пауз delay в лесенке, настанет момент когда какой-то датчик не сможет сработать, т.к. в это время ардуино будет отдыхать. Хочу delay заменить на millis только вот как бы я не старался, не работает.
Сам код лесенки (не полностью, вместо включения дидов, пока написал чтобы в Serial.print выводил.
Попробовал в функцию Led_On вместо delay ставить код типа
ничего не происходит. Задержки нет. все Led 1 on, Led 2 on, Led 3 on, Led 4 on срабатывают моментально, без задержки. Куда этот код вставить, чтобы задержка появилась?
Попробовал в функцию Led_On вместо delay ставить код типа
ничего не происходит. Задержки нет. все Led 1 on, Led 2 on, Led 3 on, Led 4 on срабатывают моментально, без задержки. Куда этот код вставить, чтобы задержка появилась?
Чтобы задержка появилась, надо добавить бесконечный цикл, который будет крутиться на месте, пока время не вышло. Например так
Спасибо.за ответ. Вкратце не сообщите какая логика должна быть? Первый раз просто колупаю, думал дошла программа до датчика, опросила его, если он сработал, то делай то-то. Если нет, то заново опрашивай, пока не сработает. Получается не правильный алгоритм?
Банальная логика наручных часов. Тех что без будильника. Занимаешься чем-то и поглядываешь на часы. Как время подошло, то делаешь что надо и возвращаешься продолжать делать что ранее. Так бесконечный loop() это то что МК делает всегда, а millis это часы. На них надо регулярно поглядывать и сравнивать с нужным временем.
Правильно ли я понял, что сначала программа должна запустить часы, потом опросить датчик. Перед тем как датчик опросит, запомнить восколько она это сделала. После того как опросила и если он сработал, программа начала отсчет от времени для задерки включения ступенек?
Огромное спасибо за ссылку. Обязательно попробую разобраться. Вроде все расписано. Если что-то будет не понятно, спрошу.
удобно тем, что я один раз в сетапе задал для каждого таймера интервал и могу делать дальше все что угодно, ничего специально не ожидая. Когда подойдет время для нужного события, оно само сработает
Здравствуйте. Можно У Вас уточнить. Поломал Ваш код, у меня получилось так:
Сейчас сообщение ssss выводится через 2 секунды. Хотел спросить, а как вставить в loop? Если просто написать pause_1(); то перестает работать.
если вставить в loop() что?
и что значит перестает работать? Симптомы?
К примеру, вышеприведенный код сейчас выводит текст ssss раз в 2 секунды. Если вставить функцию void pause_1 в loop, то начинает выводить текст ssss без задержек.
ответьте тогда на вопрос, что есть функция loop() и почему у нее такое название?
Если честно, не вкурсе. При знакомстве с arduino везеде написано, что всю программу нужно писать в loop(). Я так понимаю, это тоже самое, что любая другая функция, только она выводится постоянно не в ручную, а автоматически.
Я хочу, чтобы Вы, почитав какследовает, ответили на свой вопрос сами.
Ну так почему не сделать Ваши «таймеры» на том же таймере 0 заодно с millis и micros, ничего при этом не нарушая, просто добавив к тому, что уже делается, Ваш код? Где-то на форуме эту идею подробно расписывал ЕвгенийП.
Надачитать. Моих познаний пока не хватает.
А почитал, пока дошть в даче. Переделаю на таймер 0, это как раз то, что и нужно, точность большая не нужна.
Подскажите пожалуйста, в чем конкретно я «не вкурсе»? что писать в Loop. а что нет? а опрос датчиков в loop тоже не нужно вставлять? Если нужно, тогда где нужно в коде написать, чтобы диоды загорались и выводилась задержка из функции?
Вдруг кому пригодится. На этом форуме к сожалению я ответа не нашел. Сейчас сделано так, вроде все работает. Единственное человек посоветовал заменить
В посте №15 Вы пишете:
Если честно, не вкурсе.
А в посте №23 спрашиваете у меня:
Подскажите пожалуйста, в чем конкретно я «не вкурсе»?
что писать в Loop. а что нет? а опрос датчиков в loop тоже не нужно вставлять? Если нужно, тогда где нужно в коде написать, чтобы диоды загорались и выводилась задержка из функции?
1. Правильно переводит.
2. Если тспользуете метод, предложенный DetSimen, функции не нужно вставлять в loop().
Добрый вечер. Решил заменить ради эксперемента delay в коде к сенсору hc-sr04 на millis. Хотел спросить, правильно ли код написал и можно ли так делать? Работает вроде верно (по сравнению со стандартным скетчем который с delay
Повторюсь, показывает одинаковые данные, только меня смущает что передается в порт. В первом случае в порт шло
serenka, вы пишете о millis(), а используете micros(). Вы уверены. что вам нужны микросекунды?
Да. там в настройках датчика нужна задержка именно в микросекундах. Я имел ввиду сам код. Возможно так делать? Или это приведет к каким-то плачевным последствиям? К примеру с другими датчиками нельзя такое делать, или когда много кода будет, будут ошибки вылезать и т.п.
П.С. Чтобы не плодить тему, вдруг кто-то сталкивался. Написал код: К примеру который выше. Все работает быстро, правильно. Стер этот код, написал другой. Стер другой, вставил точь в точь предыдущий код, работает с задержками. Как конкретный пример, Фоторезистр показывал в порт значения (без всяких задержек). Вставил этот же код (с фоторезистром), в порт теперь с какими-то паузами выдает. Штук 10-20 значений моментально выдает, потом на полсекунды запинается, начинает выводить значение примерно в полсекунды. Т.е. какие-то паузы возникают.
Это бракованность ардуины или такое нормально? Просто не только с фоторезистором такое. были проблемы и датчиками HC-SR04 код неделями работает нормально, потом стираю, что-то другое заливаю, стираю, заного тот же код (с ультразвуковыми датчиками) заливаю, а они начинают медленнее работать. Заного код пересобираешь, опять работают нормально.