Здравствуйте, помогите пожалуйста разобраться с программированием ардуино, необходимо подключить ультразвуковой сенсор к проекту, но так чтобы сенсор работал постоянно контролируя пространство, и при обнаружении объекта выполнял необходимую мне операцию(прерывая работу программы, но после выполнения, программа продолжала работу), пробовал в прерывании. не получилось. Кто сталкивался с такой проблемой. В интернете куча проектов подключения, но только в основном цикле программы, мне же необходимо что бы основной цикл сам по себе, сенсор сам по себе.
покажите как пробовали, пожалуйста. Код вставляется через теги, в каждой ветке форума есть пример как это сделать.
Спасибо за ответ, если можно то поподробнее "код вставляется через тэги"? мой код-\ // =============================================================== Include "TimerOn.h" Include "Ultrasonic.h" void setup(){ Timer1.initialize(1000000); Timer.attachInterrupt(TimerOn); } void TimerOn() { float dist_cm=ultrasonic.Ranging(CM);} //================================================================== программа действительно прерывается, но только если время не менее 1 сек, если меньше то программа вообще не работает, мне же необходимо что бы ультрасоник мониторил постоянно(параллельно) программе.
Изините, но Вы ошибаетесь, тут дело в том что ультросоник работает по принципу послал сигнал-принял сигнал, прием - передача, для этого он использует два пина выход-вход, и еще что прискорбно, использует delay в прерывании, что не рекомендуют делать. вот этот кусочек скетча"float dist_cm=ultrasonic.Ranging(CM)". Спасибо за ответы. я уже сам частично разобрался, наверно буду использовать второй ардуино.
в чем я ошибаюсь? - в том, что приведенный код ничего не делает? - попробуйте опровергнуть. В коде вы читаете расстояние в переменную, которая нигде после не используется. это не Ультрасоник использует делай в прерывании, а вы. Это же вы засунули Ультрасоник в прерывание, хотя в этом нет никакого смысла. Ультрасонику вообще прерывание не нужно. Минимальный период опроса этого датчика - 50мс, рекомендованный - 100мс, то есть не чаще 10 раз в секунду. Для такого редкого опроса прерывание не нужно совсем, это прекрасно делается прямо в основном цикле программы. И вторая ардуина тут не нужна. Hector - вы если пришли на форум что-то спросить - так спрашивайте, а не стройте из себя знатока, который сам все понимает. Понимали бы - зачем бы вопросы задавали, верно?
Я далеко не знаток, а мой вопрос см. выше. я делаю программу в которой ультрасоник будет мониторить пространство отдельно от программы, при изменении переменной на ультрасонике должна прерваться основной цикл программы и выполнятся другая программа, а потом возвращатся в основной цикл. с прерыванием не получилось, в основном цикле ультрасоник работает только когда до него дойдет очередь.меня это не устраивает.
Так я и спрашиваю Вас Мониторинг это основная программа?Другая программа какая?Или вопрос чисто теоретический?
Я конечно понимаю, что ваш проект сверхсекретный и имеет огромную коммерческую ценность, по этому выложить код нельзя. Но так мы будем долго гадать, чем вам нужно помочь. Будут даны только общие советы. Не возвращается программа из прерывания - ищите где она зависает в обработчике. Там по другому быть не может, дошли до конца функции обработчика и автоматом вернулись. Это не асма. Не работает delae в прерывании - сымитируйте его вручную.
Попробуй ещё раз. Из тех, кто умеет писать программы с прерываниями - никто даже не слышал о том, что здесь есть какая-то проблема. Кто использует? Программу Вы пишете или кто-то другой? Если Вы, то не используйте, Вас ведь никто не заставляет. Ну, так кто ж Вас заставлял писать Ну, и, наконец Достойное решение. Можно ещё и третий. Помните, сколько солдат нужно, чтобы вкрутить лампочку? Этот модуль программируется легко и непринуждённо и практически вовсе не занимает никаких ресурсов. Просто нужно аккуратно расписать прерывания. Но, если Вам нравится городить сеть из 10-ти ардуин - в путь. Только там возникнет точно такая же проблема. Нужно будет, чтобы главная ардуина принимала результат от "датчиковой" и чтобы это не мешало её основной программе. Заметьте, от чего шли, туда и вляпались. И ещё один момент (об этом крайне редко пишут в сети). В таком примитивном использовании этого датчика изначально заложена погрешность аж до 10%. По уму датчик очень точный, но должен использоваться в комбинации с датчиком температуры.
Проблема решается правильным написанием основной программы. Цикл loop() основной программы должен длится не более 100мс, после каждого цикла вызываете работу датчика - вот и получаете контроль расстояния 10 раз в секунду без всяких прерываний. А чаще дергать этот датчик нет смысла - он медленный. Только. скорее всего, для этого придется переписать Ваш "основной код" почти полностью. В программе не должно быть операторов задержки (delay) и длинных блокирующих циклов. Когда освоитесь - будете писать код сразу правильно. В практически любой ардуино программе можно написать работу так, чтобы loop() выполнялся не более 10 миллисекунд
Сразу после подачи импульса на датчик, следующей инструкцией запускаете таймер. В прерывании его останавливаете. В основной программе считаете значение таймера. Все. На работу с датчиком ушло всего 5 инструкций. Значение таймера можете читать хоть тысячу раз в секунду - там всегда актуальное значение.
Как обычно в таких ситуациях есть два пути решения проблемы - программный и аппаратный. Если ТС не может это решить программно, а код упорно показывать не хочет, давайте решать аппаратно. Убираем ультразвуковой дальномер (ну не поддаётся он ТС) и берём HC-SR501, а если хотим отследить зомби с комнатной температурой - PCWL-0516. Там при возникновении движений единичка на выходе висит долго. При любой длительности цикла loop поймать можно.