當前位置:網站首頁>5.15 綜合案例2.0-燃氣檢測系統

5.15 綜合案例2.0-燃氣檢測系統

2022-05-15 07:46:49智雲服

簡介

天然氣是家庭烹飪取暖主要燃料,其主要成分是甲烷(CH4),同時還含有少量的丙烷,乙烷、丁烷等其他少量氣體。天然氣本身無色無味,密度比空氣少。天然氣發生泄漏難以察覺,其在空氣中濃度達到5%~15%時,遇明火會發生爆炸。家庭天然氣的普及,每年因使用不當、人為因素造成燃氣泄漏爆炸事故接連不斷。
本案例就是以此背景教開發者一步一步打造燃氣泄漏檢測系統。

MQ2氣體傳感器

MQ-2常用於家庭和工廠的氣體泄漏監測裝置,適宜於液化氣、苯、烷、酒精、氫氣、烟霧等的探測。故因此,MQ-2可以准確來說是一個多種氣體探測器。

原理
MQ-2型烟霧傳感器屬於二氧化錫半導體氣敏材料,屬於錶面離子式N型半導體。處於200~300攝氏度時,二氧化錫吸附空氣中的氧,形成氧的負離子吸附,使半導體中的電子密度减少,從而使其電阻值增加。當與烟霧接觸時,如果晶粒間界處的勢壘收到烟霧的調至而變化,就會引起錶面導電率的變化。利用這一點就可以獲得這種烟霧存在的信息,烟霧的濃度越大,導電率越大,輸出電阻越低,則輸出的模擬信號就越大。

特性

  • MQ-2型傳感器對天然氣、液化石油氣等烟霧有很高的靈敏度,尤其對烷類烟霧更為敏感,具有良好的抗幹擾性,可准確排除有刺激性非可燃性烟霧的幹擾信息。
  • MQ-2型傳感器具有良好的重複性和長期的穩定性。初始穩定,響應時間短,長時間工作性能好。需要注意的是:在使用之前必須加熱一段時間,否則其輸出的電阻和電壓不准確。
  • 其檢測可燃氣體與烟霧的範圍是100~10000ppm(ppm為體積濃度。 1ppm=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-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')

#上傳報警燈狀態
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()

  • 使用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,網絡連接成功動態注册成功每秒打印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預覽和發布上線

業務邏輯設定完畢之後,可以在“燃氣監控報警系統”頁面‘’保存‘’並點擊‘預覽’進行預覽。
在這裏插入圖片描述
手機掃描二維碼,可以在手機看查看數據。
在這裏插入圖片描述

版權聲明
本文為[智雲服]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/135/202205142335456386.html

隨機推薦