Практична робота №3

Тема: Застосування інфрачервоного датчика руху

 

         В даній практичній роботі представлена схема роботи інфрачервоного датчика руху.

 

Необхідне обладнання:

·       Arduino;

·       Макетна плата;

·       Світлодіод;

·       PIR сенсор фірми Parallax;

·       Дроти.

 

Схема:

Схема подключения

PIR-сенсор має 3 виходи: плюс, мінус і вихід. До 7-го піну Arduino підключаємо вихід PIR-сенсора. Також, приєднаємо світлодіод до піну 8 Arduino і GND.

 

Код:

 

//час калібровки датчика (10-60 сек. по даташиту)

int calibrationTime = 30;       

 

//час коли сенсор видає сигнал Low імпульсами

long unsigned int lowIn;        

 

long unsigned int pause = 5000; 

boolean lockLow = true;

boolean takeLowTime; 

int pirPin = 7;    //вивід подключения PIR сенсора

int ledPin = 8;

//установка

void setup(){

  Serial.begin(9600);

  pinMode(pirPin, INPUT);

  pinMode(ledPin, OUTPUT);

  digitalWrite(pirPin, LOW);

  //дамо датчику час на калібровку

  Serial.print("calibrating sensor ");

    for(int i = 0; i < calibrationTime; i++){

      Serial.print(".");

      delay(1000);

      }

    Serial.println(" done");

    Serial.println("SENSOR ACTIVE");

    delay(50);

  }

//цикл

void loop(){

 

     if(digitalRead(pirPin) == HIGH){

       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state

       if(lockLow){ 

         //makes sure we wait for a transition to LOW before any further output is made:

         lockLow = false;           

         Serial.println("---");

         Serial.print("motion detected at ");

         Serial.print(millis()/1000);

         Serial.println(" sec");

         delay(50);

         }        

         takeLowTime = true;

       }

     if(digitalRead(pirPin) == LOW){      

       digitalWrite(ledPin, LOW);  //світлодіод показує активність цифрового виходу

       if(takeLowTime)

{

        lowIn = millis();          //збережемо час відкликудатчику

        takeLowTime = false;       //переконаємося  що фаза низького рівня виконана

        }

           if(!lockLow && millis() - lowIn > pause){ 

           //переконаємося що блок коду виконається знову

           //виявлення нового руху

           lockLow = true;                       

           Serial.print("motion ended at ");      //вивід

           Serial.print((millis() - pause)/1000);

           Serial.println(" sec");

           delay(50);

           }

       }

  }