HC-SR501: подключение к ESP32 и Arduino

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

Инфракрасный датчик движения: видит перемещение тёплого тела и держит на выходе высокий уровень. Цифровой выход — «движение есть или нет», библиотека не нужна.

Как работает

PIR-датчик (пироэлектрический) реагирует не на присутствие, а на изменение инфракрасного излучения в поле зрения: человек, животное, сквозняк от радиатора. Линза Френеля делит поле зрения на зоны, и когда тёплое тело переходит из одной зоны в другую, датчик срабатывает.

Выход OUT цифровой: при движении — высокий уровень, затем датчик удерживает его заданное время и возвращается к низкому. Время удержания и чувствительность настраивают два подстроечника на плате, а перемычка переключает режим повторного запуска. В скетче достаточно digitalRead().

Выводы

ВыводНазначение
OUTцифровой выход: высокий уровень при движении
VCCпитание модуля, 5 В
GNDобщий провод

Подключение к ESP32

HC-SR501ESP32
OUTGPIO27
VCCVIN
GNDGND

Схема из примера «Датчик движения HC-SR501: свет по движению».

Датчик движения HC-SR501: свет по движению

Открыть пример целиком
Код скетча
// Свет по движению.
//
// Выход 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);
}

Подключение к Arduino Uno

HC-SR501Arduino Uno
OUTD2
VCC5V
GNDGND

Схема из примера «Arduino Uno: датчик движения HC-SR501».

Arduino Uno: датчик движения HC-SR501

Открыть пример целиком
Код скетча
// Свет по движению на 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 без делителя. После подачи питания датчику нужно около минуты на «привыкание» — первые срабатывания ложные. Порядок выводов на разных платах отличается: сверяйтесь с надписью на плате.

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

Другие детали