PIR-датчик движения (HC-SR501): обнаружение движения с Arduino, ESP32 и Pico
Как работает PIR-датчик движения? Подключение HC-SR501, настройка чувствительности и времени, режимы H/L, код для Arduino, ESP32 и Pico, свет по движению и защита от ложных срабатываний.
PIR-датчик (Passive InfraRed, пассивный инфракрасный) — дешёвый датчик с очень малым потреблением, который замечает, когда человек или животное движется в его поле зрения. Свет на лестнице, который включается сам, охранные системы и автоматические дверные звонки обычно работают на PIR. Слово «пассивный» значит, что датчик сам ничего не излучает: он только «слушает» инфракрасное излучение тёплых предметов вокруг. Самая популярная модель в проектах на Arduino — HC-SR501.

Как работает PIR-датчик?
Любой предмет теплее абсолютного нуля испускает инфракрасное излучение, а человеческое тело сильнее всего излучает на длине волны 9–10 микрометров. Сердце датчика — пироэлектрический элемент, который реагирует на это излучение, и он разделён на две половины. Когда ничего не движется, обе половины видят одинаковое излучение, их сигналы взаимно гасятся, и выход молчит. Когда кто-то пересекает поле зрения, сначала одна половина, а потом другая получает больше излучения; схема модуля улавливает эту разницу, и пин OUT переходит в HIGH.
Белый купол сверху — это линза Френеля. Она делит поле зрения на десятки маленьких зон и фокусирует излучение каждой зоны на элементе. Когда человек переходит из одной зоны в другую, сигнал меняется; поэтому PIR-датчик отлично замечает движение, но не видит человека, который стоит совершенно неподвижно.
Характеристики HC-SR501
| Параметр | Значение |
|---|---|
| Напряжение питания | 4,5–20 V (рекомендуется 5 V) |
| Ток в режиме ожидания | Около 50 µA |
| Выход | Цифровой: 3,3 V при движении, 0 V без него |
| Дальность обнаружения | 3–7 м (регулируется) |
| Угол обзора | Около 110° |
| Время удержания выхода | Примерно от 3 секунд до 5 минут (регулируется) |
| Время блокировки | Около 2,5 секунды после выключения выхода |
| Время прогрева | 30–60 секунд после включения питания |
Настройки на модуле
- Резистор Sx (чувствительность): задаёт дальность обнаружения. Поворот по часовой стрелке увеличивает её примерно с 3 до 7 метров.
- Резистор Tx (время): задаёт, сколько выход остаётся в HIGH после обнаружения движения. Поворот по часовой стрелке удлиняет время.
- Перемычка H (повторное срабатывание): пока движение продолжается, таймер каждый раз запускается заново; идеально для управления светом.
- Перемычка L (однократное срабатывание): когда время выходит, выход переходит в LOW, даже если движение продолжается; дальше нужно новое срабатывание.
- Время блокировки: примерно 2,5 секунды после перехода выхода в LOW новое движение не регистрируется; это не настраивается.
Распиновка и подключение HC-SR501
| Пин | Назначение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| VCC | Питание | 5V | VIN (5V) | VBUS (5V) |
| OUT | Цифровой выход (3,3 V) | D2 | GPIO 27 | GP16 |
| GND | Земля | GND | GND | GND |
Обнаружение движения с Arduino
Код ниже ждёт, пока датчик прогреется, а затем один раз пишет сообщение в монитор порта, когда движение начинается, и один раз — когда заканчивается, включая и выключая встроенный светодиод Arduino. Следить только за сменой состояния, а не выводить значение выхода снова и снова — тот же подход, что и в настоящих проектах.
1const int PIR_PIN = 2;
2const int LED_PIN = 13; // dahili LED / built-in LED
3
4bool motion = false;
5
6void setup() {
7 pinMode(PIR_PIN, INPUT);
8 pinMode(LED_PIN, OUTPUT);
9 Serial.begin(9600);
10 Serial.println("Sensör ısınıyor / warming up...");
11 delay(30000); // ilk 30 sn kararsız / unstable for ~30 s
12 Serial.println("Hazır / ready");
13}
14
15void loop() {
16 bool now = digitalRead(PIR_PIN);
17 if (now && !motion) {
18 Serial.println("Hareket algılandı / motion detected");
19 digitalWrite(LED_PIN, HIGH);
20 motion = true;
21 } else if (!now && motion) {
22 Serial.println("Hareket bitti / motion ended");
23 digitalWrite(LED_PIN, LOW);
24 motion = false;
25 }
26}Свет по движению: отсчёт времени через millis()
Хранить время свечения в коде, а не на резисторе Tx модуля, намного гибче. Код ниже запоминает момент каждого обнаружения движения и выключает свет через 20 секунд после последнего движения, так что свет горит, пока в комнате кто-то двигается. К LIGHT_PIN можно подключить светодиод или модуль реле для сетевой лампы; если реле active LOW, поменяй местами HIGH и LOW в последней строке. Подключение реле разобрано в статье Что такое модуль реле?
1const int PIR_PIN = 2;
2const int LIGHT_PIN = 7; // LED ya da röle / LED or relay
3const unsigned long ON_TIME = 20000; // son hareketten sonra 20 sn / 20 s after last motion
4
5unsigned long lastMotion = 0;
6
7void setup() {
8 pinMode(PIR_PIN, INPUT);
9 pinMode(LIGHT_PIN, OUTPUT);
10}
11
12void loop() {
13 if (digitalRead(PIR_PIN) == HIGH) {
14 lastMotion = millis(); // her harekette süreyi yenile / refresh on every motion
15 }
16 bool on = (lastMotion != 0) && (millis() - lastMotion < ON_TIME);
17 digitalWrite(LIGHT_PIN, on ? HIGH : LOW);
18}PIR с ESP32 и Raspberry Pi Pico
Выход HC-SR501 уже 3,3 V, поэтому его можно подключать к ESP32 и Pico напрямую, без делителя напряжения. А вот сам модуль питай от 5 V: ниже 4,5 V его встроенный стабилизатор работает нестабильно. На ESP32 работает тот же код Arduino; в проектах на батарейках, если отправить ESP32 в глубокий сон и будить его выходом PIR (ext0 wakeup), батарея прослужит на недели дольше. На Pico с MicroPython можно ловить движение через прерывание, ничего не пропуская:
1from machine import Pin
2import time
3
4pir = Pin(16, Pin.IN) # GP16
5led = Pin(25, Pin.OUT) # dahili LED; Pico W'de Pin("LED") / onboard LED; Pin("LED") on Pico W
6
7def on_motion(pin):
8 led.value(pin.value()) # hareket varken yanar / on while there is motion
9 print("Hareket / motion" if pin.value() else "Bitti / ended")
10
11pir.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=on_motion)
12
13while True:
14 time.sleep(1)Как избежать ложных срабатываний
- Не направляй на источники тепла: батареи отопления, решётки кондиционера, солнечные окна и горячие лампы вызывают срабатывание резкими перепадами температуры.
- Держи подальше от движущихся предметов: шторы, растения или ветки, качающиеся на ветру, выглядят как движение, если нагрелись на солнце.
- Очисти питание: реле и Wi-Fi-модули дают помехи по питанию; поставь конденсатор 100 µF между VCC и GND датчика.
- Отодвинь немного от ESP32: HC-SR501 прямо рядом с антенной Wi-Fi может иногда срабатывать сам; обычно помогают несколько сантиметров расстояния и короткий провод.
- Если есть домашние животные: снизь чувствительность и установи датчик повыше, слегка наклонив вниз.
- Не ставь за стекло: обычное стекло задерживает инфракрасное излучение, поэтому датчик за окном не увидит движения снаружи.
PIR, микроволновый радар или ультразвук?
| Параметр | PIR (HC-SR501) | Микроволновый радар (RCWL-0516) | Ультразвук (HC-SR04) |
|---|---|---|---|
| Что обнаруживает | Тёплые движущиеся объекты | Любое движение | Расстояние до предмета впереди |
| Сквозь тонкую стенку или корпус | Нет | Да | Нет |
| Неподвижно стоящий человек | Нет | Нет | Измеряется как расстояние |
| Потребление | Очень низкое (~50 µA) | Низкое (~3 mA) | Среднее (~15 mA) |
| Типичное применение | Освещение, сигнализации | Скрытые датчики, открывание дверей | Обнаружение препятствий, измерение уровня |
Если нужно знать, движется ли кто-то, а не есть ли кто-то в комнате, PIR — самое экономичное решение. Если нужно измерить, как далеко находится предмет, загляни в статью Датчик расстояния HC-SR04.
Идеи проектов с PIR-датчиком
- Автоматический свет в коридоре: включай лампу через реле при движении и выключай после 30 секунд без движения.
- Охранная сигнализация: включай зуммер, если в ночном режиме замечено движение; про звуковую часть читай в статье Что такое зуммер?
- Умный ночник: объедини PIR с фоторезистором (LDR), чтобы лампа включалась, только когда темно и кто-то двигается.
- Уведомления на телефон: отправляй сообщение в Telegram с ESP32 при обнаружении движения.
- Экономичный дисплей: включай подсветку LCD, когда кто-то подходит, и выключай, когда уходит.
- Счётчик посетителей: считай каждое движение через дверной проём и показывай число на дисплее.
Частые ошибки и как их исправить
- Выход всё время в HIGH: слишком большое время Tx или постоянное движение в режиме H; убавь резистор и убедись, что датчик не смотрит на источник тепла.
- Никогда не срабатывает: возможно, на VCC не 5 V, датчик ещё прогревается или провод OUT подключён не к тому пину, что указан в коде.
- Срабатывает сам каждые несколько секунд: шумное питание; добавь конденсатор и отодвинь датчик от реле и Wi-Fi-модулей.
- Сразу после окончания движения не срабатывает снова: время блокировки около 2,5 секунды — это нормально, датчик исправен.
- Неудачная установка: PIR лучше всего замечает движение поперёк поля зрения; человека, идущего прямо на датчик, он замечает позже.
PIR-датчик — один из лучших вариантов для первого проекта умного дома: подключается тремя проводами, а результат виден сразу. В приложении BlueGrays есть пошаговые проекты со светом по движению, дверным звонком и сигнализацией — со схемами подключения и кодом.
Частые вопросы
На каком расстоянии срабатывает PIR-датчик?
HC-SR501 замечает движение на расстоянии от 3 до 7 метров в угле около 110 градусов. Дальность задаётся резистором Sx (чувствительность) на модуле; поворот по часовой стрелке её увеличивает.
Замечает ли PIR-датчик неподвижно стоящего человека?
Нет. PIR реагирует только на изменение инфракрасного излучения, то есть на движение. Человека, который сидит совершенно неподвижно, он не заметит. Чтобы понять, есть ли кто-то в комнате, используют радары присутствия mmWave, например LD2410.
Работает ли PIR-датчик через стекло?
Нет. Обычное оконное стекло не пропускает инфракрасное излучение человеческого тела, поэтому датчик за стеклом не видит движения снаружи. Для улицы устанавливай датчик снаружи, в месте, защищённом от дождя.
Работает ли HC-SR501 от 3,3 V?
Ниже 4,5 V его стабилизатор работает нестабильно, поэтому нужно питание 5 V. Выход уже 3,3 V, так что его можно подключать прямо к ESP32 или Pico. Если нужна система полностью на 3,3 V, возьми маленький PIR-модуль AM312, который работает от 2,7–12 V.
Почему мой PIR-датчик срабатывает сам по себе?
Чаще всего причина — период прогрева, источники тепла, на которые смотрит датчик (батареи, солнце, кондиционер), и помехи по питанию. Игнорируй первые 60 секунд, отверни датчик от источников тепла, поставь конденсатор между VCC и GND и держи датчик подальше от Wi-Fi-модулей.
Чем отличаются режимы H и L на HC-SR501?
В режиме H (повторное срабатывание) таймер выхода запускается заново при каждом обнаружении, пока движение продолжается, поэтому свет горит, пока есть движение. В режиме L (однократное) выход выключается, когда заданное время вышло, даже если движение продолжается; новое срабатывание возможно после времени блокировки.
Что собрать после прочтения
Все проекты
Детектор движения на датчике движения
Простой охранник, который сообщает, что кто-то вошёл в комнату. Датчик движения улавливает тепло человеческого тела, а Arduino держит светодиод включённым, пока есть движение, и гасит его, когда движе

