Инфракрасный датчик движения: видит перемещение тёплого тела и держит на выходе высокий уровень. Цифровой выход — «движение есть или нет», библиотека не нужна.
PIR-датчик (пироэлектрический) реагирует не на присутствие, а на изменение инфракрасного излучения в поле зрения: человек, животное, сквозняк от радиатора. Линза Френеля делит поле зрения на зоны, и когда тёплое тело переходит из одной зоны в другую, датчик срабатывает.
Выход OUT цифровой: при движении — высокий уровень, затем датчик удерживает его заданное время и возвращается к низкому. Время удержания и чувствительность настраивают два подстроечника на плате, а перемычка переключает режим повторного запуска. В скетче достаточно digitalRead().
// Свет по движению.
//
// Выход HC-SR501 цифровой: есть движение — высокий уровень, нет — низкий.
// Питается модуль от 5 В (вывод VIN платы), а выход у него 3,3 В, так что
// напрямую подходит ESP32.
//
// В симуляторе нажатие на линзу переключает «движение есть / нет».
const int PIR = 27;
const int LED = 2;
const unsigned long HOLD_MS = 5000; // сколько держать свет после последнего движения
unsigned long lastMotion = 0;
bool lit = false;
void setup() {
Serial.begin(115200);
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(PIR) == HIGH) {
lastMotion = millis();
if (!lit) {
lit = true;
digitalWrite(LED, HIGH);
Serial.println("движение — свет включён");
}
}
// Выключаем только после паузы: датчик сам коротко «гаснет» между
// движениями, и без паузы свет дёргался бы.
if (lit && millis() - lastMotion > HOLD_MS) {
lit = false;
digitalWrite(LED, LOW);
Serial.println("тихо — свет выключен");
}
delay(20);
}
// Свет по движению на HC-SR501.
//
// Датчик питается от 5 В и отвечает цифровым уровнем: движение — HIGH,
// тишина — LOW. Нажатие на линзу в симуляторе переключает одно в другое.
const int PIR = 2;
const int LED = 8;
const unsigned long HOLD_MS = 5000; // держать свет после последнего движения
unsigned long lastMotion = 0;
bool lit = false;
void setup() {
Serial.begin(9600);
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(PIR) == HIGH) {
lastMotion = millis();
if (!lit) {
lit = true;
digitalWrite(LED, HIGH);
Serial.println("движение — свет включён");
}
}
// Гасим только после паузы: датчик между движениями коротко «гаснет».
if (lit && millis() - lastMotion > HOLD_MS) {
lit = false;
digitalWrite(LED, LOW);
Serial.println("тихо — свет выключен");
}
delay(20);
}
В железе
Модуль питается от 5 В: на плате стоит стабилизатор, и от 3,3 В он работает нестабильно или не работает. Выход при этом остаётся около 3,3 В и читается и ESP32, и Arduino без делителя. После подачи питания датчику нужно около минуты на «привыкание» — первые срабатывания ложные. Порядок выводов на разных платах отличается: сверяйтесь с надписью на плате.
Частые ошибки
Питание от 3,3 В: модуль не включается или срабатывает хаотично. Нужны 5 В.
Скетч не ждёт прогрева: в первую минуту датчик срабатывает сам по себе. Игнорируйте выход первые 30–60 секунд.
Подсчёт срабатываний по уровню, а не по фронту: пока выход высокий, счётчик растёт на каждом проходе loop().
Датчик у обогревателя, кондиционера или на сквозняке: он видит изменение тепла и срабатывает без людей.