Датчик движения PIR HC-SR501 и Arduino: схема подключения и скетч
PIR-датчик не светит и не пищит — он молча смотрит на инфракрасное излучение вокруг себя. Белый мутный купол собирает тепло с разных направлений на чувствительный элемент, и когда тёплое тело перемещается из одной зоны в другую, датчик замечает перепад. Именно поэтому он ловит движение, а не присутствие: сидящего неподвижно человека он через какое-то время перестаёт видеть.
Для платы это самый простой из датчиков: на выходе обычная логическая единица, когда движение есть, и ноль, когда его нет. Никаких библиотек и протоколов — достаточно digitalRead.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VCC | Питание 5–20 В. |
| OUT | Цифровой выход: 3,3 В при обнаружении движения. |
| GND | Земля. |
Два подстроечника и перемычка
На плате рядом с выводами стоят два оранжевых винта. Один задаёт чувствительность — расстояние от трёх до семи метров. Второй задаёт время удержания: сколько секунд выход останется в единице после того, как движение прекратилось. Крутится от пары секунд до пяти минут.
Рядом — перемычка на три штырька. В положении H датчик держит выход в единице, пока движение продолжается, и продлевает время при каждом новом обнаружении. В положении L он выдаёт один импульс и замолкает до конца задержки. Для сигнализации удобнее H, для счётчика проходов — L.
Характеристики
- Дальность
- 3–7 м, регулируется
- Угол обзора
- около 110°
- Время удержания
- от 3 с до 5 мин, регулируется
- Напряжение выхода
- 3,3 В
- Питание
- 5–20 В
- Прогрев после включения
- около минуты
Библиотека
не нужна— Датчик отдаёт обычный логический уровень, поэтому хватает digitalRead. Никаких протоколов разбирать не приходится.
Готовый скетч
const int PIR_PIN = 2;
const int LED_PIN = 13; // встроенный светодиод платы
bool wasMotion = false;
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.println("Датчик прогревается...");
delay(30000); // даём модулю успокоиться
Serial.println("Готов");
}
void loop() {
bool motion = digitalRead(PIR_PIN) == HIGH;
// реагируем только на смену состояния, а не на каждый цикл
if (motion && !wasMotion) {
Serial.println("Движение!");
digitalWrite(LED_PIN, HIGH);
}
if (!motion && wasMotion) {
Serial.println("Тихо");
digitalWrite(LED_PIN, LOW);
}
wasMotion = motion;
delay(50);
}Скетч собирается arduino-cli под Arduino UNO
Переменная wasMotion превращает поток одинаковых показаний в два события — «началось» и «закончилось». Без неё монитор порта зальёт сотнями строк «Движение!» за одну секунду.
Частые ошибки
Сразу после включения датчик сходит с ума
Первую минуту модуль калибруется и выдаёт ложные срабатывания. Это нормально: дайте ему прогреться и только потом судите о работе.
Срабатывает сам по себе
PIR реагирует на любое движущееся тепло: штора над батареей, поток из кондиционера, солнечный зайчик, домашний кот. Уберите датчик от источников тепла и сквозняков и убавьте чувствительность.
Не видит человека, стоящего на месте
Это не поломка, а принцип работы: датчик замечает перемещение тепла между зонами, а не само присутствие. Для присутствия нужен другой тип датчика — микроволновый или ToF.
Реакция приходит с задержкой в несколько минут
Виноват подстроечник времени удержания, выкрученный в максимум. Поверните его против часовой стрелки до упора и настраивайте заново.
Что понадобится
- Датчик движения HC-SR501
- Arduino UNO
- Провода «папа-мама»