Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Датчик движения (PIR Motion sensor) HC-SR501

Для начала общая информация. Инфракрасные датчики позволяют обнаруживать движение людей в контролируемой зоне, так как тело человека излучает тепло.

Внешний вид датчика HC-SR501.

HC-SR501

У датчика есть регулировочные винты (оранжевые) для настройки чувствительности.

Обращайте внимание на распиновку. Данные идут по среднему проводу, а по краям питание и земля.

Режим работы модуля задается перемычкой (джампером). Есть два режима — режим H и режим L:

Режим H — в этом режиме при срабатывании датчика несколько раз подряд на его выходе (на OUT) остаётся высокий логический уровень (на рисунке выше).

Режим L — в этом режиме на выходе при каждом срабатывании датчика появляется отдельный импульс.

PIR

Для подключения использовал следующую схему.

А код написал такой.


int ledPin = 13;  // инициализируем пин для светодиода
int inputPin = 7;  // инициализируем пин для получения сигнала от пироэлектрического датчика движения
int pirState = LOW;  // начинаем работу программы, предполагая, что движения нет
int val = 0;  // переменная для чтения состояния пина

void setup() {
  pinMode(ledPin, OUTPUT);  // объявляем светодиод в качестве  OUTPUT
  pinMode(inputPin, INPUT);  // объявляем датчик в качестве INPUT
  Serial.begin(9600);
}

void loop() {
  val = digitalRead(inputPin);  // считываем значение с датчика
  if (val == HIGH) {  // проверяем, соответствует ли считанное значение HIGH
    digitalWrite(ledPin, HIGH);  // включаем светодиод
    if (pirState == LOW) {
      // мы только что включили
      Serial.println("Motion detected!");
      // мы выводим на серийный монитор изменение, а не состояние
      pirState = HIGH;
    }
  } else {
    digitalWrite(ledPin, LOW); // выключаем светодиод
    if (pirState == HIGH) {
      // мы только что его выключили
      Serial.println("Motion ended!");
      // мы выводим на серийный монитор изменение, а не состояние
      pirState = LOW;
    }
  }
}

При обнаружения движения должен загораться светодиод. Если движения нет, то светодиод гаснет.

Датчик мне показался достаточно капризным и требующим определённого терпения для точной настройки.

Дополнительное чтение

Подробный обзор датчика на видео

Заказать на AliExpress

Реклама