06
2019
05

WIFI作品DIY教程09-《人体红外检测》安防入侵报警功能

上篇WIFI作品DIY教程07-《wifi家居网关》家居控制中心zigbee/nrf24l01等完成了家居网关。

当我们上班、外出时,有人入侵我们的房子,想要偷东西或做坏事时:
人体红外检测功能就会发送警报字符到网关(或直接接响家中报警器),网关再处理到上传互联网,然后我们手机就会收到警报信息。
然后再通过Wifi摄像头,查看一下家中环境,确保是人还是猫猫狗狗,再做相应的处理。




我们需要的配件:人体红外板HC-SR501传感器nrf24l01(或zigbee等)




第一部分:人体红外HC-SR501介绍


红外探测器就是靠探测人体发射的10μm左右的红外线而进行工作的。
人体发射的10μm左右的红外线通过菲涅尔滤光片增强后聚集到红外感应源上。
红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。


HC-SR501原理图。



第二部分:下载编译源代码
1、安装CH340驱动

在drivers目录里找到CH340驱动,然后按说明安装(之前安装了就不用再安装了)。


2、源代码


001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 *NRF24l01针脚连接线
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 * Configurable:
 * CE -> 8
 * CSN -> 7
*/
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
 
int sid=1;//模块类型
int nid=4;//模块编号
 
//声名变量
const unsigned long interval = 1000;
unsigned long last_sent;
 
int rentival=0;
int renti_PIN=A5;
 
//NRF24l01
unsigned long nrf24l01nowlast;
char nrf24l01buff[33]={0};
char nrf24l01Data;
int nrf24l01i=0;
 
 
void setup()
{
    Serial.begin(115200);
 
    char client[10]={0};//client
    sprintf(client,"clie%d",sid);
    //初始化Mirf,用于NRF24l01收发
    Mirf_Init(0,client,sid);
 
   pinMode(renti_PIN, INPUT);
 
    Serial.println("zwifi_renti_sensor");
}
 
void loop()
{
 
  unsigned long now = millis();
  if ( now - last_sent >= interval  )
  {
    last_sent = now;
 
    rentival=0;   
    run_renti();
 
    if(rentival==HIGH){  
      char data[10]={0}; 
      sprintf(data,"%d",rentival);  
      send_data(data);
    }
 
  }
 
 
}
 
//初始化Mirf 0初始化1为接收2为发送
void Mirf_Init(int txrx,char *server,int channel){
    //初始化Mirf,用于NRF24l01收发       
    if(txrx==0)  {    
      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
      Mirf.setRADDR((byte *)server);//设置接收地址
    }
 
    if(txrx==1)  {    
      Mirf.setRADDR((byte *)server);//设置接收地址
    }
    if(txrx==2)  {
      Mirf.setTADDR((byte *)server);//设置发送地址
    }
 
    Mirf.payload = sizeof(char);//收发字节
    Mirf.channel = channel;
    Mirf.config();
}
 
//NRF24l01发送函数
void Mirf_Send(int channel,char *server,char *str){
  Mirf_Init(2,server,channel);
  int bufi=0;
  for(bufi=0;bufi<strlen(str);bufi++){//循环发送
    char words=str[bufi];//发送的字符
    Mirf.send((byte *)&words);//发送命令
    while(Mirf.isSending()){//等待发送完闭
    }
    delay(50);//延时,否则可能出现发送丢失现象
    //Serial.print(words);
  }
  //Serial.println("");
}
 
 
 
 
 
void run_renti()
{   
    rentival=digitalRead(renti_PIN);
    Serial.println(rentival,DEC);
    delay(100);
}
 
 
//
void send_data(char *data){
 
    char server[10]={0};//server
    sprintf(server,"serv%d",1);
    //Serial.println(server);
 
    char updateData[33]={0};
    char front[10]={0};
    //memcpy(front,body,9);
    sprintf(front," {ck%03d%03d",sid,nid);
    sprintf(updateData,"%s%s}",front,data);  
    Serial.println(updateData);
    Serial.println();
 
    Mirf_Send(1,server,updateData);
 
    char client[10]={0};//client
    sprintf(client,"clie%d",sid);
    Mirf_Init(1,client,sid); 
 
}




刷写arduino程序选哪个板?
请选择板是Arduino Uno,并记得选对对应的串口。

刷写ardruino源代码时,提示库不存在?
请联系qq610854837下载zwifi资料,软件下载目录里的arduino-1.0.5,里面包含了教程使用的所有库。



将代码进行编译下载到开发板上。

3、源代码说明
代码的功能:当有高电平时,就调用nrf24l01和zigbee发送给网关!
void run_renti()
{   
    rentival=digitalRead(renti_PIN);//获取是高电平还是低电平。
    Serial.println(rentival,DEC);
    delay(100);
}


//如果是高电平,向网关发送{ck00x00xdata}格式的字符。
if(rentival==HIGH){   
      char data[10]={0};  
      sprintf(data,"%d",rentival);   
      send_data(data);
    }


//网关接收到就会写入数据库,这一步网关原来的代码已经自动实现!


第三部分:测试人体检测感应和通信

打开:http://192.168.1.1/znck007/mysqltest.php?mode=select


点击查看数据库记录,会看人体传感器发来的高电平数据。
因为我们设置sid是1和4,所以在数据库对应是001,004,1就是高电平数据。

同时也可以用数据库软件Navicat for MySQL查看数据记录!





第四部分:关于报警和手机提醒的说明

具体的教程已经交大家如何diy了,但如何用到我们的现实中来呢?打如有人就响起警报,或直接发送信息到手机等。


1、响警报(由于属于二次开发,所以目前只提供思路)
我们需要购买一个报警器,连接到人体红外板的某一脚针,人体红外板就是Arduino的r3板,使用arduino控制报警器就可以实现该功能了!

2、手机提醒
手机提醒原来我们在WIFI作品DIY教程04-《WIFI烟雾煤气报警器》做过一些介绍,是通过发邮件,发信息的方式来提醒。
主要需要修改我们的后台运行程序WIFI作品DIY教程06-《openwrt后台程序》控制mysql、串口通信等


在/mnt/sda1/www/cgi-bin里的znckgbrun就是python脚本,我们要在里面增加一个实现POST发送邮件的功能。



在解码函数下面,可以判断如果是sid=001,nid=004(人体红外的编号),发来的数据,就可以调用BasePost(url,data),然后就可以像烟雾煤气报警器一样发送邮件,手机信息啦。

3、手机app提醒(以后会开发开源app)。
原理:当云端api收到人体报警,然后直接通知手机提醒。app实现起来就更人性化了,我们也在加油,编写好开源给大家!


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。