Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя. Никак не могу одолеть вопрос таймеров. Как убрать из программы 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, почитал, как и ожидалось чуда не произошло . Ардуионо _изобредатели так же далеки от осознание конечного автомата как до китая раком. Что дальше?
Не думаю что есть варианты Читать и пробовать до полного просветления
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Мне? Уважаемый, мне чужие г.скетчи для осознания и на не вперлись. Я говорю о тех кому вы советуете чушь.
И я о них же Не чушь. Куда еще отправить ардуинщика как не к другим ардуинщикам ? Там стандартные советы почитать книжки и вполне рабочие варианты "как избавиться от delay()" в точности по теме управления движком.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Здравствуйте! Совсем недавно столкнулся с Ардуино. Пытаюсь собрать автозапуск двигателя. Никак не могу одолеть вопрос таймеров. Как убрать из программы delay? ... В постоянном цикле loop у меня опрашиваются лампы зарядки(генератора) и давления масла. По ним я определяю статус двигателя запущен или нет. Так вот мне нужно крутить стартером, пока статус двигателя не изменится на 1 (значит запущен), НО крутить при этом не более 5 секунд! Если посмотрели код, то наверняка заметите как топорно я это организовал через кучу задержек. Боюсь, что во время этих задержек контроллер вообще не будет получать никаких данных с ламп и будут глюки при определении запущен двигатель или нет.
Как это можно реализовать при помощи millis()?
И еще дополнительный вопрос, как можно сделать несколько таймеров на основе millis() в одном скетче? Толковых примеров не встречал, а методом тыка получается какая-то белиберда. Заранее спасибо вам за ответы!
Запомнить исходное значение и периодически сравнивать с получаемым. А новое считанное значение при достижении необходимой разницы использовать как базу для следующего опроса. Через определенный промежуток времени - допустим после цикла опроса входных данных и/или обязательных управляющих действий. При соответствующем результате отработать участок за ним закрепленный и/или инкремент/декремент счетчика ожидания соответствующего "процесса в ожидании". Обычное программирование - как и для других видов МК и компиляторов...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения