5.21 综合案例2.0-噪音检测系统(仅支持2.2以上版本)

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







简介

当今社会,噪音污染已经影响到了人们日常生活的方方面面,办公室的噪音污染会影响员工的工作效率,生活中的噪音勿扰会影响大家的睡眠和情绪,从而影响我们的身心健康。

噪音检测系统目的是检测办公室和生活环境的噪音,当噪音超过设定的峰值时,发出报警。根据报警提示,办公室里的人可以通过降低打电话,讨论的声音,或者主动到会议室去,以避免打扰别人;家里的人也可以据此作出相应的对策,比如关门窗,联系物业或者警察等。

噪声标准

  1. 比较安静: 30~40 分贝
  2. 影响睡眠和休息:50分贝以上
  3. 影响工作效率: 70分贝以上
  4. 严重影响听力或导致其他疾病: 长期生活在90分贝以上环境

为了检测室内环境中声音的大小,本场景的示意图如下图所示,场景设计的行为如下:

  1. 通过声音传感器测量环境声音大小
  2. 当声音低于90分贝时,根据不同的声音大小亮不同颜色的灯:
  • 小于40分贝亮绿色
  • 50~70分贝亮蓝色
  • 大于70分贝亮红色
  1. 当声音大于90分贝时打开蜂鸣器

准备

本案例需要的硬件

器材数量
HaaS506开发板1
MK002508声音传感器1
RGB三色LED灯1
蜂鸣器1
SIM卡1
杜邦线若干

硬件连接图

在这里插入图片描述

代码流程

1、连接阿里云平台。
2、重复读取声音传感器数据,将数据上传阿里云。
3、使用业务逻辑功能,根据声音分贝数值控制对应灯光与蜂鸣器。

功能实现

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
选择产品功能定义编辑草稿
在这里插入图片描述
1、添加自定义功能
2、添加标识符数据类型(标识符要与代码一致)
3、点击发布上线
在这里插入图片描述
选择读写类型
在这里插入图片描述

  • 发布上线,点击确定
    在这里插入图片描述

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。

  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
    在这里插入图片描述

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

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

  • 替换209行 productKey ,productSecret。(物联网平台开发添加设备时请使用IMEI号
    main.py
# coding=utf-8
from driver import ADC
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 math
import _thread

#当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')

red = 0
green = 0
blue = 0
bu = 0
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
    global switch_buzzers,switch_red,switch_green,switch_blue,red,green,blue,bu
    params=request['params']
    params=eval(params)
    if "buzzer" in params:
        switch_buzzers = params["buzzer"]
        if switch_buzzers and switch_buzzers != bu:
            print("buzzer - on")
            bu = switch_buzzers
    if "red_led" in params:
        switch_red = params["red_led"]
        if switch_red and switch_red != red:
            print("red_led - on")
            red = switch_red
    if "green_led" in params:
        switch_green = params["green_led"]
        if switch_green and switch_green != green:
            print("green_led - on")
            green = switch_green
    if "blue_led" in params:
        switch_blue = params["blue_led"]
        if switch_blue and switch_blue != blue:
            print("blue_led - on")
            blue = switch_blue
    params.clear()

#当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)   


volume_data = {}
def upload_volume(n):
    global volume_data
    volume_data["sound"]= n
    volume_data_str=ujson.dumps(volume_data)
    data={
        'params':volume_data_str
        }      
    device.postProps(data)

warn_data = {}
def upload_warn():
    global warn_data
    warn_data["buzzer"]= 0
    warn_data["red_led"]= 0
    warn_data["green_led"]= 0
    warn_data["blue_led"]= 0
    warn_data_str=ujson.dumps(warn_data)
    data={
        'params':warn_data_str
        }      
    device.postProps(data)
    data.clear()

#蜂鸣器
buzzers = PWM()
buzzers.open("buzzer")
switch_buzzers = 0
buzzer = 0
def start_buzzers():
    global switch_buzzers,buzzer
    if switch_buzzers == 1 and buzzer == 0:
        param = {'freq':3000,'duty':50}
        buzzers.setOption(param)
        buzzer = 1
    if switch_buzzers == 0 and buzzer == 1:
        param = {'freq':3000,'duty':100}
        buzzers.setOption(param)
        buzzer = 0


#红灯
led_red = GPIO()
led_red.open('red')
switch_red = 0
def red_led():
    global switch_red
    led_red.write(switch_red)

#绿灯
led_green = GPIO()
led_green.open('green')
switch_green = 0
def green_led():
    global switch_green
    led_green.write(switch_green)

#蓝灯
led_blue = GPIO()
led_blue.open('blue')
switch_blue = 0
def blue_led():
    global switch_blue
    led_blue.write(switch_blue)


def warning():
    global switch_blue,switch_green,switch_red,switch_buzzers
    while True:
        time.sleep_ms(200)
        start_buzzers()
        red_led()
        green_led()
        blue_led()


if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None
    deviceSecret = None
    deviceName = None
    #替换下列产品信息
    ###################################
    productKey = "a1laDtv9VrO"
    productSecret = "bPbyllJ80mRX5PPy"
    ###################################
    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)

    #主程序
    time.sleep(2)
    # 检测光照
    adc=ADC()
    adc.open("ADC1")
    upload_warn()
    # 创建警报线程
    _thread.start_new_thread(warning, ())
    while True:
        volume=adc.readVoltage()
        DB = 20*(math.log((volume/0.775), 10))
        upload_volume(DB)
        print(DB)
        time.sleep_ms(500)

board.json

{
  "name": "haas506",
  "version": "2.0.0",
  "io": {
    "ADC1": {
        "type": "ADC",
        "port": 1,
        "sampling": 12000000
      },
      "buzzer": {
        "type": "PWM",
        "port": 39
        },
      "red":{
        "type":"GPIO",
        "port": 18,
        "dir": "input",
        "pull":"pullup"
      },     
      "green": {
        "type": "GPIO",
        "port": 17,
        "dir": "output",
        "pull": "pullup"
        },

      "blue": {
          "type": "GPIO",
          "port": 16,
          "dir": "output",
          "pull": "pullup"
      }

  },
  "debugLevel": "ERROR",
  "repl": "enable",
  "replPort": 0
}

3、调试

1、串口调试工具log,网络连接成功动态注册成功重复打印当前音量
在这里插入图片描述
2、阿里云平台,打开实时刷新,物模型数值会即时改变。
在这里插入图片描述

4、物联网应用开发

4.1创建项目

  • 在项目管理新建空白项目
    在这里插入图片描述

4.2关联产品和设备

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

4.3业务逻辑开发

业务逻辑的主要目的是为了方便用户设定物联网设备端的行为逻辑,常规的物联网系统都是在设备端固话行为逻辑,出厂后如果需要修改设备行为,则需要进行OTA升级。
新建一条噪音监测的规则。

在这里插入图片描述
系统自动进入到业务逻辑页面,点击左侧‘节点’,右侧是业务逻辑介绍。
在这里插入图片描述
本案例是个多分支的选择结构,需要用到多个条件判断。逻辑如下
在这里插入图片描述
将所需节点拖入画布区,用线连接
在这里插入图片描述
节点配置
需要配置的节点比较多,一个一个来配置

  • 设备触发节点
    在这里插入图片描述
  • 条件判断1
    在这里插入图片描述
  • 条件判断2
    在这里插入图片描述
  • 条件判断3
    在这里插入图片描述
  • 设备1
    在这里插入图片描述
  • 设备2
    在这里插入图片描述
  • 设备3
    在这里插入图片描述
  • 设备4
    在这里插入图片描述

4.4保存与部署

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值