PIR и ультразвук: движение и расстояние

Добавляем устройству «зрение»: реакцию на движение и измерение расстояния.

PIR — пассивный инфракрасный датчик движения: ловит изменения теплового излучения. HC-SR04 — ультразвуковой дальномер, измеряющий расстояние по времени возврата эха.

Датчик движения PIR

PIR-датчик — это цифровой вход: при обнаружении движения он выдаёт высокий уровень (1), иначе — низкий (0). Идеален для умного освещения и сигнализации.

from machine import Pin
import time

pir = Pin(27, Pin.IN)
led = Pin(2, Pin.OUT)

while True:
    if pir.value() == 1:
        print("Движение!")
        led.on()
        time.sleep(5)   # держим свет 5 секунд
    else:
        led.off()
    time.sleep(0.1)

Ультразвук: измеряем расстояние

HC-SR04 посылает ультразвуковой импульс и ждёт эхо. Зная скорость звука (~343 м/с) и время полёта, можно вычислить расстояние. Звук летит туда и обратно, поэтому путь делим пополам. Проверим расчёт на обычном Python:

def echo_to_distance(echo_us):
    speed = 0.0343          # см за микросекунду (343 м/с)
    return echo_us * speed / 2   # делим на 2: туда и обратно

for us in (100, 580, 1160, 2900):
    cm = echo_to_distance(us)
    print(f"эхо {us:4d} мкс -> {cm:.1f} см")

Вывод:

эхо  100 мкс -> 1.7 см
эхо  580 мкс -> 9.9 см
эхо 1160 мкс -> 19.9 см
эхо 2900 мкс -> 49.7 см

Код дальномера на плате

from machine import Pin, time_pulse_us
import time

trig = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)

def distance_cm():
    trig.value(0)
    time.sleep_us(2)
    trig.value(1)        # импульс 10 мкс
    time.sleep_us(10)
    trig.value(0)
    dur = time_pulse_us(echo, 1, 30000)  # ждём эхо
    return dur * 0.0343 / 2

while True:
    print("Расстояние:", round(distance_cm(), 1), "см")
    time.sleep(1)

Как работает под капотом

PIR содержит пироэлектрический сенсор, который реагирует на изменение ИК-излучения движущегося тёплого объекта. Внутри есть задержка и чувствительность — их настраивают подстроечными резисторами на модуле. HC-SR04 излучает пачку ультразвука 40 кГц по сигналу TRIG, а на ножке ECHO держит высокий уровень ровно столько, сколько звук летел туда и обратно. time_pulse_us измеряет длину этого импульса в микросекундах.

Частые ошибки

  • Питать HC-SR04 от 3.3 В. Ему нужно 5 В; а вывод ECHO выдаёт 5 В — его уровень надо понизить делителем до 3.3 В для входа ESP32.
  • Не ставить таймаут. Без ограничения time_pulse_us зависнет, если эха нет.
  • Ждать мгновенной реакции PIR. После включения датчику нужно ~30–60 с на калибровку.

Итог

  • PIR — цифровой датчик движения: 1 при обнаружении.
  • HC-SR04 меряет расстояние по времени эха: путь делим пополам.
  • ECHO выдаёт 5 В — понижайте делителем для входа ESP32.
  • Всегда задавайте таймаут измерения, чтобы не зависнуть.
Проверьте себя
1. Что выдаёт PIR-датчик движения?
AАналоговое напряжение, пропорциональное скорости
BЦифровой сигнал: 1 при обнаружении движения, 0 в покое
CРасстояние в сантиметрах
DТемпературу
2. Почему при расчёте расстояния по HC-SR04 время делят пополам?
AДля округления
BЗвук проходит путь дважды — туда к объекту и обратно
CЧтобы перевести в метры
DЭто ошибка в формуле
3. Какая опасность подключить вывод ECHO HC-SR04 напрямую к ESP32?
AНичего страшного
BECHO выдаёт 5 В, а вход ESP32 рассчитан на 3.3 В — нужен делитель
CESP32 сгорит от ультразвука
DДатчик не включится