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

Датчик движения Arduino ► рассмотрим, как подключить PIR sensor к Ардуино. Продемонстрируем скетч для автоматического включения светильника от сенсора.

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

PIR sensor: устройство, характеристики

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

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

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

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

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

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

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • PIR датчик движения;
  • беспаечная макетная плата;
  • 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). Согласно языку программирования Ардуино, двойное равенство является оператором сравнения.

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

#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, которая полностью прерывает программу, микроконтроллер может продолжать остальные вычисления в скетче.
  2. мы изменили время выключения светильника. Если в первом скетче светодиод выключался сразу после сигнала LOW с датчика. То сейчас мы даем 1 минуту до выключения светильника, на случай если человек не вышел из комнаты.
1 Star2 Stars3 Stars4 Stars5 Stars (11 votes, average: 4,91 out of 5)
Загрузка...

Похожие записи по теме:

7 комментариев для “Пример: Подключение датчика движения к Ардуино”

      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 & amp; & state == 1) {
        counttime = millis();
        Serial.println("Движения нет, догорает свет");
        Serial.println(counttime);
        state = 0; // сбрасываем состояние, если ничего не изменится,
        delay(200);// счетчик будет доделывать свое задание
        }
        // если нет движения и прошло 15 секунд
        if (counttime & amp; & millis() - counttime & gt; = 15000) {
        Serial.println("ТЕМНОТА");
        digitalWrite(LED, LOW);
        }
        }

  1. Поскольку админ адекватно относиться к другим скетчам, предложу и свой, он полностью является копией скетча из коммента, но в нем добавлен фоторезистор, чтобы днем не срабатывал, поскольку мне этот скетч нужен был для освещения коридора ночью, когда идешь по важным делам к фарфоровым друзьям 🙂 Ну и стоит добавить, что вместо светодиода, у меня подключена светодиодная лента синего цвета.

    #define PHOTO A0 // порт в который подключен фоторезистор
    #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() {
    int val = analogRead(PHOTO); // читаем данные с фоторезистора
    Serial.println(val);
    // если есть движение включаем светодиод
    // делаем проверку пиродатчика и степени освещения
    if (digitalRead(PIR) == HIGH & amp; & val & gt; 950) {
    digitalWrite(LED, HIGH);
    Serial.println("Есть человек");
    state = 1; // разовое изменение состояния за цикл
    Serial.println(state);
    }
    // благодаря состоянию запускаем таймер
    if (digitalRead(PIR) == LOW & amp; & state == 1) {
    counttime = millis();
    Serial.println("Движения нет, догорает свет");
    Serial.println(counttime);
    state = 0; // сбрасываем состояние, если ничего не изменится,
    delay(200); // счетчик будет доделывать свое задание
    }
    // если нет движения и прошло 15 секунд
    if (counttime & amp; & millis() - counttime & gt; = 15000) {
    Serial.println("ТЕМНОТА");
    digitalWrite(LED, LOW);
    }
    }

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

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

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