Подключение сторонних датчиков
- Войдите на сайт для отправки комментариев
Вс, 14/10/2018 - 12:50
Приветствую!
Прикрутил 2 датчика HC-RS501 к разным пинам UNO, для минимизации ложного страбатывания, прописал код
...........
void loop()
{
if ( (digitalRead(SensorPIR1_PIN)==LOW)||(digitalRead(SensorPIR2_PIN)==LOW))
{
Serial.println("Никого нет");
delay(2000);
}
....... .//прочий коД
}
Все было вроде хорошо, до поры до времени, пока оба датчика на следующий день не стали возвращать HIGH (ну или единицу), даже если движения не было и в помине. Поковырял железки и понял, что проблема именно с этими датчиками, их "заклинило" они постоянно отдают HIGH..
Вопрос в слудующем :
Возможно тли прикрутить обычный датчик объема, отдельно запитать его, а сигнал измерять через digitalRead
датчики уж слишком не надежные,
Прикрутить-то можно всё, что угодно, но не думаю, что дело в датчиках. Скороее проблема в их подключении и в прошивке. Ни то, ни другое Вы нам не показали.
Прикрутить-то можно всё, что угодно, но не думаю, что дело в датчиках. Скороее проблема в их подключении и в прошивке. Ни то, ни другое Вы нам не показали.
Собственно код ниже привден....
смотрю сейчас в сторону датчиков движения, у которых сила выходного тока до 5V ..... есть еще идея - понизить напряжение, если выше 5, дабы ардуину не спалить, а после через АЦП........
Что посоветуете?
// Visual Micro is in vMicro>General>Tutorial Mode // /* Name: WC_CAT.ino Created: 30.09.2018 11:11:48 Author: DESKTOP-D74HPNT\Awesome-T_NB */ // Define User Types below here or use a .h file // #define PIRSensor1_PIN 11 // ПИН для 1го датчика #define PIRSensor2_PIN 10 // ПИН для 2го датчика #define Pump_PIN 5 // ПИН для Помпы #define RotorMotion_PIN 6 // ПИН для Роторного двигателя, приводящего в движение ленту #define ServioMotor_PIN 7 // ПИН сервопривода для #define WaterLevelSensor_PIN 8 // ПИН попловка датчик уровня воды #define WaterStoper_PIN 9 // ПИН электроклапана для подачи воды в бак #define AirIonizer_PIN 4 // ПИН для реле - ионизатора int calibrationTime = 3000; //Время калибровки датчика (10-60 сек. по даташиту) int TimeToAirIonizerIsOn = 240000; // 5 мин время работы AirIonizer_PIN // The setup() function runs once each time the micro-controller starts void setup() { Serial.begin(9600); pinMode(PIRSensor1_PIN, INPUT); //Настроим ПИН для даткика объема1 ка ВХОД pinMode(PIRSensor2_PIN, INPUT); //Настроим ПИН для даткика объема2 ка ВХОД pinMode(Pump_PIN, OUTPUT); //Настроим ПИН реле для Помпы как ВЫХОД pinMode(RotorMotion_PIN, OUTPUT); //Настроим ПИН реле для ротора как ВЫХОД pinMode(ServioMotor_PIN, OUTPUT); //Настроим ПИН реле для Сервопривода как ВЫХОД pinMode(WaterLevelSensor_PIN, INPUT_PULLUP); //Настраиваем ПИН датчика уровня воды pinMode(WaterStoper_PIN, OUTPUT); // реле для клапана в режим ВЫХОД pinMode(AirIonizer_PIN, OUTPUT); //Настроим ПИН реле для ионизатора } void loop() { int ReadPIRSensor1= digitalRead(PIRSensor1_PIN); int ReadPIRSensor2 =digitalRead(PIRSensor2_PIN); int TwoPIRSensers = ReadPIRSensor1 + ReadPIRSensor2; int TimeToWaiting = 30000; // переменная для хианения периода опроса -30 сек int TimeToCleaning = 45000; while ((ReadPIRSensor1 == LOW)||(ReadPIRSensor2 == LOW)); { Serial.println("Ждем появление объекта"); //абсолютно бесполезный кусок кода просто для просмотра работы delay(TimeToWaiting); // минутная зажержка } //объект появился, теперь ждем, когда он покинет наблюдаемую зону while ((ReadPIRSensor1 == HIGH) || (ReadPIRSensor2 == HIGH)); { delay(TimeToWaiting); // -30 сек ждем } //выходим из цикла, когда объект покинул наблюдаемую зону if ((ReadPIRSensor1 == LOW) && (ReadPIRSensor2 == LOW))//Проверяем нет ли внутри кошки { digitalWrite(ServioMotor_PIN, HIGH); //закрываем дверь сервопроводом delay(5000); //ждем 5 секунд if ((ReadPIRSensor1 == LOW) || (ReadPIRSensor2 == LOW))//если движения после закрытия двери нет { digitalWrite(RotorMotion_PIN, HIGH); //запускаем роторный двигатель digitalWrite(Pump_PIN, HIGH); //Включаем помпу delay(TimeToCleaning); //цикл длится =TimeToCleaning digitalWrite(RotorMotion_PIN, LOW); //Выключаем роторный двигатель digitalWrite(Pump_PIN, LOW); //Выключаем помпу digitalWrite(ServioMotor_PIN, LOW); //Открываем дверь сервопроводом } else //если движение после 5 секундной задержки БЫЛО - открыть и выпустить животное { digitalWrite(ServioMotor_PIN, LOW); //открываем дверь сервопроводом while ((ReadPIRSensor1 == HIGH) || (ReadPIRSensor2 == HIGH));// Ждем пока оба датчика покажут - 0 { delay(TimeToWaiting); // -30 сек ждем } if ((ReadPIRSensor1 == LOW) || (ReadPIRSensor2 == LOW))//если движения нет { digitalWrite(ServioMotor_PIN, HIGH); //Закрываем дверь сервопроводом digitalWrite(RotorMotion_PIN, HIGH); //запускаем роторный двигатель digitalWrite(Pump_PIN, HIGH); //Включаем помпу delay(TimeToCleaning); //цикл длится =TimeToCleaning digitalWrite(AirIonizer_PIN, HIGH); // Включаем Ионизатор digitalWrite(RotorMotion_PIN, LOW); //Выключаем роторный двигатель digitalWrite(Pump_PIN, LOW); //Выключаем помпу } } } while (!digitalRead(WaterLevelSensor_PIN) == HIGH) // если нет сигнала от датчика уровня воды в резервуаре { digitalWrite(WaterStoper_PIN, HIGH); // открыть кран для пополнения бака } digitalWrite(WaterStoper_PIN, LOW); // Выключаем залив воды в резервуар delay(TimeToAirIonizerIsOn); // Ждем 5 мин digitalWrite(AirIonizer_PIN, LOW); // Выключаем Ионизатор digitalWrite(ServioMotor_PIN, LOW); // Открываем дверь сервопроводом }Поковырял железки и понял, что проблема именно с этими датчиками, их "заклинило" они постоянно отдают HIGH..
Режим работы модуля задается перемычкой . Есть два режима — режим H и режим L.
Режим H — в этом режиме при срабатывании датчика несколько раз подряд на его выходе (на OUT) остается высокий логический уровень.
Режим L — в этом режиме на выходе при каждом срабатывании датчика появляется отдельный импульс
Что посоветуете?
1. Быть внимательнее и аккуратнее. Заявления типа
2. Включить вывод предупреждений компилятора
и внимательно читать о чём он Вас предупреждает.
Тогда Вы смогли бы избежать очевидных ошибок в строках №№ 20 и 41, которых вполне достаточно, чтобы у Вас ничего не работало даже при идеальном всём остальном.
у которых сила выходного тока до 5V
Это как это, а? Не находите фразу странной?
Что посоветуете?
1. Быть внимательнее и аккуратнее. Заявления типа
Конечно, этот цифровой датчик на выходе дает 3.3V....
Однако, так и не понял, возможно ли подключить lдатчик и перед подключением к ардуине понизить до необходимых 3.3 или 5??
2. Включить вывод предупреждений компилятора
и внимательно читать о чём он Вас предупреждает.
Тогда Вы смогли бы избежать очевидных ошибок в строках №№ 20 и 41, которых вполне достаточно, чтобы у Вас ничего не работало даже при идеальном всём остальном.
Спасибо, отладку чере VS проводил и по невнимательности пропустил... спсб!
Увы, нет...
вот простейший код для этого датчика
#define PIR_PIN 11 void setup() { Serial.begin(9600); pinMode(PIR_PIN, INPUT); } void loop() { int X =digitalRead(PIR_PIN); if (X== HIGH) { Serial.println("Motion"); delay(2000); } else { Serial.println("No motionя"); delay(2000); } }Проблема осталась - датчик возвращает 1 при любом исходе...
Хотя на том же коде еще пару дней назад было все ОК.....
1. Быть внимательнее и аккуратнее. Заявления типа
Конечно, этот цифровой датчик на выходе дает 3.3V....
Да, нет, Вы так ничего и не поняли из того, что я пытался сказать.
1. Датчик не "HC-RS501", а "HC-SR501"
2. "сила выходного тока" в вольтах не измеряется.
Это как раз небрежность в выражении своих мыслей. И программирование такой небрежности не прощает.
Однако, так и не понял, возможно ли подключить lдатчик и перед подключением к ардуине понизить до необходимых 3.3 или 5??
Я же Вам писал, что
Прикрутить-то можно всё, что угодно
чего Вы тут не поняли? Только проблема у Вас не в датчике. Чтобы что-то подключать, нужно сначала перестать измерять ток в вольтах.
На просторе интернета, наткнулся вот на такой датчик, если верить описанию - это как раз датчик присутствия
https://www.sparkfun.com/products/14349
Кто то может использовал уже такое, или может дать наводку, на датчики присуствия?
Заранее благодярен)
Awesome_T - кончайте фигней страдать. Или страдайте ей молча, не отвлекая форум :)
Ваши проблемы явно растут не из плохих датчиков, поэтому покупать другой вам смысла нет.
Ну, во-первых, по поводу Вашего "простейшего" кода. Вы бы посмотрели что он реально возвращает. Если нет осциллографа, то хотя бы analogRead используйте и посмотрите. Кроме того, Вы его даташит читали? Он может до 200 сек. помнить, что что-то видел и возвращать 1,хотя всё ужедавно исчезло.
А Ваш вопрос про датчик - ну Вы хотя бы как-то задачу обозначили. Вы же не написали ни расстояние обнаружения, ни возможность наличия препятствий, ни режима освещеённости места установки - ничего. И как Вам советовать что-то?
По мне так лучше бырать не инфракрасный, а микроволновый - ему и стенки пофиг и посторонние теполвые засветки. Например 1 или 2
Ну собственно, форму - это место для обсуждения=)
К тому же, я указал что после получения оба работали норм, сейчас возвращают 1 даже если движения нет....
Вы проверили что он реально выдаёт, как я Вамговорил? Если нет, то это не осбуждение, а трата времени. Если проверили - давайте результат сюда.
А Ваш вопрос про датчик - ну Вы хотя бы как-то задачу обозначили. Вы же не написали ни расстояние обнаружения, ни возможность наличия препятствий, ни режима освещеённости места установки - ничего. И как Вам советовать что-то?
Евгений, спасибо за ответ
Теперь о сути проблемы и зачем все это......
Хочу автоматизировать процесс уборки за своими 4хлапыми ... за кошками )))
Датчик объема нужен для обнаружения кошки внутри закрытого кошачьего туалета.
высота - 40 см длинна 50 см глубина 70см, итого общий объем 0,14м^3
внутри освещения нет, датчик ультразвуковой, наврятли подойдет, поскольку влажность может до 70% подниматься....
у датчика PIR плата под корпусом спрятать можно и обработать специальным спреем, для защиты от влаги
как то так....
с чего не применяете пассивный инфракрасный детектор с сертификатом? Хорошо работает, ошибка нет.
Ну, во-первых, по поводу Вашего "простейшего" кода. Вы бы посмотрели что он реально возвращает. Если нет осциллографа, то хотя бы analogRead используйте и посмотрите.
#define PIR_PIN A2 void setup() { Serial.begin(9600); } void loop() { int X = analogRead(PIR_PIN); Serial.println(X); }Вот что выдает
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
18:10:48.458 -> 665
665 шагов в среднем... если каждый шаг = 0.0049 Вольт, то напряжение 3.258 Вольта
поскольку на выходы при получении сигнала датчик выдает или практически 3.3 - это то же что и было при подключении через цифровой выход...... опять HIGH\1\3.3v
и это при том, что движения около него нет!(((((
Кроме того, Вы его даташит читали? Он может до 200 сек. помнить, что что-то видел и возвращать 1,хотя всё ужедавно исчезло.
Спсб, а можно ссылку?)
Спсб, а можно ссылку?)
https://www.mpja.com/download/31227sc.pdf - там написано и про режимы работы, и про всё остальное ;)
Перед сном, еще раз подключил, и решил опять покрутить настройки потенциометров... и о чудо...
ЗАРАБОТАЛО!!!
Я перед этим мотрел в монитор порта и в очередной раз крутил потенциометры.... по ощущениях - все сделано крайне ....... не надежно, но главное заработало))
если движения нет - 0, проводишь около датчика - 665!!
однако работает только на порте для аналогового сигнала, однако, при подключении к цифровому - опять 1!!!
Как думаете. в чем может быть проблема?
И что посоветуете на замену этим датчикам, за которые отдал аж целый 1 USD ))))
Так не бывает. Как именно Вы подключаете к цифровому? Как его конфигурируете?
Я бы ещё понял, что всегда 0, т.к. для надёжной 1 нужно 717, а у Вас только 665. Но всегда 1 - тут ошибка или подключения или конфигурации - Показывайте и то и другое.
Скетч фстудию! Порты походу неверно сконфигурированы. Да и схему включения бы глянуть, мож чего там нехорошо.
P.S. А про силу тока в 5 вольт я уж тихо промолчал. Тут летом мне показали тесты ЕГЭ по физике, так у меня волосы во всех местах зашевелились от формулировок. Такими темпами силу тока скоро будем километрами измерять.
#define PIR_X_PIN A5 #define PIR_Y_PIN 2 void setup() { Serial.begin(9600); pinMode(PIR_Y_PIN, INPUT); } void loop() { int X = analogRead(PIR_X_PIN); Serial.print("Analog data= "); Serial.println(X); delay(1000); int Y = digitalRead(PIR_Y_PIN); Serial.print("Digital daata= "); Serial.println(Y); delay(1000); }и вот что сейчас выдает:
Digital daata= 1
Analog data= 669
Digital daata= 1
Analog data= 668
Digital daata= 1
Analog data= 669
Digital daata= 1
Analog data= 669
Digital daata= 1
ходя должен возвращать нули от обоих датчиков(
немного 0 появляется только после корректировки чувствительности, но даже когда уменьшил ее, после переподключения - такая же история(
Датчики подключены к шилду и от него же запитаны, естественно запитаны
analogRead() с одного, digitalRead() c другого... Вы с одним датчиком для начала разберитесь.
Ну, значит надо смотреть на подключение (и на шилд, если надо).
Скетч фстудию! Порты походу неверно сконфигурированы. Да и схему включения бы глянуть, мож чего там нехорошо.
Схема - тут всего же 3 компонента (Ардуино, Шилд и датчик) при этом, сам подключаю только датчик, но там ошибиться невозможно) - шилд впорядке, проверял
P.S. А про силу тока в 5 вольт я уж тихо промолчал.
И на этом спосибо, но, самому стыдно,...... хотя если лет 15 не сталкивался с електрикой - все что знал - забыл)))
Ну, если всё в порядке и не работает - надо вызывать попа и освящать. Какие ещё варианты?
Вообще, как мне помнится, этом датчику не нужна ардуина для работы. Питание ему подал и мультиметром меряй что на выходе.
Перед сном, еще раз подключил, и решил опять покрутить настройки потенциометров... и о чудо...
ЗАРАБОТАЛО!!!
Я перед этим мотрел в монитор порта и в очередной раз крутил потенциометры.... по ощущениях - все сделано крайне ....... не надежно, но главное заработало))
если движения нет - 0, проводишь около датчика - 665!!
однако работает только на порте для аналогового сигнала, однако, при подключении к цифровому - опять 1!!!
#define PIR_Y_PIN 2 void setup() { Serial.begin(9600); pinMode(PIR_Y_PIN, INPUT); } void loop() { int X = analogRead(PIR_X_PIN); Serial.print("Analog data= "); Serial.println(X); delay(1000); int Y = digitalRead(PIR_Y_PIN); Serial.print("Digital daata= "); Serial.println(Y); delay(1000); }и вот что сейчас выдает:
Digital daata= 1
Analog data= 669
Digital daata= 1
Analog data= 668
Digital daata= 1
Analog data= 669
Digital daata= 1
Analog data= 669
Digital daata= 1
ходя должен возвращать нули от обоих датчиков(
немного 0 появляется только после корректировки чувствительности, но даже когда уменьшил ее, после переподключения - такая же история(
Датчики подключены к шилду и от него же запитаны, естественно запитаны
Схема - тут всего же 3 компонента (Ардуино, Шилд и датчик) при этом, сам подключаю только датчик, но там ошибиться невозможно) - шилд впорядке, проверял
Проверьте сперва датчик напрямую светодиодом без МК. И бытует мнение, что к МК их лучше подключать через транзисторный ключ. На аналоговом входе ему делать вообще нечего, он бистабильный.
Схема - тут всего же 3 компонента (Ардуино, Шилд и датчик) при этом, сам подключаю только датчик, но там ошибиться невозможно
Один компонент с двумя ножками можно неправильно подключить тремя различными способами. При увеличении количества ножек количество вариантов неверного подключения растет пропорционально факториалу. Учите комбинаторику!
ну в описании он выдает 3.3, если ни чего не путаю, вот только он должен выдавать их только когда есть движение, а не в статическом положении, тем более когда движения нет в зоне его действия((
Sensor Sheld v5.0, в него включаю, самое забавное, что проблема именно с датчиком.
Как пришел к такому выводу - подцепил попловковый уровень воды, он так же возвращает всего два значения.... - датчик запитывать не нужно, только земля и сигнал......
но сигналы приходят точно...
с его помощью код проверил и циклы переписал.... теперь вроде все работае как надо, вернее в коде проблем нет 100%,
проблема в датчике осталась, сегодня возвращаюсь к нему....
попробую в сетапе дописать, как говорили....
проверил каждый выход: и аналоговые и цифровые - везде 5V, прям как в аптеке
Один компонент с двумя ножками можно неправильно подключить тремя различными способами. При увеличении количества ножек количество вариантов неверного подключения растет пропорционально факториалу. Учите комбинаторику!
маркировка есть, к тому же с прочими датчиками такой проблемы нет......
проверил каждый выход: и аналоговые и цифровые - везде 5V, прям как в аптеке
1. Подключить на него питание.
2. Подключить к выходу OUT датчика осциллоскоп, и посмотреть на сигнал.
Осциллоскоп, имея входное сопротивление в районе 1 Мегаома, практически не будет вносить существенные искажения в сигнал датчика.
При отсутствии оного, делаем то же самое, только вместо осциллоскопа подключаем мультиметр, на диапазон более 3.3 Вольта. И смотрим на его показания при движении и без оного.
На практике, пироэлектрические датчики действительно могут выходить из строя, и показывать "погоду".
Если датчик окажется неработоспособным, то всегда есть вариант подключить типовой "объёмник" для типовой системы охранной сигнализации, там как раз пироэлектрические датчики примняются. Например датчики с сферической диаграммной напрвленности "Астра 7". Правда схема включения и питание будет другим. Можно подобрать и дешевле.
При отсутствии оного, делаем то же самое, только вместо осциллоскопа подключаем мультиметр, на диапазон более 3.3 Вольта. И смотрим на его показания при движении и без оного.
На практике, пироэлектрические датчики действительно могут выходить из строя, и показывать "погоду".
Спасибо за совет! только хотел отписаться что померил выход датчика...3,298v ПОСТОЯННО!!!!
хоть води хоть не води перед ним....
Если датчик окажется неработоспособным, то всегда есть вариант подключить типовой "объёмник" для типовой системы охранной сигнализации, там как раз пироэлектрические датчики примняются. Например датчики с сферической диаграммной напрвленности "Астра 7". Правда схема включения и питание будет другим. Можно подобрать и дешевле.
Благодарен за совет! Меня как раз долгое время мучил вопрос подключения других датчиков, от той же охранной системы, спасибо Евгению, сказал что возможно, и Вам, за наводку..
Что скажете по поводу вот этого заинтересовал, ибо это даичик Присутствия, а не движения...
Вообще, как мне помнится, этом датчику не нужна ардуина для работы. Питание ему подал и мультиметром меряй что на выходе.
Да, есть такая вероятность. С фотореле даже черные мешочки в комплект кладут для проверки. Надел ему пакет на шляпу и он ничего не видит какбэ.
А мне чудится, что экпериментатор или уже резисторы разбил до неконтакта, либо слишком торопится, при подаче питания датчику надо время на выход из коматоза. Если рядом сидеть не дергаясь, то он ничего не почует, чуть шелохнешься - сработает.
То ТС, снимите линзу, датчик прикройте чем-нибудь, подключите вольтметр, подайте питание да погуляйте минут пять. Когда вернетесь, посмотрите вольтметр, откройте датчик и зажигалкой перед ним проведите, изменится что или нет.