Датчик руху HC-SR501 вмикає світло через реле
Автоматичне світло в коридорі чи коморі: PIR-датчик бачить людину, ESP32 вмикає реле. Налаштування чутливості й часу утримання на самому датчику, модуль реле, контакти NO/COM і техніка безпеки при роботі з 230 В.
Про проєкт
Пасивний інфрачервоний (PIR) датчик реагує на зміну теплового випромінювання: людина, що рухається, «перетинає» його зони чутливості. Він не випромінює нічого сам, тож споживає мікроампери і працює роками. Разом із реле виходить класичне автосвітло.
Що знадобиться
- ESP32 DevKit
- PIR-датчик HC-SR501 (або мініатюрний AM312)
- Модуль реле на 5 В (з оптроном або транзистором на вході)
- Лампа або, для першої збірки, світлодіод із резистором замість неї
Схема
| Модуль | Вивід | ESP32 |
|---|---|---|
| HC-SR501 | VCC | 5V |
| OUT | GPIO27 | |
| GND | GND | |
| Реле | VCC | 5V |
| IN | GPIO26 | |
| GND | GND |
Вихід HC-SR501 видає 3.3 В, хоч сам датчик живиться від 5 В, тож його можна підключати прямо до ESP32. Для HC-SR501 потрібно ≥ 4.5 В живлення, від 3.3 В він працює нестабільно.
Навантаження вмикається контактами реле: COM (спільний) і NO (нормально розімкнений) замикаються, коли реле ввімкнене. NC — навпаки, розімкнений при ввімкненому реле.
⚠️ 230 В смертельно небезпечні. Контакти реле ізольовані від ESP32, але підключення до мережі робіть лише знеструмивши лінію, в закритому корпусі, з запобіжником. Якщо немає досвіду, для навчання використовуйте низьковольтну лампу 12 В або світлодіод.
Налаштування HC-SR501
На платі датчика два підстроювальні резистори і перемичка:
- Sx (чутливість) — дальність до ~7 м.
- Tx (час утримання) — скільки секунд тримати HIGH після останнього руху, від ~3 с до кількох хвилин. Для керування з ESP32 виставте мінімум, а таймер робіть у коді.
- Перемичка H/L: «H» — повторний рух продовжує імпульс (для світла саме це), «L» — одиночні імпульси.
Після ввімкнення датчику потрібно до хвилини на «прогрів»: у цей час він може хибно спрацьовувати.
Код
// PIR-датчик вмикає лампу через реле
const int PIR_PIN = 27;
const int RELAY_PIN = 26;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
}
void loop() {
bool motion = digitalRead(PIR_PIN) == HIGH;
digitalWrite(RELAY_PIN, motion ? HIGH : LOW);
static bool last = false;
if (motion != last) { // пишемо в порт лише зміни стану
last = motion;
Serial.println(motion ? "Рух! Світло УВІМК" : "Руху немає. Світло ВИМК");
}
delay(50);
}
Як покращити
- Таймер у коді. Замість Tx на датчику тримайте світло ще 60 с після останнього руху:
lastMotion = millis()і перевіркаmillis() - lastMotion < 60000. - Лише в темряві. Додайте фоторезистор на ADC1 і вмикайте світло тільки нижче порогу освітленості.
- Реле з «активним LOW». Багато модулів вмикаються від LOW на IN. Тоді інвертуйте логіку, а в
setup()спершуdigitalWrite(RELAY_PIN, HIGH)і лише потімpinMode, щоб реле не клацнуло при старті.