Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя. Никак не могу одолеть вопрос таймеров. Как убрать из программы 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() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!
Никак не могу одолеть вопрос таймеров. Как убрать из программы delay? В Гугле ищется лишь как мигать светодиодом без delay, но это совсем не то, что нужно.
Это то самое если добавить еще светодиод и управление ими с помощью кнопок, а так слишком просто вышло.
Полистайте эту тему http://arduino.ru/forum/obshchii/pomogite-uiti-ot-delay (посты 28 31 59 ну и другие примеры без delay) и почитайте про конечные автоматы. Замена - неправильное слово, заменить нельзя, нужно переделывать программу.
Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.
Как это можно реализовать при помощи millis()?
И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!
Ваш код должен постоянно выполнять непрерывный цикл и в определенные моменты времени (определяются millis() и текущим состоянием системы - что включено, когда, запущен двигатель или нет) выполнять определенное действие, запоминать что выполнили (если требуется соблюсти последовательность действий) и дальше по кругу. Этакое псевдопараллельное выполнение. Думаю в книжке по конечным автоматам толковее написано.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Morroc, почитал, как и ожидалось чуда не произошло . Ардуионо _изобредатели так же далеки от осознание конечного автомата как до китая раком. Что дальше?
Не думаю что есть варианты Читать и пробовать до полного просветления
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.
И я о них же Не чушь. Куда еще отправить ардуинщика как не к другим ардуинщикам ? Там стандартные советы почитать книжки и вполне рабочие варианты "как избавиться от delay()" в точности по теме управления движком.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя. Никак не могу одолеть вопрос таймеров. Как убрать из программы delay? ... В постоянном цикле loop у меня опрашиваются лампы зарядки(генератора) и давления масла. По ним я определяю статус двигателя запущен или нет. Так вот мне нужно крутить стартером, пока статус двигателя не изменится на 1 (значит запущен), НО крутить при этом не более 5 секунд! Если посмотрели код, то наверняка заметите как топорно я это организовал через кучу задержек. Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.
Как это можно реализовать при помощи millis()?
И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!
Запомнить исходное значение и периодически сравнивать с получаемым. А новое считанное значение при достижении необходимой разницы использовать как базу для следующего опроса. Через определенный промежуток времени - допустим после цикла опроса входных данных и/или обязательных управляющих действий. При соответствующем результате отработать участок за ним закрепленный и/или инкремент/декремент счетчика ожидания соответствующего "процесса в ожидании". Обычное программирование - как и для других видов МК и компиляторов...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения