5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新)

2023-11-19

简介

火力发电系统会持续对炉膛中煤的燃烧情况进行监控,防止出现煤熄灭的情况,本案例针对火力发电中防止煤熄灭的场景进行实时监控,如果煤熄灭就报警。
当然也可以反向操作,作为对失火场景的监控。

火焰传感器

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,复制产品证书到代码相应位置。
    在这里插入图片描述

  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)

# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

  • main.py
# coding=utf-8
from driver import ADC
from driver import GPIO
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import 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')

#当iot云端下发属性设置时,触发'props'事件
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)



#当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["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()
    # 获取设备的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)

    #主程序,
    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()
  • 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,网络连接成功动态注册成功每秒打印火焰传感器电压
在这里插入图片描述
2、云端有数据传入,打开实时刷新,显示数据会自动更新。
在这里插入图片描述

3、物联网应用开发

以下是物联网应用开发流程,接下来按以下流程介绍Web端应用的开发。
在这里插入图片描述

4.1新建‘普通项目’

  • 使用阿里云IoTStudio创建项目。
  • 在项目管理新建空白项目
    在这里插入图片描述

4.2创建‘Web应用’

  • 在新项目的首页新建一个Web应用
    在这里插入图片描述
  • Web应用创建成功后自动跳转到应用界面设计页面。点击左侧栏‘组件’按钮图标,就可以看到可用的组件列表。各组件的说明请参考IoT Studio组件说明
    在这里插入图片描述

4.3页面设计

添加三个组件:

实时曲线 显示火焰传感器电压数据变化
指示灯 提示报警状态
设备地图 显示设备位置
  • 可以搜索组件,然后拖到画布区
    在这里插入图片描述

4.4关联产品

  • 在项目控制台,点击左侧‘产品’点击‘关联物联网平台产品’。并勾选‘关联产品同时关联其下所有设备’,以便该项目可以访问到所有设备的定位信息。
    在这里插入图片描述
    在这里插入图片描述

4.5关联数据源

关联数据源3个步骤:

关联产品
关联设备
关联属性
  • 接下来对每个组件进行设置
    1、‘指示灯’,点击配置数据源。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 修改‘指示灯’展示样式,‘报警’/‘停止报警’用不同图片显示。(发电系统正常工作着火,熄火报警用灰色图标显示)
    在这里插入图片描述

  • 火焰图片如下:

2、同样方法设置‘实时曲线’显示当前的火焰传感器电压。
在这里插入图片描述
3、‘设备地图’设置属性
在这里插入图片描述

给设备进行点位
在这里插入图片描述
保存设备的位置信息,查看每个位置的设备信息。
在这里插入图片描述
配置设备显示信息,再保存一次
在这里插入图片描述

4.6业务逻辑开发

业务逻辑的主要目的是让用户设定物联网设备端的行为逻辑,常规的物联网系统都是在设备端固化行为逻辑,出厂后修改设备行为需要OTA升级,需要与开发者沟通。云端的业务逻辑用户可以自行更改。

  • 新建一条业务逻辑
    在这里插入图片描述
  • 创建完成后,系统会自动进入到业务逻辑界面。点击节点开始逻辑设计。
    在这里插入图片描述

逻辑需求,对上报的火焰传感器电压进行判断,高于设定数值报警,否则关闭报警。
需要设定一下四个节点:

	设备触发节点
	条件判断节点
	开启报警节点
	关闭报警节点

①从左侧拖出相应节点
在这里插入图片描述
②建立节点间的关联关系,拖动鼠标将节点连接
在这里插入图片描述
③业务逻辑编辑

设备触发设置

在这里插入图片描述

条件判断设置
	用户可以在这个位置设定判断阈值

在这里插入图片描述

设备行为设定

在这里插入图片描述
在这里插入图片描述

  • 依次点击保存与部署
    在这里插入图片描述

4.7预览与发布上线

  • 返回到火焰监控报警界面,点击保存,点击预览后可以看到界面效果。
    在这里插入图片描述
  • 可以看到设备位置,当前传感器状态,报警状态,传感器电压的变化曲线信息
    在这里插入图片描述

4.8在线调试

通过阿里云平台在线调试也可以远程控制报警开关。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新) 的相关文章

