СОДЕРЖАНИЕ ►
Рассмотрим, как подключить PIR sensor к Ардуино (пироэлектрический инфракрасный датчик движения) и рассмотрим скетч для автоматического светильника, который будет включаться при обнаружении движения в комнате. Также рассмотрим функцию millis Arduino в языке C++, которую часто требуется использовать в программах (скетчах) для создания многозадачности микроконтроллера Ардуино Уно.
PIR датчик движения Ардуино: характеристики
Сегодня уже никто не удивляется при автоматическом включении освещения в подъездах многоквартирных домов, которые срабатывают при прохождении человека. В большинстве приборов установлены пассивные датчики движения (PIR). Рассмотрим в этой статье устройство датчика движения, схему его подключения к Arduino UNO и соберем на его основе автоматический включатель освещения.

Модуль с ПИР датчиком состоит из пироэлектрического элемента под пластиковой линзой Френеля — цилиндрическая деталь с прямоугольным кристаллом в центре, который улавливает уровень инфракрасного излучения и пропускает его через себя. При подключении IR к Arduino мы уже выяснили, что все предметы имеют инфракрасное излучение и чем выше температура, тем интенсивнее излучение.

PIR датчики движения практически одинаковы по устройству. Диапазон чувствительности PIR сенсоров для Ардуино до 6 метров, угол обзора 110° x 70°. Питание — 5 Вольт, а выходной цифровой сигнал имеет значение 0, когда движения нет и значение 1 при наличии движения. Чувствительные элементы устанавливается в герметический корпус, который защищает от влажности и перепадов температур.
Как подключить датчик движения к Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- PIR датчик движения HC-SR501;
- беспаечная макетная плата;
- 1 светодиод и резистор 220 Ом;
- провода «папа-папа», «папа-мама».

Распиновка датчиков движения Ардуино у разных производителей может отличаться, но рядом с контактами есть надписи (см. фото выше). Поэтому, перед подключением внимательно изучите модуль. Один выход идет к GND, второй к питанию 5 Вольт (VCC), а третий выход (OUT) выдает цифровой сигнал с PIR сенсора. Соберите схему, как на фото выше, подключите светодиод к пину 12 на Ардуино и загрузите следующий скетч.
Скетч для датчика движения Ардуино
#define PIR 2 #define LED 12 void setup() { pinMode(PIR, INPUT); pinMode(LED,OUTPUT); } void loop() { int pirVal = digitalRead(PIR); if (pirVal == HIGH) { digitalWrite(LED, HIGH); delay(2000); } else { digitalWrite(LED,LOW); delay(2000); } }
Пояснения к коду:
- с помощью директивы
#defineдля портов 2 и 12 мы назначили соответствующие имена PIR и LED. Это сделано лишь для нашего удобства; - в условном операторе if использовано двойное равенство:
if (pirVal == HIGH). Согласно языку программирования Ардуино, двойное равенство является оператором сравнения.
Скетч для светильника с PIR датчиком движения
#define LED 3 // назначаем порт для светодиода #define PIR 2 // назначаем порт для PIR sensor unsigned long counttime; // выделение памяти для счетчика void setup() { pinMode(LED, OUTPUT); pinMode(PIR, INPUT); } void loop() { // если есть движение включаем светодиод if (digitalRead(PIR) == HIGH) { digitalWrite(LED, HIGH); } // включаем счетчик на 1 минуту counttime = millis(); // если нет движения и прошла 1 минута if (digitalRead(PIR) == LOW && millis() - counttime > 60000) { // если нет движения в течении 1 минуты выключаем светодиод digitalWrite(LED, LOW); } }
Пояснения к коду:
- с помощью функции
counttime = millis();мы начинаем отсчет времени. И в отличие от функции delay Arduino, которая полностью прерывает программу, микроконтроллер может продолжать остальные вычисления в скетче. - мы изменили время выключения светильника. Если в первом скетче светодиод выключался сразу после сигнала LOW с датчика. То сейчас мы даем 1 минуту до выключения светильника, на случай если человек не вышел из комнаты.
Заключение. HC-SR501 датчик движения Ардуино позволяет сделать автоматическое включение освещения в комнате или создать «умную» подсветку лестницу в доме с помощью адресной ленты ws2812b. В комментариях к этой записи вы можете оставлять вопросы или свои замечания по представленной теме, на все комментарии наших постоянных пользователей мы стараемся ответить максимально быстро.










Светильник не будет выключаться
Поправил скетч, проверьте.
Пока поправлял ваш скетч считай новый написал, да и сам вспоминал минут 40 что к чему, но мне полезно, как раз проэктик родился)
#define LED 13 // порт для светодиода#define PIR 2 // порт для PIR sensor
int state = 0; // нужен для запоминания состояния
unsigned long counttime; // выделение памяти для счетчика
void setup() {
pinMode(LED, OUTPUT);
pinMode(PIR, INPUT);
Serial.begin(9600);
}
void loop() {
// если есть движение включаем светодиод
if (digitalRead(PIR) == HIGH) {
digitalWrite(LED, HIGH);
Serial.println("Есть человек");
state = 1; // разовое изменение состояния за цикл
Serial.println(state);
}
// запускаем таймер
if (digitalRead(PIR) == LOW && state == 1) {
counttime = millis();
Serial.println("Движения нет, догорает свет");
Serial.println(counttime);
state = 0; // сбрасываем состояние, если ничего не изменится,
delay(200);// счетчик будет доделывать свое задание
}
// если нет движения и прошло 15 секунд
if (millis() - counttime >= 15000) {
Serial.println("ТЕМНОТА");
digitalWrite(LED, LOW);
}
} code>
Спасибо. Кому-то обязательно пригодится
Перелопачивал Ваш пример часа 2, то ошибки, то не правильная работа, почему не проверили код перед тем как его публиковать? State = 0 должно быть рядом с выключением лампочки, иначе условие с таймером не будет выполнено никогда. Про &, > вообще не понял что это и откуда.
P.s. Надеялся взять рабочий код и подправить под себя, в итоге пришлось вникать в работу всех команд и процессов. За это конечно спасибо, теперь я в этом немного шарю, но всё таки выкладывать не проверенные коды не хорошо.
Написал вот такую программу для 2 лампочек 12в. Не срабатывает вкл разных этажей(2). В чем причина подскажите пожалуйста?
Разберитесь с фигурными скобками в void loop
Возможно ли как то проверить датчик на работоспособность к примеру, не залило ли водой, или отрезали провода, есть ли возможность как то проверять работает ли датчик?