5.17 综合案例2.0 声控灯(2.2版本接口有更新)

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

点击跳转HaaS506官方最新案例







简介

声控灯是通过声音控制开关的技术,适用于使用声音控制开灯的场景,特别是楼宇、住宅的公共场合,它可以减少人工开关电灯的麻烦,解放双手,避免双手接触公共开关,降低接触细菌的可能,疫情器件更是可以减少很多麻烦。
本案例实现一个简单的灯光控制功能,并把不同的灯光效果上传云端。

声音传感器

声音传感器的作用相当于一个话筒(麦克风)。它用来接收声波,显示声音的振动图像,但不能对噪声的强度进行测量。声音传感器输出高低电平信号,但本案例使用的是ADC端口。
在这里插入图片描述
使用说明:

  • 1.声音模块对环境声音强度最敏感,一般用来检测周围环境的声音强度
  • 2.在环境声音强度达不到设定阈值时,模块DO口输出高电平,当外界环境声音强度超过设定阈值时,模块DO输出低电平;
  • 3.输出DO可与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的声音,可 直接制动继电器模块,组成声控开关。
  • 4.可通过电位器调节灵敏度。
  • 5.有电源指示灯,比较器输出有指示灯。
  • 6.只能识别声音的有无(根据震动原理)不能识别声音的大小或者特定频率的声音。   输出形式 数字开关量输出(0和1高低电平)

准备

本案例需要的硬件

器材数量
HaaS506开发板1
声音传感器1
SIM卡1
杜邦线若干

硬件连接图

在这里插入图片描述

代码流程

1、连接阿里云平台。
2、检测到声音时,轮流出现不同的灯光效果
3、将相应的效果上传云端

功能实现

1、物联网平台开发

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

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

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

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

#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
    global state
    params=request['params']
    params=eval(params)
    if 'light'in params:
        upload_led(state)
    else:
        pass

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

led_data = {}
def upload_led(led):
    global led_data
    led_data["light"]= led
    led_data_str=ujson.dumps(led_data)
    data={
        'params':led_data_str
        }      
    device.postProps(data)

gNumber = 0
onoff = 0
def open_all_led():
    global gNumber,onoff
    while True:
        time.sleep_ms(100)
        if onoff ==1:
            if gNumber == 0:
                # 开LED1
                led3.write(0)
                led1.write(1)
            elif gNumber == 1:
                # 开LED2
                led1.write(0)
                led2.write(1)
            else:
                # 开LED3
                led2.write(0)
                led3.write(1)
            gNumber += 1
            gNumber %= 3
        else:
            pass

state = 0
num = 1
def led_open():
    global state,onoff,num
    if num == 1:
        state = num
        num =2
        # 开LED1
        led1.write(1)
    elif num == 2:
        state = num
        num = 3
        # 开LED2
        led2.write(1)
    elif num == 3:
        state = num
        num = 4
            # 开LED3
        led3.write(1)
    else :
        state = num
        num = 1
            # 全开
        onoff = 1
    print('state',state)
    upload_led(state)


def led_close():
    global onoff,state
    led1.write(0)
    led2.write(0)
    led3.write(0)
    onoff = 0
    state = 0
    upload_led(state)

openLed = False
def voice_thread():
    global openLed
    while True:
        time.sleep_ms(10)
        value=voice.readVoltage()
        if value <= 1520 and openLed == False:
            print("声波转换后的值%s"% (value))
            openLed = True
            print('open led-------------------------') 
            led_open()
            # 亮灯6秒
            time.sleep_ms(6000)
            # 关灯
            led_close()
            print('-------------------------close led') 
            openLed = False



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)

    #传感器操作
    led1=GPIO()
    led1.open("led1")
    led2=GPIO()
    led2.open("led2")
    led3=GPIO()
    led3.open("led3")
    voice=ADC()
    voice.open('ADC1')
    print('----------------test begin-------------------')
    try:
        # 创建声音采集线程
        _thread.start_new_thread(voice_thread, ())
        _thread.start_new_thread(open_all_led, ())
    except:
        print('main thread error...')

    while True:
        time.sleep(1)



board.json

{
  "name": "haas506",
  "version": "2.0.0",
  "io": {
    "ADC0": {
      "type": "ADC",
      "port": 0,
      "sampling": 12000000
    },
    "ADC1": {
      "type": "ADC",
      "port": 1,
      "sampling": 12000000
    },
    "qma8981": {
      "type": "I2C",
      "port": 1,
      "addrWidth": 7,
      "freq": 400000,
      "mode": "master",
      "devAddr": 18
    },
    "KEY1": {
      "type": "GPIO",
      "port": 44,
      "dir": "irq",
      "pull": "pullup",
      "intMode": "rising"
    },      
    "led1": {
      "type": "GPIO",
      "port": 1,
      "dir": "output",
      "pull": "pulldown"
    },
    "led2": {
      "type": "GPIO",
      "port": 7,
      "dir": "output",
      "pull": "pulldown"
    },
    "led3": {
      "type": "GPIO",
      "port": 6,
      "dir": "output",
      "pull": "pulldown"
    },
    "cs": {
      "type": "GPIO",
      "port": 15,
      "dir": "output",
      "pull": "pullup"
    },
    "radar":{
      "type":"GPIO",
      "port": 17,
      "dir": "input",
      "pull":"pullup"
    },               
    "SPI0": {
      "type": "SPI",
      "port": 0,
      "mode": "master",
      "freq": 2000000
    },
    "serial1": {
      "type": "UART",
      "port": 0,
      "dataWidth": 8,
      "baudRate": 115200,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    },
    "serial2": {
      "type": "UART",
      "port": 1,
      "dataWidth": 8,
      "baudRate": 9600,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    },
    "serial3": {
      "type": "UART",
      "port": 2,
      "dataWidth": 8,
      "baudRate": 115200,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none",
      "timeout": 1000
    }
  },
  "debugLevel": "ERROR",
  "repl": "enable",
  "replPort": 0
}


3、调试

1、串口调试工具log,网络连接成功动态注册成功当声音超过阈值,开启LED,每次开启不同模式
在这里插入图片描述
2、阿里云平台,打开实时刷新,物模型会即时显示lLED当前状态。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值