Дверной звонок и свет с датчиком движения
Когда кто-то подходит к твоей двери, ты узнаёшь об этом ещё до звонка. Как только датчик движения замечает человека, загорается светодиод, а зуммер играет мелодию из трёх нот сверху вниз; когда мелоди

Автоматическое освещение с PIR-датчиком движения на ESP32
В этом проекте PIR-датчик движения HC-SR501 замечает, что кто-то вошёл в комнату, и автоматически включает светодиод. Время свечения отслеживается через millis(); каждое показание HIGH обновляет время последнего движения, и светодиод гаснет не раньше чем через 10 секунд после последнего HIGH. Текущий код ещё и ждёт 50 ms на каждом цикле через delay(50), поэтому цикл не полностью неблокирующий. Подходит для освещения лестниц, шкафов и ванной.

Умное освещение на ESP32 (PIR + LDR + реле + OLED)
Сделай умное освещение для коридора, ванной или кладовки на ESP32! С PIR-датчиком движения, датчиком освещённости LDR и модулем реле собирается классический сценарий «свет включается при движении в темноте»: если вокруг уже светло, движение свет НЕ включает, и днём энергия экономится. Свет горит 30 секунд; если движение продолжается, таймер сбрасывается, и свет горит дольше. OLED SSD1306 крупно показывает состояние (ON / DAYTIME / WAITING) и обратный отсчёт.

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

Лазерная сигнализация
Ты ставишь невидимую лучевую ограду, совсем как в кино. Лазер светит на датчик освещённости с другой стороны; как только кто-то проходит и прерывает луч, загорается светодиод и звучит зуммер, а когда

Лазерная охранная система
Совсем как сцены ограблений с лазерами в фильмах: лазерный луч светит на датчик освещённости, и как только кто-то входит и прерывает луч, загорается красный светодиод и начинает звучать зуммер. Сигнал
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

