ELECTRONICS

Датчик движения 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.

Реакция приходит с задержкой в несколько минут

Виноват подстроечник времени удержания, выкрученный в максимум. Поверните его против часовой стрелки до упора и настраивайте заново.

Что понадобится