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.
- Всегда задавайте таймаут измерения, чтобы не зависнуть.