综合案例2.0-家庭入侵报警系统
最新案例教程点击下方链接跳转,CSDN已停止更新
点
击
跳
转
简介
- 对于一些缺乏安全感的人而言,即使在家睡觉的时候也会担心会不会有人非法入侵到家里,对自己的人身和财产构成威胁。如果有一套便宜,便捷的入侵报警系统,能够在发现入侵人员的第一时间发出警报既能够起到威慑入侵者,让他们知难而退的作用,也能够第一时间通知到自己,起到提前准备自卫的作用,从而尽可能避免和减少损失。
- 本案例通过一个5.8G雷达感应传感器模块来检测是否有人入侵,检测到了以后,就会通过一个蜂鸣器进行报警。同时为了避免误报,我们可以通过手机app来动态控制报警时间段以及开关警报的操作,让报警系统满足我们每个人的需求。
- 5.8G雷达感应传感器模块的使用案例
无源蜂鸣器
无源蜂鸣器内部没有激励源,只有给它一定频率的方波信号,才能让蜂鸣器的振动装置起振,从而实现发声,同时,输入的方波频率不同,发出的声音也不同(所以无源蜂鸣器可以模拟曲调实现音乐效果)。下图为无源蜂鸣器的工作原理图
本案例使用PWM端口来驱动蜂鸣器。
无源蜂鸣器需要使用2k~5k频率的脉冲进行驱动,HaaS506开发板上使用PWM0进行驱动。
haas506 2.0开发教程-driver-PWM
准备
本案例需要的硬件
器材 | 数量 |
---|---|
HaaS506开发板 | 1 |
5.8G雷达感应传感器模块 | 1 |
无源蜂鸣器 | 1 |
SIM卡 | 1 |
杜邦线 | 若干 |
硬件连接图
代码流程
1、连接阿里云平台。
2、上传云端报警状态,报警开始时间与结束时间。
3、检测报警状态,当前时间和传感器状态,当同时满足三个条件,开始报警。
4、当关闭报警状态才能关掉报警系统。
5、上传云端下发的数据,实现设备端与云端数据统一。
功能实现
1、物联网平台开发
第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。
1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
- 选择产品功能定义–编辑草稿
- 添加自定义功能
- 添加标识符与数据类型(标识符要与代码一致)
- 点击发布上线
- 点击确定
2、设备端开发
-
第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
-
搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
-
2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...
- main.py
# coding=utf-8
from driver import GPIO
from driver import PWM
import network
import ujson
import utime as time
import modem
from aliyunIoT import Device
import kv
import sntp
from bodyDetect import BD
# 警报开关以及时间段控制(大于等于alarm_start 或者小于等于alarm_end )
alarming = False
#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
print('***** connect lp succeed****')
data_handle = {}
data_handle['device_handle'] = device.getDeviceHandle()
#当连接断开时,触发'disconnect'事件
def on_disconnect():
print('linkkit is disconnected')
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
global do_alarm,alarm_start,alarm_end,FLAG_ALARM_CONTROL,FLAG_ALARM_START,FLAG_ALARM_END
try:
props = eval(request['params'])
if FLAG_ALARM_CONTROL in props.keys():
do_alarm = props[FLAG_ALARM_CONTROL]
print('on_props: do_alarm {}'.format(do_alarm))
elif FLAG_ALARM_START in props.keys():
alarm_start = props[FLAG_ALARM_START]
print('on_props: alarm_start {}'.format(alarm_start))
elif FLAG_ALARM_END in props.keys():
alarm_end = props[FLAG_ALARM_END]
print('on_props: alarm_end {}'.format(alarm_end))
post_default_value()
except Excaption as e:
print(e)
value_data = {}
do_alarm = 1
FLAG_ALARM_CONTROL = "alarm_control"
FLAG_ALARM_START = "alarm_start"
FLAG_ALARM_END = "alarm_end"
def post_default_value():
global do_alarm,alarm_start,alarm_end,FLAG_ALARM_CONTROL,FLAG_ALARM_START,FLAG_ALARM_END
value_data[FLAG_ALARM_CONTROL]=do_alarm
value_data[FLAG_ALARM_START]=alarm_start
value_data[FLAG_ALARM_END]=alarm_end
data={
'params':ujson.dumps(value_data)
}
device.postProps(data)
print('---------------0----------------------')
#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):
print('clound req id is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):
print('err msg is {} '.format(err))
#网络连接的回调函数
def on_4g_cb(args):
global g_connect_status
pdp = args[0]
netwk_sta = args[1]
if netwk_sta == 1:
g_connect_status = True
else:
g_connect_status = False
#网络连接
def connect_network():
global net,on_4g_cb,g_connect_status
#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
net = network.NetWorkClient()
g_register_network = False
if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
g_register_network = True
else:
g_register_network = False
if g_register_network:
#注册网络连接的回调函数on(self,id,func); 1代表连接,func 回调函数 ;return 0 成功
net.on(1,on_4g_cb)
net.connect(None)
else:
print('网络注册失败')
while True:
if g_connect_status:
print('网络连接成功')
break
time.sleep_ms(20)
#动态注册回调函数
def on_dynreg_cb(data):
global deviceSecret,device_dyn_resigter_succed
deviceSecret = data
device_dyn_resigter_succed = True
# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):
global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succed
key = '_amp_customer_devicesecret'
deviceSecretdict = kv.get(key)
print("deviceSecretdict:",deviceSecretdict)
if isinstance(deviceSecretdict,str):
deviceSecret = deviceSecretdict
if deviceSecretdict is None or deviceSecret is None:
key_info = {
'productKey': productKey ,
'productSecret': productSecret ,
'deviceName': deviceName
}
# 动态注册一个设备,获取设备的deviceSecret
#下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,
if not device_dyn_resigter_succed:
device.register(key_info,on_dynreg_cb)
alarm_start = 8
alarm_end = 20
# 判断当前时间是否在有效时间段内
def time_valid():
global alarm_start,alarm_end
cur_hour = time.localtime()[3]
return (cur_hour >= alarm_start) and (cur_hour <= alarm_end)
def start_buzzers(duty_cycle):
param = {'freq':3000, 'duty': duty_cycle }
buzzers.setOption(param)
if __name__ == '__main__':
ICCID=None
g_connect_status = False
net = None
device = None
deviceSecret = None
deviceName = None
#替换下列产品信息
###################################
productKey = "a1A9j0EmrQr"
productSecret = "21ATZN5PR2iuv08w"
###################################
device_dyn_resigter_succed = False
# 连接网络
connect_network()
# 获取设备的IMEI 作为deviceName 进行动态注册
#2.2版本改为
#deviceName = modem.info.getDevImei()
deviceName = modem.getDevImei()
#获取设备的ICCID
ICCID=modem.sim.getIccid()
#初始化物联网平台Device类,获取device实例
device = Device()
if deviceName is not None and len(deviceName) > 0 :
#动态注册一个设备
dyn_register_device(productKey,productSecret,deviceName)
else:
print("获取设备IMEI失败,无法进行动态注册")
while deviceSecret is None:
time.sleep(0.2)
print('动态注册成功:' + deviceSecret)
key_info = {
'region' : 'cn-shanghai' ,
'productKey': productKey ,
'deviceName': deviceName ,
'deviceSecret': deviceSecret ,
'keepaliveSec': 60,
}
#打印设备信息
print(key_info)
#device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数
device.on(device.ON_CONNECT,on_connect)
device.on(device.ON_DISCONNECT,on_disconnect)
device.on(device.ON_PROPS,on_props)
device.on(device.ON_SERVICE,on_service)
device.on(device.ON_ERROR,on_error)
device.connect(key_info)
# 初始化蜂鸣器
sntp.settime() #sntp 校时
time.sleep(2)
buzzers = PWM()
buzzers.open("buzzer")
# 初始化人体传感器
radar=GPIO()
radar.open('radar')
bd = BD(radar)
post_default_value()
while True:
print('''
报警状态:{},
报警工作时间:{},
检测到人体活动:{}
'''.format(do_alarm,time_valid(),bd.irDetect()))
if do_alarm == 1 and time_valid() and bd.irDetect() == 1:
print('human detected, start buzzer')
start_buzzers(50)
alarming = True
else:
print('-------------------')
if do_alarm == 0 and alarming:
print('close buzzer')
start_buzzers(100)
alarming = False
else:
pass
time.sleep(1)
- bodyDetect.py
from driver import GPIO
class BD(object):
def __init__(self, gpioObj):
self.gpioObj = None
if not isinstance(gpioObj, GPIO):
raise ValueError("parameter is not a GPIO object")
self.gpioObj = gpioObj
def irDetect(self):
if self.gpioObj is None:
raise ValueError("invalid GPIO object")
value = self.gpioObj.read()
return value
- board.json
{
"name": "haas506",
"version": "2.0.0",
"io": {
"ADC0": {
"type": "ADC",
"port": 0,
"sampling": 12000000
},
"ADC1": {
"type": "ADC",
"port": 1,
"sampling": 12000000
},
"buzzer": {
"type": "PWM",
"port": 39
},
"radar":{
"type":"GPIO",
"port": 17,
"dir": "input",
"pull":"pullup"
},
"SPI0": {
"type": "SPI",
"port": 0,
"mode": "master",
"freq": 2000000
},
"serial1": {
"type": "UART",
"port": 0,
"dataWidth": 8,
"baudRate": 115200,
"stopBits": 1,
"flowControl": "disable",
"parity": "none",
"timeout": 1000
},
"serial2": {
"type": "UART",
"port": 1,
"dataWidth": 8,
"baudRate": 9600,
"stopBits": 1,
"flowControl": "disable",
"parity": "none",
"timeout": 1000
},
"serial3": {
"type": "UART",
"port": 2,
"dataWidth": 8,
"baudRate": 115200,
"stopBits": 1,
"flowControl": "disable",
"parity": "none",
"timeout": 1000
}
},
"debugLevel": "ERROR",
"repl": "enable",
"replPort": 0
}
调试
1、串口调试工具log,网络连接成功–动态注册成功–每秒打印工作状态,当全部为真时开始报警
2、云端有数据传入,打开实时刷新,显示数据会自动更新。
3、物联网应用开发
以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。
3.1新建‘普通项目’
- 使用阿里云IoTStudio创建项目。
- 在项目管理新建空白项目
3.2关联产品和设备
3.3新建‘移动应用’
点击上图红框中的‘组件’,就可以看到可用的组件列表。各组件的使用说明请参考组件说明
3.4页面设计
案例使用三个组件:
将三个组件拖到中间画布区
1、文字编辑
2、开关组件设置
依次配置产品设备信息,开关用来控制‘’报警开关‘’,点击确定。
3、数字框组件设置
先配置组件数据来源,在设置交互
配置交互完成
同理,报警结束时间同样设置
3.5预览和发布上线
在页面‘’保存‘’并点击‘预览’进行预览。
手机扫描二维码,可以在手机看查看数据。
测试警报开关与工作时间
- 关闭警报开关,蜂鸣器无反应。
- 打开警报开关,当前时间不在工作时间内,蜂鸣器无反应。
- 打开警报开关,在工作时间内,传感器检测到人体活动,开始报警。