Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Ср фев 28, 2018 19:53:52

Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя.
Никак не могу одолеть вопрос таймеров. Как убрать из программы 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() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!

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

Ср фев 28, 2018 20:57:28

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

Это то самое если добавить еще светодиод и управление ими с помощью кнопок, а так слишком просто вышло.

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

Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.

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

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

Ваш код должен постоянно выполнять непрерывный цикл и в определенные моменты времени (определяются millis() и текущим состоянием системы - что включено, когда, запущен двигатель или нет) выполнять определенное действие, запоминать что выполнили (если требуется соблюсти последовательность действий) и дальше по кругу. Этакое псевдопараллельное выполнение. Думаю в книжке по конечным автоматам толковее написано.

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

Ср фев 28, 2018 21:20:05

Morroc, почитал, как и ожидалось чуда не произошло . Ардуионо _изобредатели так же далеки от осознание конечного автомата как до китая раком.
Что дальше?

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

Ср фев 28, 2018 21:41:28

Не думаю что есть варианты :) Читать и пробовать до полного просветления :)

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

Чт мар 01, 2018 06:09:00

Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.

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

Чт мар 01, 2018 06:18:09

Я вот не пойму..Вы, что ЭБУ вообще выкинули из тачки?

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

Чт мар 01, 2018 08:56:37

Я вот не пойму..Вы, что ЭБУ вообще выкинули из тачки?

Это Вы к чему? :)

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

Чт мар 01, 2018 11:10:00

Электронный Блок Управления, коробочка такая, которая там всем управляет...

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

Чт мар 01, 2018 11:13:51

Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.

И я о них же :)) Не чушь. Куда еще отправить ардуинщика как не к другим ардуинщикам ? Там стандартные советы почитать книжки и вполне рабочие варианты "как избавиться от delay()" в точности по теме управления движком.

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

Чт мар 01, 2018 12:23:27

Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя.
Никак не могу одолеть вопрос таймеров. Как убрать из программы delay?
...
В постоянном цикле loop у меня опрашиваются лампы зарядки(генератора) и давления масла. По ним я определяю статус двигателя запущен или нет.
Так вот мне нужно крутить стартером, пока статус двигателя не изменится на 1 (значит запущен), НО крутить при этом не более 5 секунд! Если посмотрели код, то наверняка заметите как топорно я это организовал через кучу задержек. Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.

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

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


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