Вопрос по Ардуино. Заменить delay() на millis()

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Nikita.Dorovskikh
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 26, 2015 18:33:42
Откуда: Екатеринбург

Вопрос по Ардуино. Заменить delay() на millis()

Сообщение Nikita.Dorovskikh »

Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя.
Никак не могу одолеть вопрос таймеров. Как убрать из программы delay? В Гугле ищется лишь как мигать светодиодом без delay, но это совсем не то, что нужно. Вот кусочек кода именно запуска двигателя:

Код: Выделить всё

void autostart() {
  digitalWrite(main_relay, HIGH); // включаем главное реле
  digitalWrite(engine_relay, HIGH); // включаем реле зажигания
  digitalWrite(immo_relay, HIGH); // включаем реле обходчика иммобилайзера
  delay(3000); // ждем 3 секунды, пока накачает бензонасос
  digitalWrite(starter_relay, HIGH); // включаем реле стартера
  delay(1000); // на 1 секунду
    if (launch_status == 0) delay(1000); // если двигатель не запущен, то ждем еще секунду (в общей сумме стартер проработает 2 секунды)
    else if (launch_status == 0) delay(1000); // если двигатель не запущен, то ждем еще секунду (в общей сумме стартер проработает 3 секунды)
    else if (launch_status == 0) delay(1000); // если двигатель не запущен, то ждем еще секунду (в общей сумме стартер проработает 4 секунды)
    else if (launch_status == 0) delay(1000); // если двигатель не запущен, то ждем еще секунду (в общей сумме стартер проработает 5 секунды)
    else digitalWrite(starter_relay, LOW); // иначе выключаем стартер
}
В постоянном цикле loop у меня опрашиваются лампы зарядки(генератора) и давления масла. По ним я определяю статус двигателя запущен или нет.
Так вот мне нужно крутить стартером, пока статус двигателя не изменится на 1 (значит запущен), НО крутить при этом не более 5 секунд! Если посмотрели код, то наверняка заметите как топорно я это организовал через кучу задержек. Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.

Как это можно реализовать при помощи millis()?

И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!
Реклама
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение Morroc »

[uquote="Nikita.Dorovskikh",url="/forum/viewtopic.php?p=3319208#p3319208"]Никак не могу одолеть вопрос таймеров. Как убрать из программы delay? В Гугле ищется лишь как мигать светодиодом без delay, но это совсем не то, что нужно.[/uquote]
Это то самое если добавить еще светодиод и управление ими с помощью кнопок, а так слишком просто вышло.

Полистайте эту тему http://arduino.ru/forum/obshchii/pomogite-uiti-ot-delay (посты 28 31 59 ну и другие примеры без delay) и почитайте про конечные автоматы. Замена - неправильное слово, заменить нельзя, нужно переделывать программу.

[uquote="Nikita.Dorovskikh",url="/forum/viewtopic.php?p=3319208#p3319208"]Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.

Как это можно реализовать при помощи millis()?

И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы![/uquote]
Ваш код должен постоянно выполнять непрерывный цикл и в определенные моменты времени (определяются millis() и текущим состоянием системы - что включено, когда, запущен двигатель или нет) выполнять определенное действие, запоминать что выполнили (если требуется соблюсти последовательность действий) и дальше по кругу. Этакое псевдопараллельное выполнение. Думаю в книжке по конечным автоматам толковее написано.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение dosikus »

Morroc, почитал, как и ожидалось чуда не произошло . Ардуионо _изобредатели так же далеки от осознание конечного автомата как до китая раком.
Что дальше?
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение Morroc »

Не думаю что есть варианты :) Читать и пробовать до полного просветления :)
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение dosikus »

Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.
Реклама
kaetzchen
Друг Кота
Сообщения: 11994
Зарегистрирован: Пн апр 19, 2010 00:04:18
Откуда: Малороссия

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение kaetzchen »

Я вот не пойму..Вы, что ЭБУ вообще выкинули из тачки?
Реклама
Nikita.Dorovskikh
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Чт ноя 26, 2015 18:33:42
Откуда: Екатеринбург

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение Nikita.Dorovskikh »

[uquote="kaetzchen",url="/forum/viewtopic.php?p=3319466#p3319466"]Я вот не пойму..Вы, что ЭБУ вообще выкинули из тачки?[/uquote]
Это Вы к чему? :)
kaetzchen
Друг Кота
Сообщения: 11994
Зарегистрирован: Пн апр 19, 2010 00:04:18
Откуда: Малороссия

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение kaetzchen »

Электронный Блок Управления, коробочка такая, которая там всем управляет...
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение Morroc »

[uquote="dosikus",url="/forum/viewtopic.php?p=3319463#p3319463"]Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.[/uquote]
И я о них же :)) Не чушь. Куда еще отправить ардуинщика как не к другим ардуинщикам ? Там стандартные советы почитать книжки и вполне рабочие варианты "как избавиться от delay()" в точности по теме управления движком.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по Ардуино. Заменить delay() на millis()

Сообщение BOB51 »

[uquote="Nikita.Dorovskikh",url="/forum/viewtopic.php?p=3319208#p3319208"]Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя.
Никак не могу одолеть вопрос таймеров. Как убрать из программы delay?
...
В постоянном цикле loop у меня опрашиваются лампы зарядки(генератора) и давления масла. По ним я определяю статус двигателя запущен или нет.
Так вот мне нужно крутить стартером, пока статус двигателя не изменится на 1 (значит запущен), НО крутить при этом не более 5 секунд! Если посмотрели код, то наверняка заметите как топорно я это организовал через кучу задержек. Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.

Как это можно реализовать при помощи millis()?

И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы![/uquote]

Запомнить исходное значение и периодически сравнивать с получаемым. А новое считанное значение при достижении необходимой разницы использовать как базу для следующего опроса.
Через определенный промежуток времени - допустим после цикла опроса входных данных и/или обязательных управляющих действий.
При соответствующем результате отработать участок за ним закрепленный и/или инкремент/декремент счетчика ожидания соответствующего "процесса в ожидании".
Обычное программирование - как и для других видов МК и компиляторов...
:roll:
Ответить

Вернуться в «Разные вопросы по МК»