Датчик движения Arduino

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

Список деталей для сборки модели — что нам потребуется?

Для сборки проекта, описанного в этом уроке, понадобятся следующие детали:

  • Arduino UNO;
  • Датчик движения;
  • Breadboard;
  • Соединительные провода папа-папа.

Схема подключения PIR-датчика к Arduino:

К Arduino в этом проекте требуется подключить только датчик движения, поэтому провода от датчика можно подключить непосредственно к Arduino. Но т.к. в таком случае провода держаться немного неплотно, удобнее использовать схему c breadboard:

Скетч для датчика движения

Arduino будет послать сообщение по USB Serial связи при обнаружении движения.

//Время калибровки датчика (10-60 сек. по даташиту)
int calibrationTime = 30;
//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;
//Пауза, после которой движение считается оконченным
long unsigned int pause = 5000;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;
int pirPin = 7;    //вывод подключения PIR датчика
int ledPin = 13;   //вывод сигнального диода

void setup()
{
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);
//дадим датчику время на калибровку
Serial.print("Calibrating");
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)
{
//Если еще не вывели информацию об обнаружении
if(lockLow)
{
lockLow = false;
Serial.println("Motion detected");
delay(50);
}
takeLowTime = true;
}

//Ели движения нет
if(digitalRead(pirPin) == LOW)
{
//Если время окончания движения еще не записано
if(takeLowTime)
{
lowIn = millis();          //Сохраним время окончания движения
takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
}
//Если время без движение превышает паузу => движение окончено
if(!lockLow && millis() - lowIn > pause)
{
//Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
lockLow = true;
Serial.println("Motion finished");
delay(50);
}
}
}

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

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