количество человек или время срабатывания двух датчиков
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Извеняюсь за старую тему... гуглил, чтото ничего путящего не нашел..
Имеется два датчика - PIR Sensor HC-SR501 и ультрасоник HC-SR04. Пытался делать включение света по срабатыванию этих датчиков. По отдельности все работает, конечно есть свои минусы для обеих датчиков(сонар могу установить только в дверной проем и срабатывание только на пересечение, установить напротив дверей и измерять приближение или удаление от сонара не имею возможности), пир сенсор работает, но когда к примеру находишся к нему спиной и двигаются только руки(клавиатура к примеру) пир уже не срабатывает и свет отключается...
хочу поставить и ультрасоник и PIR сенсор, подсчет количества людей - i=i+1 и i=i-1, соответственно - если i>0 свет горит.
На вход человек сначала пересекает сонар, а потом попадает в зону действия PIR, на выход соответственно наоборот. Как програмно просчитать время срабатывание этих датчиков? нашел код котрый может подойти под мои нужды. Человек делал под измерение скорости пули :)
/*Хронометр Формат вывода: например 56,7 соответственно не может измерять больше 100м/с */ volatile unsigned long Time1=0; //Время срабатывания первого датчика volatile unsigned long Time2=0; //Время срабатывания второго long value = 0; //время пролета пули между датчиками boolean flag=false; void setup(){ Serial.begin(9600); attachInterrupt(0, Start, RISING); //Прерывание по нарастающему фронту на D0 attachInterrupt(1, End, RISING); //Прерывание по нарастающему фронту на D1 } void loop(){ if (flag==true){ value = (Time2-Time1); //вычисляем задержку value = 7000000/value; //вычисляем скорость для расстояния между датчиками 5см Serial.print(Time2-Time1); Serial.print(" "); Serial.print(value/10); Serial.print(","); Serial.println(value%10); delay(1000); flag=false; } } void Start(){ Time1=micros(); } void End(){ Time2=micros(); flag=true; }
ветка этого форума вот http://arduino.ru/forum/proekty/khronograf-izmeritel-skorosti-puli-ot-pr....
Страшные слова - прерывания...... и человек там указывал, что два датчика подключены к выводам 2и3, а в коде не понятно- где подключение...
Подскажите пожалуйсто как измерить время срабатывания сонара и pir когда они работают в паре?
спасибо
имел ввиду - как просчитать, какой датчик первый сработал?
да в коде неточность в комментариях. там надо не D0 а 0 прерывание. но не суть D2 и D3 подключение
но прерывания подойдут только для pir датчика, для ультразвукового нужно ведь посылать сигнал, потом получать эхо и измерять расстояние.
сигнал пересечения лучше лазерный. головки на ебее дешевые. в качестве приемник фототранзистор, только надо смотреть по рабочей длине волны
вешаете оба дачтика на прерывания и обрабатываете
если отстановится на вашем случае ввести например 2 флага. один для пира, другой для дальномера. в случае срабатывания записать флаг. время думаю необязательно. врядли вам нужно человек бежал или еле шел. хотя для определения направления может пригодится. да и отсеять ложные срабатывания
ну и основная программа анализирует флаги. обрабатывает и обнуляет флаги, чтобы система работала дальше
Здравствуйте.
А вы не могли бы прояснить про флаги...про boolean....в чем разница между boolean и другой переменной?
почему я не могу присвоить состояние пресловутой LED к примеру переменной status, а не boolean( для boolean true или false, а для status к примеру 1 и 0)?
я сваял себе небольшую систему управления светом в трех помещениях, делал на millis, т.к необходимо одновременное выполнение трех задач( свет- коридор, ванная, кухня). в каждом помещении ставил по одному сонару HC-SR04. По задумке - коридор свет горит 1 минута, потом отключается, в ванной и кухне по пересечению сонара- вкл/откл. все это делал просто для интереса, и для расширения кругозора...интерестно....вообщем вся система работает, но ожидаемо, там где просто на пересечение сонаров - это как бы просто пример отработки сонара...вот и хочу на кухню сделать сонар + PIR.
можно сделать к примеру - пересечение сонара и если потом отрабатывает PIR- это + 1 человек, если наоборот - -1, но PIR может отрабатывать постоянно и килдык.......и т.д.
где то читал, что не рекомендуется использовать boolean и millis вместе.
не могли бы вы подсказать как добавить boolean в нижестоящий код? не надо готовых решений, мне бы направление куда копать(желательно в моем направлении) ну и какой нибудь пример с пояснением.
вот код для помещения куда хочу добавить PIR сенсор.
А вы не могли бы прояснить про флаги...про boolean....в чем разница между boolean и другой переменной?
почему я не могу присвоить состояние пресловутой LED к примеру переменной status, а не boolean( для boolean true или false, а для status к примеру 1 и 0)?
У boolean может быть всего два значения - true или false (или 1 и 0, это одно и то же, используй как тебе удобнее).
У int может быть 65535 значений, но если тебе функционально нужно только два состояния, зачем использовать int и держать в памяти место для остальных 65533? :)
Но, на мой взгляд, у тебя два куска кода делают одно и то же, но с обратным значением, поэтому можно их объединить:
Но тут могут быть подводные камни, ибо всего кода узреть не удалось. К примеру, в твоем коде чтобы выключить свет, надо тоже подходить к (мимо) датчику(а) - это так задумано?.
Вот весь код, переделал по вашей рекомендации:
Код работает. Конечно идеально работает только в Коридоре, т.к здесь просто по задержки времени, а в остальных двух помещениях бывают сбои(т.к свет отрабатывает по пересечению луча сонара, два человека вошли один за другим- свет включился, один вышел- погас...).
Смущает объявление вот этой переменной
Помоему это лишнее, или неправильно. Где то вычитал, что объявление необходимо, чтобы не было переполнений в переменных сонара.
Я так понимаю для подсчета количества людей надо использовать три датчика(один сонар и два PIR сенсора, сонар должен быть расположен между двумя PIR сенсорами...
Набросал код для подсчета количества людей сонаром(сонар стоит напротив дверного проема), Код работает, но как то неправильно....:
Код как бы слишком быстро работает(ну или я слишком медленно хожу) :), слишком быстро снимаются показания сонара. Может что нибудь посоветуете?
Или как можно связать воедино - время нахождения человека в луче сонара и длину массива? Не хочу гуглить и искать готовое решение, хочу сам доделать... спасибо
наверное, 10 мс слишком мало, сколько см человек успеет пройти за 240 мс?
И в описании ультрасоников есть фраза "Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Рекомендованный период между импульсами должен быть не менее 50 мс.", а у тебя 10 мс.
то есть, скажем, что человеку на вход/выход из помещения требуется около 1 секунды - необходимо 20 заполнений массива с периодом 50мс...ну или там +- поэксперементировать...А если произойдет такое - измерит не 20 раз, а меньше(к примеру 15 раз). недостающие пять измерений приравняюся к нулю? да, и получается, что необходимо обнулять массив в определенном месте(если измерит 15 раз вместо 20, пять неизмеренных значений будут иметь предыдущее значение...).
Еще вопрос - как можно в массиве выявить минимальное и максимальное значение и соответсвенно узнать местоположение минумама и максимами? можно использовать операторы min и max? min(massiv[20])? или только цикл и оператор if?
имел ввиду - как просчитать, какой датчик первый сработал?
А если поставить в двери рядом два приёмника, как на мышке, то можно будет определять в какую сторону прошел человек. И считать их. И всё это до боли напоминает работу энкодера
нет больше определитель в какую сторону прошел человек)))
2 лазерных модуля с приемниками больше бы облегчили изначально задачу и программирование
не - турникет нужно ставить.
ага. с карточками rfid. забыл карточку не попал в туалет. и тут только зайцем. а вдруг контролер))))
Доброго времени суток.
Доделал код на подсчет количества людей, сделан на двух сонарах.
Сонары расположены один за другим на расстоянии друг от друга около метра.
Высота от пола 1,2 метра. Может посмотрите код, подскажите пожалуйсто какие есть недочеты или косяки.
вот код на подсчет количества людей
вот весь код, на три помещения. в одном помещении срабатывание по PIR sensor, во втором по пересечению сонара и в третьем на подсчет людей.
Спасибо