![]() |
![]() |
#31 |
Junior Member
Регистрация: 14.08.2014
Сообщений: 5
Вес репутации: 0 ![]() |
![]()
Как оказалось, в коде, о котором я писал, присутствует баг. Если проводим рукой туда или обратно, то все нормально. Но если задержались (закрыты оба фоторезистора), то программа начинала прибавлять людей.
Сын обещал исправить в свободное время. Пришлось сесть за учебники и написать свою версию. Код далек от совершенства, простой и деревянный. Программисты отполируют надеюсь. Багов пока не нашел. Давайте искать вместе. Это моя первая прога, не смеяться и сильно не пинать))) Код:
/*==Created by Midway========== ====МЕГА КРУТОЙ ВЫКЛЮЧАТЕЛЬ)))==== */ // Светодиоды пины-выходы int ledOUT1 = 20; //контрольный int ledOUT2 = 21; //контрольный int ledOUT3 = 19; //Как бы освщение в комнате // Фоторезисторы пины-входы int sensorPin1 = A0; int sensorPin2 = A1; // Данные с фоторезисторов int sensorVal1 = 0; int sensorVal2 = 0; // Событие int event; // Количество людей в комнате int humanCount; // Аналоговые входы фоторезисторов буду преобразовывать // в сигналы: либо сработал, либо нет boolean sens1; boolean sens2; // У двух датчиков может быть 4 состояния: (--), (-+), (++), (+-) // Нужно отслеживать предыдущее и текущее состояние int status_curr = 0; int status_prev = 0; // Порог срабатывания фоторезисторов. Подбирается индивидуально int tresh = 700; // Для отладки. Потом можно убрать boolean debug; void setup() { // Режимы светодиодов pinMode(ledOUT1, OUTPUT); pinMode(ledOUT2, OUTPUT); pinMode(ledOUT3, OUTPUT); digitalWrite(ledOUT3, LOW); // Передача Serial.begin(9600); } void loop() { // Для отладки. Потом можно убрать debug = false; // Начальные значения сенсоров sens1 = false; sens2 = false; // Считываем значение с фоторезисторов sensorVal1 = analogRead(sensorPin1); sensorVal2 = analogRead(sensorPin2); // Если фоторезистор сработал, переводим в значение сенсора TRUE if (sensorVal1<tresh) sens1 = true; debug = true; if (sensorVal2<tresh) sens2 = true; debug = true; // Если сработал первый, if (sens1) { //зажигаем первый светодиод digitalWrite(ledOUT1, HIGH); } else digitalWrite(ledOUT1, LOW); // Если второй, if (sens2) { //зажигаем второй светодиод digitalWrite(ledOUT2, HIGH); } else digitalWrite(ledOUT2, LOW); // Состояние сенсоров (фоторезисторов) { // Здесь текущий статус (состояние) фоторезисторов превращается в предыдущий status_prev = status_curr; // Здесь определяется текущий статус (--), (-+), (++), (+-) if (sens1 == false && sens2 == false) status_curr = 0; if (sens1 == true && sens2 == false) status_curr = 1; debug = true; if (sens1 == true && sens2 == true) status_curr = 2; debug = true; if (sens1 == false && sens2 == true) status_curr = 3; debug = true; } // При переходе с предыдущего состояния к текущему (если состояние датчиков //изменилось), в нашем случае может произойти 8 вариантов развития событий. //Нас интересуют события 3 и 7 (остальные так, на всякий...) { if (status_prev == 0 && status_curr == 1) event = 1; if (status_prev == 0 && status_curr == 3) event = 5; if (status_prev == 1 && status_curr == 2) event = 2; if (status_prev == 1 && status_curr == 0) event = 8; if (status_prev == 2 && status_curr == 3) event = 3; if (status_prev == 2 && status_curr == 1) event = 7; if (status_prev == 3 && status_curr == 0) event = 4; if (status_prev == 3 && status_curr == 2) event = 6; // Если текущее состояние не отличается от предыдущего, то никаких событий не произошло if (status_curr == status_prev) return; // Для отладки. Потом можно убрать if (debug) Serial.println ("Previous Status = " + String(status_prev)); if (debug) Serial.println ("Current Status = " + String(status_curr)); if (debug) Serial.println ("Event = " + String(event)); } // Считаем хьюманов... { if (debug) Serial.println ("Human count in room WAS : " +String(humanCount) ); if (event == 3) humanCount++; if (event == 7) humanCount--; humanCount = max(humanCount, 0); if (debug) Serial.println ("Human count in room NOW : " +String(humanCount) ); } // ...и зажигаем { if (humanCount > 0) digitalWrite(ledOUT3, HIGH); else digitalWrite(ledOUT3, LOW); } } |
![]() |
![]() |
![]() |
#32 |
Junior Member
Регистрация: 14.08.2014
Сообщений: 5
Вес репутации: 0 ![]() |
![]()
Сорри, нашел неисправность. Если человек, входя в комнату, остановился в проеме, вспомнив что забыл на кухне чай и уйдет обратно, счетчик вычтет одного человека. Аналогично, выходя из комнаты, в проеме двери вспоминаем, что забыли сигареты, возвращаемся, счетчик прибавляет человека. Выходим, программа думает, что в комнате еще один остался и свет не выключает.
Лечится легко. В разделе "Считаем хьюманов..." в проверке событий вместо 3 и 7, надо соответственно поставить 4 и 8. Код:
// Считаем хьюманов... { if (debug) Serial.println ("Human count in room WAS : " +String(humanCount) ); if (event == 4) humanCount++; if (event == 8) humanCount--; humanCount = max(humanCount, 0); if (debug) Serial.println ("Human count in room NOW : " +String(humanCount) ); } |
![]() |
![]() |
![]() |
#33 |
Junior Member
Регистрация: 14.08.2014
Сообщений: 5
Вес репутации: 0 ![]() |
![]()
В качестве источника света хочу взять 5-вольтовые лазеры Как думаете, подойдет? Жрать поди много будут... если в каждом проеме по 2 шт. поставить.
По совету Admina надо попробовать ИК решение. |
![]() |
![]() |
![]() |
#34 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Нужно не просто луч света посылать, а кодовоимпульсные посылки отправлять, иначе будет срабатывать на помехи
|
![]() |
![]() |
![]() |
#35 |
Junior Member
Регистрация: 25.09.2014
Сообщений: 2
Вес репутации: 0 ![]() |
![]()
Я сейчас занимаюсь продажей продукции белоруской фирмы Ноолайт. Не все еще оттестировал сам, но если по теме, то есть у них в линейке беспроводной датчик движения.
PM111 является ТЕПЛОВЫМ датчиком движения, предназначенным для работы в составе системы nooLite. При появлении движущихся объектов с температурой выше окружающей среды в зоне действия датчика он подает по радиоканалу команду включения на силовой блок, к которому привязан. По прошествии заданного времени после прекращения движения в зоне действия датчика он подает команду выключения. Кроме того, датчик PM111 снабжен фотосенсором для измерения освещенности, что позволяет исключить срабатывание датчика в светлое время суток. Чувствительность теплового сенсора, порог освещенности и время включения света после прекращения движения регулируются. Возможно регистрация именно по тепловому излучению будет более чувствительна. Сейчас его тестирую сам. |
![]() |
![]() |
![]() |
#36 |
Junior Member
Регистрация: 08.10.2015
Сообщений: 5
Вес репутации: 0 ![]() |
![]()
Привет всем. Купили 5 датчиков движения, сегодня больше чем пол дня ставили... увешали ими двор...
срабатывают чётко... отрегулировали, все как положено - выставили время, "темноту"... зашли в дом, а свет периодически включается... начали выяснять... Итог - датчик движения срабатывает на собак и котов...Регулировки чувствительности нет... Из живности которая теперь может включать свет - 3 собаки, 2 кота... Короче столько потерять времени и сделать свет во дворе для котов и собак как бы не айс... Как отрегулировать? У кого была такая проблема? |
![]() |
![]() |
![]() |
#37 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Нужно было датчики брать которые не срабатывают на дом.животных
У них линзы не фокусируют излучение ниже одного метра |
![]() |
![]() |
![]() |
#38 |
Junior Member
Регистрация: 28.10.2015
Сообщений: 1
Вес репутации: 0 ![]() |
![]()
Да нормально. Руками помахать лень что-ли. С утра зарядочка, самое-то )
|
![]() |
![]() |
![]() |
#39 | |
Junior Member
Регистрация: 27.01.2016
Сообщений: 1
Вес репутации: 0 ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#40 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Датчик движения с защитой от животных
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|