Рассмотрим, как подключить PIR sensor к Ардуино (пироэлектрический инфракрасный датчик движения) и рассмотрим скетч для автоматического светильника, который будет включаться при обнаружении движения в комнате. Также рассмотрим функцию millis Arduino в языке C++, которую часто требуется использовать в программах (скетчах) для создания многозадачности микроконтроллера Ардуино Уно.

PIR датчик движения Ардуино: характеристики

Сегодня уже никто не удивляется при автоматическом включении освещения в подъездах многоквартирных домов, которые срабатывают при прохождении человека. В большинстве приборов установлены пассивные датчики движения (PIR). Рассмотрим в этой статье устройство датчика движения, схему его подключения к Arduino UNO и соберем на его основе автоматический включатель освещения.

Линза Френеля концентрирует инфракрасное излучение
Линза Френеля концентрирует инфракрасное излучение

Модуль с ПИР датчиком состоит из пироэлектрического элемента под пластиковой линзой Френеля — цилиндрическая деталь с прямоугольным кристаллом в центре, который улавливает уровень инфракрасного излучения и пропускает его через себя. При подключении IR к Arduino мы уже выяснили, что все предметы имеют инфракрасное излучение и чем выше температура, тем интенсивнее излучение.

Устройство пироэлектрического датчика движения
Устройство и распиновка пироэлектрического датчика движения

PIR датчики движения практически одинаковы по устройству. Диапазон чувствительности PIR сенсоров для Ардуино до 6 метров, угол обзора 110° x 70°. Питание — 5 Вольт, а выходной цифровой сигнал имеет значение 0, когда движения нет и значение 1 при наличии движения. Чувствительные элементы устанавливается в герметический корпус, который защищает от влажности и перепадов температур.

Как подключить датчик движения к Ардуино

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • PIR датчик движения HC-SR501;
  • беспаечная макетная плата;
  • 1 светодиод и резистор 220 Ом;
  • провода «папа-папа», «папа-мама».
Схема подключения PIR датчика к Ардуино УНО
Схема подключения PIR датчика к Ардуино Уно

Распиновка датчиков движения Ардуино у разных производителей может отличаться, но рядом с контактами есть надписи (см. фото выше). Поэтому, перед подключением внимательно изучите модуль. Один выход идет к GND, второй к питанию 5 Вольт (VCC), а третий выход (OUT) выдает цифровой сигнал с PIR сенсора. Соберите схему, как на фото выше, подключите светодиод к пину 12 на Ардуино и загрузите следующий скетч.

Скетч для датчика движения Ардуино

#define PIR 2
#define LED 12

void setup() {
  pinMode(PIR, INPUT);
  pinMode(LED,OUTPUT);
}

void loop() {
   int pirVal = digitalRead(PIR);

   if (pirVal == HIGH) {
      digitalWrite(LED, HIGH);
      delay(2000);
   }

   else {
      digitalWrite(LED,LOW);
      delay(2000);
   }

}

Пояснения к коду:

  1. с помощью директивы #define для портов 2 и 12 мы назначили соответствующие имена PIR и LED. Это сделано лишь для нашего удобства;
  2. в условном операторе if использовано двойное равенство: if (pirVal == HIGH). Согласно языку программирования Ардуино, двойное равенство является оператором сравнения.



Скетч для светильника с PIR датчиком движения

#define LED  3 // назначаем порт для светодиода
#define PIR  2 // назначаем порт для PIR sensor

unsigned long counttime; // выделение памяти для счетчика

void setup() {
   pinMode(LED, OUTPUT);
   pinMode(PIR, INPUT);
}

void loop() {
   // если есть движение включаем светодиод
   if (digitalRead(PIR) == HIGH) {
      digitalWrite(LED, HIGH);
   }

   // включаем счетчик на 1 минуту
   counttime = millis();

   // если нет движения и прошла 1 минута
   if (digitalRead(PIR) == LOW && millis() - counttime > 60000) {

   // если нет движения в течении 1 минуты выключаем светодиод
   digitalWrite(LED, LOW);
   }
}

Пояснения к коду:

  1. с помощью функции counttime = millis(); мы начинаем отсчет времени. И в отличие от функции delay Arduino, которая полностью прерывает программу, микроконтроллер может продолжать остальные вычисления в скетче.
  2. мы изменили время выключения светильника. Если в первом скетче светодиод выключался сразу после сигнала LOW с датчика. То сейчас мы даем 1 минуту до выключения светильника, на случай если человек не вышел из комнаты.

Заключение. HC-SR501 датчик движения Ардуино позволяет сделать автоматическое включение освещения в комнате или создать «умную» подсветку лестницу в доме с помощью адресной ленты ws2812b. В комментариях к этой записи вы можете оставлять вопросы или свои замечания по представленной теме, на все комментарии наших постоянных пользователей мы стараемся ответить максимально быстро.



8 Replies to “Подключение датчика движения к Arduino”

      1. Пока поправлял ваш скетч считай новый написал, да и сам вспоминал минут 40 что к чему, но мне полезно, как раз проэктик родился)
        #define LED 13 // порт для светодиода
        #define PIR 2 // порт для PIR sensor
        int state = 0; // нужен для запоминания состояния
        unsigned long counttime; // выделение памяти для счетчика
        void setup() {
        pinMode(LED, OUTPUT);
        pinMode(PIR, INPUT);
        Serial.begin(9600);
        }
        void loop() {
        // если есть движение включаем светодиод
        if (digitalRead(PIR) == HIGH) {
        digitalWrite(LED, HIGH);
        Serial.println("Есть человек");
        state = 1; // разовое изменение состояния за цикл
        Serial.println(state);
        }
        // запускаем таймер
        if (digitalRead(PIR) == LOW && state == 1) {
        counttime = millis();
        Serial.println("Движения нет, догорает свет");
        Serial.println(counttime);
        state = 0; // сбрасываем состояние, если ничего не изменится,
        delay(200);// счетчик будет доделывать свое задание
        }
        // если нет движения и прошло 15 секунд
        if (millis() - counttime >= 15000) {
        Serial.println("ТЕМНОТА");
        digitalWrite(LED, LOW);
        }
        }

        1. Перелопачивал Ваш пример часа 2, то ошибки, то не правильная работа, почему не проверили код перед тем как его публиковать? State = 0 должно быть рядом с выключением лампочки, иначе условие с таймером не будет выполнено никогда. Про &amp, &gt вообще не понял что это и откуда.

          P.s. Надеялся взять рабочий код и подправить под себя, в итоге пришлось вникать в работу всех команд и процессов. За это конечно спасибо, теперь я в этом немного шарю, но всё таки выкладывать не проверенные коды не хорошо.

  1. Написал вот такую программу для 2 лампочек 12в. Не срабатывает вкл разных этажей(2). В чем причина подскажите пожалуйста?

  2. Возможно ли как то проверить датчик на работоспособность к примеру, не залило ли водой, или отрезали провода, есть ли возможность как то проверять работает ли датчик?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.