简介
火力发电系统会持续对炉膛中煤的燃烧情况进行监控,防止出现煤熄灭的情况,本案例针对火力发电中防止煤熄灭的场景进行实时监控,如果煤熄灭就报警。 当然也可以反向操作,作为对失火场景的监控。
火焰传感器
1、原理 火焰传感器通过检测火焰中产生的红外线来监测是否着火。远红外火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。远红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器后可以监测。 2、器件说明 市面上买到的有3根引脚的也有4根引脚的。案例适用4个引脚的。以下有几点需要说明:
- 电源指示LED–显示是否通电
- 模拟信号输出–输出模拟电压值
- 红外线越强模拟信号输出越小,反之越大。
- 灵敏度调节电位器–用来调节判断阈值。
当模拟信号输出大于该阈值(红外线弱,没火),开关信号输出为1(高电平),开关指示LED灯灭; 当模拟信号输出小于该阈值(红外线强,着火),开关信号输出为0(低电平),开关指示LED灯亮。
准备
本案例需要的硬件
器材 | 数量 |
---|
HaaS506开发板 | 1 | 火焰传感器 | 1 | SIM卡 | 1 | 杜邦线 | 若干 |
硬件连接图
代码流程
1、连接阿里云平台。 2、重复读取火焰传感器电压,将数据上传阿里云。 3、使用Web应用功能,显示设备位置、火焰传感器电压变化、设备报警。 4、将报警信号发送至开发板,控制报警开关。
功能实现
1、物联网平台开发
第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。
1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT 2、创建产品属性(添加物模型)
- 选择产品功能定义–编辑草稿
- 添加自定义功能
- 添加标识符与数据类型(标识符要与代码一致)
- 点击发布上线
- 点击确定
2、设备端开发
- 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
- 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
- main.py
from driver import ADC
from driver import GPIO
import network
import ujson
import utime as time
import modem
from aliyunIoT import Device
import kv
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):
params=request['params']
params=eval(params)
warn = params["warning"]
onoff_data["warning"]= warn
onoff_data_str=ujson.dumps(onoff_data)
data1={
'params':onoff_data_str
}
device.postProps(data1)
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)
def upload_value(n):
global value_data
value_data["flame"]= 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()
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)
onoff_data = {}
onoff_data["warning"]= 0
onoff_data_str=ujson.dumps(onoff_data)
data1={
'params':onoff_data_str
}
device.postProps(data1)
adc=ADC()
adc.open("ADC1")
value_data = {}
while True:
value=adc.readVoltage()
print('v:',value,)
print('--------------------------------------------')
upload_value(value)
time.sleep(1)
adc.close()
- 使用485串口读取log,配置 “replPort”: 2,串口TTL读取改为0 。
- 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": 2
}
调试
- 调试串口使用485端口,打开设备管理器可以查看调试端口号。
- 串口调试工具使用putty
调试结果
1、串口调试工具log,网络连接成功–动态注册成功–每秒打印火焰传感器电压 2、云端有数据传入,打开实时刷新,显示数据会自动更新。
3、物联网应用开发
以下是物联网应用开发流程,接下来按以下流程介绍Web端应用的开发。
4.1新建‘普通项目’
4.2创建‘Web应用’
- 在新项目的首页新建一个Web应用
- Web应用创建成功后自动跳转到应用界面设计页面。点击左侧栏‘组件’按钮图标,就可以看到可用的组件列表。各组件的说明请参考IoT Studio组件说明
4.3页面设计
添加三个组件:
实时曲线 显示火焰传感器电压数据变化
指示灯 提示报警状态
设备地图 显示设备位置
- 可以搜索组件,然后拖到画布区
4.4关联产品
- 在项目控制台,点击左侧‘产品’点击‘关联物联网平台产品’。并勾选‘关联产品同时关联其下所有设备’,以便该项目可以访问到所有设备的定位信息。
4.5关联数据源
关联数据源3个步骤:
关联产品
关联设备
关联属性
2、同样方法设置‘实时曲线’显示当前的火焰传感器电压。 3、‘设备地图’设置属性
给设备进行点位 保存设备的位置信息,查看每个位置的设备信息。 配置设备显示信息,再保存一次
4.6业务逻辑开发
业务逻辑的主要目的是让用户设定物联网设备端的行为逻辑,常规的物联网系统都是在设备端固化行为逻辑,出厂后修改设备行为需要OTA升级,需要与开发者沟通。云端的业务逻辑用户可以自行更改。
- 新建一条业务逻辑
- 创建完成后,系统会自动进入到业务逻辑界面。点击节点开始逻辑设计。
逻辑需求,对上报的火焰传感器电压进行判断,高于设定数值报警,否则关闭报警。 需要设定一下四个节点:
设备触发节点
条件判断节点
开启报警节点
关闭报警节点
①从左侧拖出相应节点 ②建立节点间的关联关系,拖动鼠标将节点连接 ③业务逻辑编辑
设备触发设置
条件判断设置
用户可以在这个位置设定判断阈值
设备行为设定
- 依次点击保存与部署
4.7预览与发布上线
- 返回到火焰监控报警界面,点击保存,点击预览后可以看到界面效果。
- 可以看到设备位置,当前传感器状态,报警状态,传感器电压的变化曲线信息
4.8在线调试
通过阿里云平台在线调试也可以远程控制报警开关。
|