随机推荐

  • vscode远程连接失败解决方案

    vscode远程连接在更新了配置文件或者密钥信息更新后可能会出现远程连接失败 过程试图写入的管道不存在 该问题的主要有以下三种解决方案 1 在vscode SSH扩展设置中配置config文件的绝对位置 该文件一般位于 ssh文件夹中 C
  • CTF.show:web10

    和web9一样 先查看一下源码 右键查看源代码 进入style css 发现有index phps 在url处输入后 查看源码得到
  • MyBatis的增删改查操作(基于xml)

    文章目录 一 注意事项 1 占位符 2 增 删 改的返回值 3 查询操作 二 操作 1 新增 1 单条 2 批量 2 查询 1 多条记录 多字段 2 多条记录 单字段 3 单条记录 4 模糊查询 5 聚合值 6 返回列中包含查询参数 3 修
  • SpringBoot(3)整合MyBatis 和MybatisPlus

    SpringBoot 3 整合MyBatis 和MybatisPlus 1 整合MyBatis 1 1新建模块 1 2在pom xml中添加mysql驱动 1 2 1防止编译时不将静态资源编译进去 在pom xml中添加 1 3 appli
  • 【数值计算之二】数值积分之牛顿——科斯特公式:梯形、辛普森、辛普森3/8和布尔 & 高斯积分公式:勒让德、切比雪夫、拉盖尔和埃尔米特

    import numpy as np from scipy integrate import quad from sympy import init printing import matplotlib pyplot as plt 数值积分
  • Rust全局变量

    在Rust中 全局变量可以分为两种 编译期初始化的全局变量 const创建常量 static创建静态变量 Atomic创建原子类型 运行期初始化的全局变量 lazy static用于懒初始化 Box leak利用内存泄漏将一个变量的生命周期
  • non-protected broadcast场景分析及解决

    non protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver 有时在运行过程中在logcat工具中会发现大片的飘红消息 要消除这些错误信息 需要在广播的 Sender 和 R
  • WSL和VMware不兼容,安装了WSL之后VMware启动不起来

    WSL依赖于hyper v必须开启 而VMware不依赖这个 必须关闭 CMD管理员模式启动 输入bcdedit set hypervisorlaunchtype auto开启 则可以使用WSL CMD管理员模式启动 输入bcdedit s
  • ubuntn 下安装nginx 报错 ./configure: error: C compiler cc is not found

    原因是 error C compiler cc is not found c编译器没有安装 解决办法 需要安装编译工具及库文件 网址很多文章没有详细写nginx 安装教程 跟着教程敲命令然后出错了 安装nginx需要安装编译工具及库文件参考
  • 分布式锁解决方案_Zookeeper分布式锁原理

    通过召zk实现分布式锁可靠性时最高的 公平锁和可重入锁的原理 取水秩序 1 取水之前 先取号 2 号排在前面的 就可以先取水 3 先到的排在前面 那些后到的 一个一个挨着 在井边排成一队 公平锁 这种排队取水模型 就是一种锁的模型 什么是可
  • docker遇到问题集合

    1 docker images下删除镜像提示image is being used by stopped container 1b817324f96a 依次执行下面命令 docker ps a grep Exited awk print 1
  • 爬虫实例十一 全国城市房价排行

    目标网址 https www creprice cn rank index html 这一看就是个静态页面 没有用任何反爬措施所以很好爬 直接发送请求解析数据就可以了 完整代码 import requests from lxml impor
  • 睿智的目标检测54——Tensorflow2 搭建YoloX目标检测平台

    睿智的目标检测54 Tensorflow2 搭建YoloX目标检测平台 学习前言 源码下载 YoloX改进的部分 不完全 YoloX实现思路 一 整体结构解析 二 网络结构解析 1 主干网络CSPDarknet介绍 2 构建FPN特征金字塔
  • ElementUI浅尝辄止26:Notification 通知

    悬浮出现在页面角落 显示全局的通知提醒消息 1 如何使用 适用性广泛的通知栏 Notification 组件提供通知功能 Element 注册了 notify方法 接收一个options字面量参数 在最简单的情况下 你可以设置title字段
  • 资源路径嵌套异常,检测不到:IOException parsing XML document from class path resource [applicationContext.xml]

    org springframework beans factory BeanDefinitionStoreException IOException parsing XML document from class path resource
  • ARP与ARP代理的理解

    1 ARP 首先讲到ARP ARP是地址解析协议 它的作用是在以太网环境下 通过第3层的网络层IP地址来找寻2层数据链路层的MAC地址 得到一张ARP缓存表 转发数据的时候根据ARP缓存表来进行传输 下图详细说明数据传输时ARP是如何一步步
  • TVP新书上架

    新书速递 近期 在腾讯云 TVP 联合出书计划中 腾讯云 TVP 山金孝老师推出了新书 融合 产业数字化转型的十大关键技术 融合 产业数字化转型的十大关键技术 作者 山金孝 李琦 中译出版社 内容简介 数字经济已成为高质量发展的新引擎 数字
  • [Django基础06]模型和数据库交互

    2 数据库配置 MySQL 通常情况下 如果你只是做测试使用 可以使用Django内置的数据库SQLite就完全可以满足需要了 我们在本次教程中 通过使用MySQL这个数据库来完成后续的功能操作 我们首先要做的是 在配置文件中指定数据库的配
  • Densely Connected Convolutional Networks 密集连接卷积网络

    什么是DenseNet DenseNet是由清华大学的Zhuang Liu 康奈尔大学的Gao Huang和Kilian Q Weinberger 以及Facebook研究员Laurens van der Maaten在CVPR 2017所
  • 5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新)

    综合案例2 0 火焰检测系统 简介 火焰传感器 准备 硬件连接图 代码流程 功能实现 1 物联网平台开发 2 设备端开发 调试 3 物联网应用开发 4 1新建 普通项目 4 2创建 Web应用 4 3页面设计 4 4关联产品 4 5关联数据