简介
- 对于一些缺乏安全感的人而言,即使在家睡觉的时候也会担心会不会有人非法入侵到家里,对自己的人身和财产构成威胁。如果有一套便宜,便捷的入侵报警系统,能够在发现入侵人员的第一时间发出警报既能够起到威慑入侵者,让他们知难而退的作用,也能够第一时间通知到自己,起到提前准备自卫的作用,从而尽可能避免和减少损失。
- 本案例通过一个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,复制产品证书到代码相应位置。
- main.py
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
alarming = False
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()
def on_disconnect():
print('linkkit is disconnected')
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----------------------')
def on_service(id,request):
print('clound req id is {} , req is {}'.format(id,request))
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
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:
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
}
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()
deviceName = modem.getDevImei()
ICCID=modem.sim.getIccid()
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(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()
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)
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
- 使用485串口读取log,配置 “replPort”: 2,串口TTL读取改为0 。
- 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": 2
}
调试
- 调试串口使用485端口,打开设备管理器可以查看调试端口号。
- 串口调试工具使用putty
调试结果
1、串口调试工具log,网络连接成功–动态注册成功–每秒打印工作状态,当全部为真时开始报警 2、云端有数据传入,打开实时刷新,显示数据会自动更新。
3、物联网应用开发
以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。
3.1新建‘普通项目’
3.2关联产品和设备
3.3新建‘移动应用’
点击上图红框中的‘组件’,就可以看到可用的组件列表。各组件的使用说明请参考组件说明
3.4页面设计
案例使用三个组件: 将三个组件拖到中间画布区 1、文字编辑 2、开关组件设置 依次配置产品设备信息,开关用来控制‘’报警开关‘’,点击确定。 3、数字框组件设置 先配置组件数据来源,在设置交互 配置交互完成 同理,报警结束时间同样设置
3.5预览和发布上线
在页面‘’保存‘’并点击‘预览’进行预览。 手机扫描二维码,可以在手机看查看数据。 测试警报开关与工作时间
- 关闭警报开关,蜂鸣器无反应。
- 打开警报开关,当前时间不在工作时间内,蜂鸣器无反应。
- 打开警报开关,在工作时间内,传感器检测到人体活动,开始报警。
|