5.15 综合案例2.0-燃气检测系统
时间:2022-07-04 03:00:00
综合案例2.0-燃气检测系统
- 简介
-
- MQ2气体传感器
- 准备
- 硬件连接图
- 代码流程
- 功能实现
-
- 1.开发物联网平台
- 2.设备端开发
-
- 调试
- 3.物联网应用开发
-
- 3.11新建‘普通项目’
- 3.2关联产品和设备
- 3.33新建‘移动应用’
- 3.4页面设计
- 3.5关联数据源
- 3.6.业务逻辑开发
- 3.7在线预览和发布
简介
天然气是家庭烹饪取暖的主要燃料,其主要成分是甲烷(CH4)还含有少量丙烷、乙烷、丁烷等少量气体。天然气本身无色无味,密度低于空气。天然气泄漏难以察觉,空气浓度达到5%~15%的时候,明火会爆炸。由于使用不当和人为因素,家庭天然气的普及导致燃气泄漏和爆炸事故不断发生。
本案例教开发人员逐步建立燃气泄漏检测系统。
MQ2气体传感器
MQ-2常用于家庭和工厂的气体泄漏监测装置,适用于检测液化气、苯、烷、酒精、氢气、烟雾等。MQ-准确地说,它是一种多种气体探测器。
原理
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料N型半导体。2000~在300摄氏度时,二氧化锡吸附空气中的氧气,形成氧气的负离子吸附,降低半导体中的电子密度,从而增加其电阻值。当与烟雾接触时,如果晶粒间界处的势垒被烟雾调整并改变,则会导致表面导电性的变化。烟雾浓度越大,导电性越大,输出电阻越低,模拟信号越大。
特性
- MQ-2型传感器对天然气、液化石油气等烟雾的灵敏度较高,特别是烷基烟雾,具有良好的抗干扰性,能准确消除刺激性非可燃烟雾的干扰信息。
- MQ-2型传感器具有良好的重复性和长期稳定性。初始稳定性,响应时间短,长期工作性能好。需要注意的是,在使用前必须加热一段时间,否则其输出电阻和电压不准确。
- 可燃气体和烟雾的检测范围为1000~10000ppm(ppm1.体积浓度ppm=1立方厘米/1立方米
- 电路设计电压范围宽,24V以下均可,加热电压5±0.2V
注:如果加热电压过高,输入电流过大,内部信号线熔断,使设备报废。
准备
本案所需的硬件
器材 | 数量 |
---|---|
HaaS506开发板 | 1 |
MQ2气体传感器 | 1 |
SIM卡 | 1 |
杜邦线 | 若干 |
硬件连接图
代码流程
1.连接阿里云平台。
2.重复读取MQ2气体传感器电压上传阿里云数据。
3、使用移动应用功能,显示天气,MQ2体传感器电压变化,设备报警。
功能实现
1.开发物联网平台
首次使用物联网平台的读者在打开实例后需要使用物联网平台功能。您也可以使用免费的公共实例进行开发。在阿里巴巴云物联网平台中,选择左上角的华东2-上海,点击公共实例打开。
1.平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2.创建产品属性(添加剂模型)
- 选择产品功能定义–编辑草稿
- 添加自定义功能
- 添加标识符与数据类型(标识符应与代码一致)
- 点击发布上线
- 点击确定
2.设备端开发
- 第一次使用开发板的读者可以遵循haas5062.0开发教程-导学构建开发环境。
- 构建后,复制以下代码Visual Studio Code,将产品证书复制到代码的相应位置。
- main.py
# coding=utf-8from driver import ADCfrom driver import GPIOimport networkimport ujsonimport utime as timeimport modemfrom aliyunIoT import Deviceimport kv #当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')#上传报警灯状态warning_data = {
}#当iot云端下发属性设置时,触发'props'事件def on_props(request): params=request['params'] params=eval(params) warn = params["alarmLight"] warning_data["alarmLight"]= warn warning_data_str=ujson.dumps(warning_data) data1={
'params':warning_data_str } device.postProps(data1)#当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) def upload_value(n): global value_data value_data["gasVoltage"]= n value_data_str=ujson.dumps(value_data) data={
'params':value_data_str } device.postProps(data)if __name__ == '__main__': ICCID=None g_connect_status = False net = None device = None deviceSecret = None deviceName = None #替换以下产品信息 ################################## productKey = "a1JuD7ay6Pj" productSecret = "yV68ScGy5DgEczVx" ################################## device_dyn_resigter_succed = False # 连接网络 connect_network() # 获取设备的IMEI 作为deviceName 进行动态注册 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) #主程序 #气体传感器 adc=ADC() adc.open("ADC1") value_data = {
} while True: value=adc.readVoltage() print('v:',value) print('--------------------------------------------') upload_value(value) time.sleep(1) adc.close()
- board.json
{
"version": "2.0.0", "io": {
"ADC0": {
"type": "ADC", "port": 0, "sampling": 12000000 }, "ADC1": {
"type": "ADC", "port": 1, "sampling": 12000000 }, "serial1":{
"type":"UART", "port":0, "dataWidth":8, "baudRate":115200, "stopBits":1, "flowControl":"disable", "parity":"none" }, "serial2":{
"type":"UART", "port":1, "dataWidth":8, "baudRate":115200, "stopBits":1, "flowControl":"disable", "parity":"none" }, "serial3":{
"type":"UART", "port":2, "dataWidth":8, "baudRate":115200, "stopBits":1, "flowControl":"disable", "parity":"none" } }, "debugLevel": "ERROR", "repl": "enable", "replPort": 0 }
调试
1、串口调试工具log,网络连接成功–动态注册成功–每秒打印MQ2气体传感器电压
2、云端有数据传入,打开实时刷新,显示数据会自动更新。
3、物联网应用开发
以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。
3.1新建‘普通项目’
- 使用阿里云IoTStudio创建项目。
- 在项目管理新建空白项目
3.2关联产品和设备
3.3新建‘移动应用’
点击上图红框中的‘组件’,就可以看到可用的组件列表。各组件的使用说明请参考组件说明
3.4页面设计
案例使用三个组件:
- 实时曲线 显示传感器实时数据
- 指示灯 显示报警状态
- 天气 用于显示目的地天气
将三个组件拖到中间画布区
3.5关联数据源
关联数据源分为如下三个步骤
关联产品
关联设备
关联属性
每个组件单独设置
1、‘指示灯’组件设置
设置好了之后,设置报警
2、同样的方法设置‘实时曲线’。
3、设置‘天气’组件,选择需要的地点。
3.6业务逻辑开发
业务逻辑的主要目的是为了方便用户设定物联网设备端的行为逻辑,常规的物联网系统都是在设备端固话行为逻辑,出厂后如果需要修改设备行为,则需要进行OTA升级。
新建一条燃气超阈值就报警的规则。
系统自动进入到业务逻辑页面,点击左侧‘节点’,右侧是业务逻辑介绍。
1、选择目标节点
此逻辑需要判断设备上传的燃气电压值,当电压值超过阈值就打开报警,否则关闭报警。需要四个节点:
- 设备触发节点
- 条件判断节点
- 开启报警灯节点
- 关闭报警灯节点
分别从左侧拖出需要的节点。
2、建立节点间的关联关系,拖动鼠标将节点连接
3、业务逻辑编辑
- 设备触发节点
- 条件判断节点
设备节点行为设定
业务逻辑保存和部署
3.7预览和发布上线
业务逻辑设定完毕之后,可以在“燃气监控报警系统”页面‘’保存‘’并点击‘预览’进行预览。
手机扫描二维码,可以在手机看查看数据。