PIR人体感应开关的应用
前几天一位朋友拿来一个PIR,那是深圳产的家庭智能控制设备的zigbee网联网的一个设备。属于安防设备。但他对它不太满意,认为每次都要手机点击好多页面很麻烦。因此他拿来了这个,希望楼主改一下。让它不受主控的控制,变成一个独立设备。而且出差住旅馆也可以用。他原本以为换一个元件的事。楼主就说了句这不是换个螺丝的事。然后就问他需要什么功能,也没跟他解释那么多。因为说不清楚。
单片机是AVR 8位机。
喇叭-5V
PIR 就是普通的淘宝货。实测可达3M。
///////////////////////////// //VARS //the time we give the sensor to calibrate (10-60 secs according to the datasheet) int calibrationTime = 45;
//the time when the sensor outputs a low impulse long unsigned int lowIn;
//the amount of milliseconds the sensor has to be low //before we assume all motion has stopped long unsigned int pause = 5000;
boolean lockLow = true; boolean takeLowTime;
int pirPin = 3; //the digital pin connected to the PIR sensor's output int ledPin = 11; int led1=8; int led2=7;
///////////////////////////// //SETUP void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); digitalWrite(pirPin, LOW);
//give the sensor some time to calibrate 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 alert() { digitalWrite(led1,HIGH); digitalWrite(led2,LOW); delay(50); digitalWrite(led2,HIGH);digitalWrite(led1,LOW); delay(50); }
void loop(){
if(digitalRead(pirPin) == HIGH){ analogWrite(ledPin, 50); alert(); digitalWrite(led1,LOW); digitalWrite(led2,LOW);
;//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); //the led visualizes the sensors output pin state
if(takeLowTime){ lowIn = millis(); //save the time of the transition from high to LOW takeLowTime = false; //make sure this is only done at the start of a LOW phase } //if the sensor is low for more than the given pause, //we assume that no more motion is going to happen if(!lockLow && millis() - lowIn > pause){ //makes sure this block of code is only executed again after //a new motion sequence has been detected lockLow = true; Serial.print("motion ended at "); //output Serial.print((millis() - pause)/1000); Serial.println(" sec"); delay(50); } } }
http://v.youku.com/v_show/id_XMTU1ODMwOTM4MA==.html?from=y1.2-1-105.3.1-2.1-1-1-0-0
以上代码的UNO上验证通过,我参考了部分这个代码。
|
-
|
|
|
|
|