Помогите с частью кода: "выключатель освещения счетчик людей в помещении"
- Войдите на сайт для отправки комментариев
Делаю впервые на Ардуино "выключатель освещения - счетчик людей" и к тамуже на ультрозвукавых дальномерах HC-SR04 ни кто раньше на Ардуино ничего подобного не делал.
В общем счетчик выключатель устанавливается в дверном праеме и считает всех входящих и выходящих людей в помещении, когда в помещении будет 0 людей - свет гасит, если больше 0 включает.
Есть два датчика HC-SR04 которые мониторят 2 дистанции от датчика до противостоящей стены.
Светадиоды подключенные к пинам 8 и 9 сигнализируют работу датчиков. Пока я сделал если дистанция меньше 20 см, то считается что датчик сработал, в идеале нужно как то сделать что бы каждому датчику была присвоена переменная, значения для каторой берутся по начальным данным, ОДНАКРАТНО, с датчиков при включении, далее эти значения не изменяются при работе. И затем просто идет сравнение текущих значений с датчиков с значениями с переменных, если меньше этих значений - считается датчик сработал. (как это сделать однакратно я не понял).
А теперь оснавной вопрос, как указать последовательность событий:
Если выполняется сначало событие "А" потом "Б" то прибовляем +1 к переменной counts, если сначало событие "Б" потом "А", то убовляем 1 у переменной counts.
Если counts >0 то зажигаем светадиод на 7 пине, иначе тушим. как то так.
long duration_1, cm1; long duration_2, cm2; long counts; long cm1_1; long cm2_1; int var; void setup() { pinMode(3, OUTPUT);// trig 1 pinMode(6, OUTPUT);// trig 2 pinMode(4, INPUT); // echo 1 pinMode(5, INPUT); // echo 2 pinMode(7, OUTPUT); // реле пин pinMode(8, OUTPUT); // out 1 pinMode(9, OUTPUT); // out 2 } void loop() { digitalWrite(3, LOW); delayMicroseconds(2); digitalWrite(3, HIGH); delayMicroseconds(10); digitalWrite(3, LOW); digitalWrite(7, LOW); Serial.begin(115200); duration_1 = pulseIn (4, HIGH); cm1_1 = duration_1/29/2; Serial.print("out_1: "); Serial.print(cm1_1); Serial.print("cm"); Serial.println (); digitalWrite(6, LOW); delayMicroseconds(2); digitalWrite(6, HIGH); delayMicroseconds(10); digitalWrite(6, LOW); duration_2 = pulseIn (5, HIGH); cm2_1 = duration_2/29/2; Serial.print("out_2: "); Serial.print(cm2_1); Serial.print("cm"); Serial.println (); if(cm1_1 < 20)// 20 - дистанция на каторой срабатывает датчик 20 см и ниже. { cm1 = 1; digitalWrite(8, HIGH); } else { //delay(100); cm1 = 0; digitalWrite(8, LOW); } if(cm2_1 < 20 )// 20 - дистанция на каторой срабатывает датчик 20 см и ниже. { cm2 = 1; digitalWrite(9, HIGH); } else { //delay(100); cm2 = 0; digitalWrite(9, LOW); } /* Здесь нужно дописать код. */ if(counts > 0) { digitalWrite(7, HIGH); } else { digitalWrite(7, LOW); } Serial.println (counts); delay(10); }
Я новичок в Ардуино, так что строго не судите, ни знаю даже С++.
Делаю впервые на Ардуино "выключатель освещения - счетчик людей" и к тамуже на ультрозвукавых дальномерах HC-SR04 ни кто раньше на Ардуино ничего подобного не делал.
Разберётесь с алгоритмом и скетчем - узнаете, почему на HC-SR04 такие устройства никто не делает.
А попробуйте самостоятельно. Вот здесь - http://arduino.ru/forum/proekty/datchik-napravleniya-dvizheniya - готовая реализация алгоритма.
Здесь это ничего не значит, было бы желание и Гугл.
В общем сам решил этих 2 задачи, код работает четко, притензий не имеею к своему коду. :)
Но вот датчики это что то, 1 из их нормально работаеn, чувствительность просто супер, угол абзора чуть ли не 180 градусов, работает на все подрят: на твердые предметы, мягкие предметы (одежда), а вот со вторым беда, он савсем какой то вялый с какой то задержкой срабатывает, на мягкие предменты вообще не реагирут - сигнал угасает в майке и расстояние ввыводит до майки 3,3 км :). И дело точно не в коде, думал что в нем, но местами менял датчики в итоге все тоже менялось.
Вот как можно так делать обсалютно 2 адинаковых датчика но с разными параметрами? На вид оба идентичных, но микросхемы опрационных усилителей различаются производителями, в том где все супер работает LM324, а где хуже - SGM324ys14. Но не думаю что дело в операционниках, ведь отражающий эффект зависить от несущей частоты сомневаюсь, что она различается у обоих датчиков, должна быть 40 кГц.
Подпаялся к трансиверу (хотя хер его знает он ли это может китайцы и папутали местами) проблемного датчика, осцилогрофом и когда датчик выдает показания 3,3 км, на осцилографе исчезают пачки из 8 имульсов частатой 40 кГц, осюда собственно вопрос, а могут ли исчезать импульсы с трансивера при слишком большом расстоянии, разве что на риссивере?
Вот накидал тот же самый проект только на ИК фотоприемнике 1 шт и 2-х ИК - светодиодах находящихся на противоположной стене. Не знаю только заработает или нет.
Вот практически рабочий код счетчика - выключателя на 2-х ИК светадиодах и 1-ом ИК фотоприемнике от систем ДУ работает с несущей частатой 38 кГц.
Многие параметры тут очень критичны, например: delay_PWM_LOW, и delay_PWM_HIGH методом подбора было определено что это самые оптимальные значения.
Так же имеет большое значение номиналы добавочных сопротивлений на ИК светадиоды, у меня 220 ом, подключены ИК светадиоды через транзисторы BC547 на базы сигнал подается через резисторы наминала 680 Ом.
Работает счетчик как то не стабильно, иногда пропускает счет - зависит от скорости прохождения человека. Помогите как то оптимизировать код, что бы стабильно считал.
Я думаю, что погрешность будет и при нормальной работе Ардуины, например проходят одновременно два человека, или с ребенком на руках. Может просто установить датчики движения и отключать освещение при отсутствии движения втечении определенного времени, можно и без ардуино.
Я думаю, что погрешность будет и при нормальной работе Ардуины, например проходят одновременно два человека, или с ребенком на руках. Может просто установить датчики движения и отключать освещение при отсутствии движения втечении определенного времени, можно и без ардуино.
Увы это не тот случай и не тот проект. В данном помещении работают люди и что им постояноо нужно двигатся что бы у их свет был? :)
Ладно этот проэкт видимо обречен. Папробую то же сделать но с 2 -мя ИК фота приемниками.
Все сделал на 2-х Ик фотаприемниках и 1 ИК светадиоде, убрал все delay - работает практически на постоянном токе (не преривно мониторятся 2 ИК луча на наличие пересечений человеком). Работает практически стабильно. Заказал еще дисплэй ТМ1637 для отображения количества.
Оказывается чем проще, тем надежней. :)
Наконец то я его сделал, вот окончательный вариант: https://youtu.be/vbfXED8Dfuk
Поздравляю, Вы упорный человек.
Фраза "Этот проект на Ардуино уникален в своем роде, такого еще никто на Ардуино не делал." - великолепна )).
Поздравляю, Вы упорный человек.
Фраза "Этот проект на Ардуино уникален в своем роде, такого еще никто на Ардуино не делал." - великолепна )).
Ну просто показалось, что мне это по силам и решил пойти до конца. На таких ИК фотоприемниках точно ни кто еще не делал. Есть конечно проекты с точно такими ИК фотоприемниками, но не на Ардуино.