PIR人体感应开关的应用

2016-05-041.7万
AI 快速预览详细 收起
本文介绍了一种将Zigbee联网的PIR人体感应开关改造成独立设备的方法。通过AVR 8位单片机,实现了无需手机操作即可独立运行的功能。文章详细描述了传感器的校准过程、低电平检测和动作检测的具体实现方法,并提供了完整的代码。最终效果是当检测到人体移动时,LED指示灯会亮起并发出报警声。这种改造方案特别适合出差使用,简化了操作流程,提高了便捷性。
PIR人体感应开关的应用


前几天一位朋友拿来一个PIR,那是深圳产的家庭智能控制设备的zigbee网联网的一个设备。属于安防设备。但他对它不太满意,认为每次都要手机点击好多页面很麻烦。因此他拿来了这个,希望楼主改一下。让它不受主控的控制,变成一个独立设备。而且出差住旅馆也可以用。他原本以为换一个元件的事。楼主就说了句这不是换个螺丝的事。然后就问他需要什么功能,也没跟他解释那么多。因为说不清楚。


PIR人体感应开关的应用图2

单片机是AVR 8位机。

喇叭-5V

PIR  就是普通的淘宝货。实测可达3M。

PIR人体感应开关的应用图1



/////////////////////////////
//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上验证通过,我参考了部分这个代码。


DSCN0026.JPG (97.82 KB, 下载次数: 3135)

PIR人体感应开关的应用 · 独立设备改造_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
诩
作品不错,简直把人体感应发挥到了“极致”
诩
上来就占个沙发
- 没有更多了 -