ARDUINO34.RU Форум ARDUINO34.RU Форум
 Поиск    Участники
Сегодня: 19.08.2018 - 17:04:59
   ARDUINO34.RU Форум -> bujanoff -> Подключение датчика движения к Arduino
Страницы:  1  
АвторСообщение

bujanoff

участник форума




Статистика:
Тем создано: 129
Сообщений: 522
Репутация: 2066 ±
• Зона работы датчика: До 6 метров (110° x 70° область обнаружения)
• Рабочее напряжение: 5V-9V

Модуль имеет 3 вывода (стандарта 2.54мм):
GND: "-" питание.
VCC: "+" питание.
OUT: вывод выходного сигнала

Подключение датчика :
GND на любой из GND пинов­­­ ардуино.
VCC на + 5 вольт на ардуино.
OUT на любой из цифровых входов/выходов ардуино (в примерах подсоединено к 2)

Пример программного кода

#define pirPin 2
#define ledPin 13

void setup()
{
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin,OUTPUT);
}

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

//Если обнаружили движение
if(pirVal == HIGH)
{
digitalWrite(LedPin, HIGH);
Serial.print("Motion detected");
delay(2000);
}
else
{
Serial.print("No motion");
digitalWrite(LedPin,LOW);
}
}

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


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

Прикреплён файл:
--------------------------------------------------
3D-печать 79610782657
Сообщение # 1 13.02.2014 в 19:59:43

bujanoff

участник форума




Статистика:
Тем создано: 129
Сообщений: 522
Репутация: 2066 ±
Сборка автоматического светильника
Как и обещали в начале статьи мы соберем автоматический светильник.

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

//Время калибровки датчика (10-60 сек. по даташиту)
int calibrationTime = 30;

//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;

//Пауза, после которой движение считается оконченным
long unsigned int pause = 5000;

//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;

int pirPin = 2; //вывод подключения PIR датчика
int ledPin = 13; //вывод сигнального диода
int relayPin = 4; //реле пин

void setup()
{
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);

//!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
digitalWrite(relayPin, HIGH);
delay(4000);
digitalWrite(pirPin, LOW);

//дадим датчику время на калибровку
for(int i = 0; i < calibrationTime; i++)
{
//Во время калибровки будет мигать сигнальный диод
i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
delay(1000);
}
//По окончанию калибровки зажжем сигнальный диод
digitalWrite(ledPin, HIGH);
delay(50);
}

void loop()
{
//Если обнаружено движение
if(digitalRead(pirPin) == HIGH)
{
//Если до этого момента еще не включили реле
if(lockLow)
{
lockLow = false;
//Включаем реле.
//!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
digitalWrite(relayPin, LOW);
delay(50);
}
takeLowTime = true;
}

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


Прикреплён файл:
--------------------------------------------------
3D-печать 79610782657
Сообщение # 2 13.02.2014 в 20:01:17

bujanoff

участник форума




Статистика:
Тем создано: 129
Сообщений: 522
Репутация: 2066 ±
Датчики, включающие свет по наличию движения — вовсе не являются какой-то новинкой. Однако, несмотря на их явное преимущество, все-таки они имеют один существенный недостаток. Они не очень чувствительны, их срабатывание зависит от ряда факторов, они срабатывают случайно, их очень неудобно использовать в качестве датчиков присутствия, так как сложно настроить чувствительность, при которой мало подвижный человек будет создавать достаточный отраженный сигнал.


Однако, есть целый ряд ситуаций, когда необходимо просто отследить перемещение или наличие объекта в зоне действия датчика и выполнить какое-то действие. Причем крайне нежелательно, чтобы при наличие неподвижного объекта датчик выключался. Пусть, даже этот объект будет неподвижен длительное время.

Чтобы найти решение такой задачи я был вынужден переискать целую кучу предложения на разнообразных сайтах. К сожалению, никаких дешевых решений найти просто не удалось.

В итоге пришлось применить для решения этой задачи Arduino Uno с ультразвуковым датчиком. Благо дело, сейчас в продаже появились крайне дешевые решения, для ультразвукового обнаружения, всего по несколько уе за один датчик (Тип HS-SR 04). Кроме того, на ряде сайтов можно купить универсальные исполнительные блоки с «развязанными» реле, управляемыми с помощью фотодиодов. Я использовал приобретенный на BIC блок.

Маленькая проблема возникает при написании «скетча» для ардуино, ведь особенность датчиков присутствия в том, что нет необходимости выключать источник, пока объект присутствует. Благо дело, ардуино позволяет работать с глобальными переменными.

Ниже приводиться пример кода в виде ардуино-«скетча», который выполняет все необходимые действия (скачать код):

// pin's config
const int Trig = 2;
const int Echo = 3;

// current led state
int led_state=0;

long led_period_on = 10; //periods = 300*10=3s - how long wait after object disappear?
long led_left_on; //if this is 0 - turn off

void setup()
{
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
//default turn on
turn_led(1);
led_left_on = led_period_on;
}

void loop()
{
if ( led_left_on-- > 0 )
{
if (led_state == 0)
turn_led(1);
}
else
{
if (led_state == 1)
turn_led(0);
}
digitalWrite(Trig, LOW); // clear
delayMicroseconds(2); // wait 2 mks
digitalWrite(Trig, HIGH); // run
delayMicroseconds(10); // wait 10 mks
digitalWrite(Trig, LOW); // clear
long time_us=pulseIn(Echo, HIGH); // How long was signal?

if ( time_us != 0 && time_us/58 ) // to santimeters
{
led_left_on = led_period_on;
if (led_state == 0)
turn_led(1);
}

delay(300); // run again
}

// turn led on/off
void turn_led( int led_state_)
{
led_state = led_state_;
digitalWrite(11, led_state == 0?LOW:HIGH);
digitalWrite(10, led_state == 0?HIGH:LOW);


Для проверки работоспособности вся схема расположена на макетной плате-бутерброде, использована также одна из самых дешевых моделей. В дальнейшем планируется монтаж всего этого в подходящем по размеру корпусе. Скорее всего данная схема будет выполнять функции по управлению освещением в шкафу-подсобке. Схему я не привожу, так как она совершенно простая. Ультразвуковой датчик подключен в 2/3 портам, светодиоды к 10/11 портам ардуино. Использовано USB-питание, +5В подключено к светодиодам через резисторы в 220Ом. Блок реле переключается по низкому уровню.

Среди недостатков такого решения можно называть едва заметное щелканье ультразвукового датчика, впрочем как и реле. Наверное в спальне такое решение использовать все же не стоит. Хоть звук тихий, но может раздражать в полной тишине. Положительный момент — возможность управления этим делом по USB, возможность расширения, возможность подсоединения фотодиода для управления освещением.
--------------------------------------------------
3D-печать 79610782657
Сообщение # 3 13.02.2014 в 20:03:51

артик



гость
здраствуйте! У меня ничего не работает измените программу!
Сообщение # 4 04.05.2015 в 10:20:55

артик



гость
если бы все хорошо было бы я бы написал так:класс работает молодцы! а так не работает
Сообщение # 5 04.05.2015 в 10:23:10
Страницы:  1  
Администратор запретил отвечать гостям на сообщения! Для регистрации пройдите по ссылке: зарегистрироваться


Powered by WR-Forum Professional © 1.9.9