Инфракрасный датчик движения PIR и Arduino

Инфракрасный датчик движения позволяет улавливать объект до 6 метров и области обнаружения 70-110 градусов. Основное применение — это включение нагрузки в твоём присутствии. Например включает освещение в помещении. Чаще всего используется в сфере безопасности для сигнализации и оповещения. Для «Умного дома» в самый раз. Датчик движения ардуино очень просто соединяется с контроллером.
Из этой статьи вы узнаете:
Работа инфракрасного датчика движения
Схема подключения датчика c Arduino и… скетч
Приветствую вас, читатели блога! Я изучаю очень много научной литературы, которая касается инженерных систем, автоматизации, мехатроники и робототехники.
И со своей точки зрения, по дилетантски набросал эскиз будущего робота, которого мне бы хотелось собрать в будущем:
Я хочу поделиться с вами своими мыслями, дорогие читатели. Для полного функционирования робота необходимо выполнить следующий ряд работ:
- «Мозги» системы, пока рассматриваю raspberry
- Механическая часть, для меня это тёмный лес
- Силовая часть, Это различные приводы системы. То, что будет толкать, вариантов несколько:
электрика, пневматика, гидравлика - Дополнительные узлы, которые будут независимо управлять той силовой частью, получая сигналы от центрального «мозга»
- А, да, ещё и сервер, который бы кооперировал все действия нескольких «мозгов»
И я прекрасно понимаю, что на это все уйдёт несколько лет.
На одно лишь изучение программирования уйдёт не один год. Есть ли среди вас единомышленники?? Может как-то сделаем совместными усилиями?
Зачем мне это все нужно? Ответ прост, как ясный день — я увлечён этим делом, я кайфую от этой темы.
Я заканчиваю лирическое отступление и возвращаюсь к нашей теме статьи. В этом посте мы с вами обсудим все тонкости подключения PIR датчика с Arduino UNO.
Работа инфракрасного датчика движения
Смысл работы PIR-датчика заключается в том, что он улавливает инфракрасное тепловое излучение. Все из живых существ излучают небольшой уровень радиации. Чем выше температура, тем выше излучение. Но нам не требуется большая температура, смысл в том, чтобы просто уловить присутствие объекта в радиусе 6 метров.
Датчик состоит из двух частей. Если одна половина поймает наибольший уровень излучения, то на выходе даёт единицу (С высоким уровнем сигнала 3В). Датчик с дискретным сигналом.
Внутренности датчика состоят из чувствительного элемента (колбы с прямоугольным кристаллом в центре) и остальных частей схемы (чипы, резисторы, предохранители, конденсаторы).
Рабочее питание данного датчика 5-9 В.
Шильдик имеет при себе три вывода:
GND | — питание |
OUT | дискретный сигнал |
VCC | + 5 В питание |
Схема подключения датчика c Arduino и… скетч
Схема подключения простая. Просто нужно подать питание и воткнуть один вход на любой пин Ардуино.
Смотрите сами:
Программа, в которой при приближении объекта, срабатывает светодиод 13.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #define pirPin 2 #define ledPin 13 void setup() { Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin,OUTPUT); } void loop() { int pirVal = digitalRead(pirPin); //Если обнаружили движение if(pirVal == HIGH) { digitalWrite(LedPin, HIGH); Serial.print("Motion detected"); delay(2000); } else { Serial.print("No motion"); digitalWrite(LedPin,LOW); } } |
В более сложном варианте программы требуется калибровка датчика. Рекомендации с даташита.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; //Пауза, после которой движение считается оконченным long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; int pirPin = 2; //вывод подключения PIR датчика int ledPin = 13; //вывод сигнального диода void setup() { Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); //дадим датчику время на калибровку Serial.print("Calibrating"); for(int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { //Если обнаружено движение if(digitalRead(pirPin) == HIGH) { //Если еще не вывели информацию об обнаружении if(lockLow) { lockLow = false; Serial.println("Motion detected"); delay(50); } takeLowTime = true; } //Ели движения нет if(digitalRead(pirPin) == LOW) { //Если время окончания движения еще не записано if(takeLowTime) { lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено if(!lockLow && millis() - lowIn > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; Serial.println("Motion finished"); delay(50); } } } |
Этот скетч будет гарантировать более стабильную и устойчивую работу датчика с Arduino.
В следующей статье я напишу о подключении датчика расстояния HC-SR04. Оставайтесь на связи. Искренне ваш, Гридин Семён.
С уважением, Гридин Семён
30 секунд не многовато для калибровки?
Я по правде говоря, не пробовал ещё. Нет дома датчика такого, поэтому я указал то, что было в одном из примеров. Это экспериментальный скётч. Думаю, что много.
В каких единицах задано время паузы (что такое 5000)? Вроде не секунды. А для калибровки время в секундах. Получается в разных единицах задано время?
Изначально, в любой программной среде время измеряется в миллисекундах. Там ошибка в программе, если в секундах, то будет 30 000 мс.
использовал этот скетч, с небольшими доработками, но возникла проблема, без открытого монитора порта, ничего не запускается. мне нужно что бы эта схема работала без компьютера. подскажите как это поправить, голову уже второй час ломаю
У меня есть желание подключить еще 2 датчика движения. Скажите пожалуйста, что нужно добавить в коде. Спасибо.