• 基于STM32设计的智能家居控制系统设计_语音+环境检测(OneNet)_2022


    1. 前言

    如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展,能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。在安全防护上,智能家居安防系统则够在原来的基础上提供立体化防护,帮助用户时刻守护住宅安全,更符合人们的安全需求。节能减排方面的也有积极作用。比如说,智能家居照明系统,它充分利用了自然光的照明作用,自动调节灯具的亮度,在保证室内明亮度的同时,将能耗降到最低,而对于洗手间、储藏室等地方,更是做到了人来灯亮、人走灯灭,一方面方便了用户的日常生活,另一方面也能防止用户忘记及时关灯而造成浪费。

    项目源码与资料下载地址: https://download.csdn.net/download/xiaolong1126626497/85896987

    视频演示地址: https://www.bilibili.com/video/BV16Y4y147A3?share_source=copy_web&vd_source=347136f3e32fe297fc17177194ce0a8b

    2. 设计要求总结

    设计题目:基于物联网的语音和环境检测的智能家居控制系统设计

    第一种:控制方式需经结合语音命令控制, 控制开关门、灯、电视、开关空调、开关电扇、开关窗帘等。

    第二种:控制方式是基于环境检测自动执行控制,根据环境检测结果控制相应的执行机构协作,比如: 当光照低于一定程度(比如低于5OLux)且有人在家里自动开灯,没人在家时自动关灯;如温度高于阈值并且有人在家时打开空调,没人在家时自动关闭等;如光照强度低于一定程度会自动关闭窗帘。电脑和手机APP两端云平台可以展示温湿度,光照等信息,还有各家居的状态,可以在云平台控制家居的开关,可以在云平台进行两种控制方式的切换。

    技术选项总结:

    (1)物联网平台采用OneNet:OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。

    (2)主控芯片采用:STM32F103C8T6

    (3)语音控制芯片采用:LD3320 支持普通话识别。

    (4)开关空调、开关风扇 采用继电器模拟:两个1路5V继电器控制

    (5)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟

    (6)室内照明灯(卧室、客厅):2盏 3W大功率LED灯模拟

    (7)环境光检测检测:BH1750数字传感器

    (8)联网的WIFI :选择ESP8266

    (9)OLED屏幕:模拟电视显示

    (11)温湿度检测:DHT11模块

    其中:

    (1)STM32主控芯片、语音控制芯片LD3320、室内照明大功率LED灯、环境光检测BH1750、ESP8266-WIFI 通过排母插在PCB板子上。

    (2)步进电机UL2003驱动板、继电器 使用排针外接。

    image-20220423011349425

    image-20220427102400680

    image-20220427102725644

    Android平板电脑显示效果:

    image-20220423095349105

    Android手机显示效果:

    image-20220423095504855

    image-20220423095602744

    3. 硬件选型

    3.1 STM32F103C8T6

    STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。

    image-20220420111635569

    3.2 语音识别模块: LD3320

    image-20220420111944825

    3.3 ESP8266 -串口WIFI

    image-20220420112202167

    3.4 LED灯-RGB灯

    image-20220420112311761

    3.5 3W大功率LED灯

    image-20220420112543018

    3.6 OLED模块

    image-20220420112736903

    3.7 步进电机模块

    image-20220420113017812

    3.8 继电器模块

    image-20220420113209336

    3.9 杜邦线(母对母)

    image-20220420115039353

    3.10 红外寻迹/循迹模块

    image-20220420132328088

    3.11 温湿度-DHT11

    image-20220420141221673

    3.12 BH1750光敏传感器

    image-20220421092953649

    4. OneNet创建产品与设备

    4.1 创建产品

    地址:https://open.iot.10086.cn/develop/global/product/#/console

    登录官网、点击右上角进入控制台,然后跟着截图步骤做。

    image-20220422144330851

    image-20220422144342648

    image-20220422144400472

    image-20220422144440826

    image-20220422144459158

    image-20220422144513347

    4.2 创建设备

    image-20220422144528807

    image-20220422144640892

    image-20220422144700490

    4.3 创建数据流模板

    这里添加的就是需要上传的数据流名称,与传感器对应。

    image-20220422145204662

    添加完毕。一共10个数据点类型。

    image-20220422152233544

    4.4 创建应用

    image-20220422145557794

    链接:https://open.iot.10086.cn/studio/view/project

    image-20220422145740316

    新建项目:

    image-20220422145841530

    image-20220422145921215

    image-20220422145940689

    image-20220422150007928

    image-20220422150053178

    4.5 布局界面

    image-20220422150326460

    选择表盘修改名称。

    image-20220422150509815

    修改完点击这里保存。

    image-20220422150550620

    表盘数据的格式后缀可以修改。

    image-20220422160050015

    添加按钮。

    image-20220422150633912

    添加段落。

    image-20220422150841063

    页面布局成功。

    image-20220422151251686

    4.6 绑定数据源

    接下来是重点,要为每个控件绑定数据源,才可以与设备进行交互。

    image-20220422151358100

    image-20220422151410091

    image-20220422151831272

    上面的产品ID和Key从哪里来? 看下面截图。

    image-20220422151917537

    然后继续增加即可。

    image-20220422151948683

    image-20220422152354666

    接下来重新进入到刚才给控件绑定数据源的页面。绑定数据源即可。

    image-20220422152513895

    取消过滤器配置,使用数据源的数据值。

    image-20220422152639493

    下面介绍按钮的数据源配置。

    image-20220422152853966

    image-20220422153023489

    每个开关可以向设备端发送命令,修改命令下发的格式。
    这里的{V} 表示是一个变量,如果我设置成sw1:{V} 那么就表示下发的命令就是sw1:0或者是sw1:1

    其他的按钮一样的配置方法,我就不一一截图了。

    image-20220422153505973

    image-20220422153438149

    4.7 保存预览发布

    image-20220422153551521

    image-20220422153611672

    回到项目页面点击发布。就可以分享链接给别人了。

    image-20220422153656826

    image-20220422153712473

    本项目发布链接地址:https://open.iot.10086.cn/view/main/index.html#/share2d?id=62625265bb4cd10035477bae

    5. MQTT协议登录

    (1)MQTT服务器地址信息

    文档: https://open.iot.10086.cn/doc/v5/develop/detail/248

    image-20220407222214766

    IP地址: 183.230.40.96
    端口号: 1883
    
    • 1
    • 2

    (2)生成登录密匙信息

    查看MQTT登录报文需要填写的参数来源与格式。

    image-20220407223742509

    文档: https://open.iot.10086.cn/doc/v5/develop/detail/265

    image-20220407222501071

    image-20220407222528709

    算法介绍文档:https://open.iot.10086.cn/doc/v5/develop/detail/241

    image-20220407222609939

    下载token生成工具。

    image-20220407222630969

    工具软件里需要填写的参数如下:

    【1】res选项参数的格式: products/{产品ID}/devices/{设备名称}

    【2】et是设置token过期时间:算出1970-1-1到你想要设置的到期时间,单位是秒,填入即可。

    比如: 超时时间设置为2022-4-7,那么,这里填入的秒就是:1970-1-1到2022-4-7之间的秒单位时间。

    【3】key的参数格式: 就是设备创建之后,在设备详情页的key

    C语言获取秒单位时间的代码:

    #include 
    #include 
     #include 
     
    int main()
    {
        time_t time_sec;
        time_sec=time(NULL);  //当前的秒单位时间--UTC时间
    	printf("当前时间(秒):%ld\n",time_sec);
    	printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    image-20220407223202125

    设备密匙查看:

    image-20220422154818469

    填入在生成密匙软件中的参数格式:

    res选项:products/507546/devices/dev1
    et是设置token过期时间:1680445911
    key的设备key:vdUElCh1OE0oFV6UNewtZIMryKU8OhQiIbAbKwTc9ak=
    
    • 1
    • 2
    • 3

    生成登录密匙:

    image-20220422155404693

    生成的值:
    version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D
    
    • 1
    • 2

    生成的数据就是MQTT服务器登录的密匙。

    (3)主题订阅与发布的格式

    文档地址:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html

    image-20220407223933636

    image-20220407223950886

    订阅 topic	订阅效果
    $sys/{pid}/{device-name}/dp/post/json/accepted	订阅设备数据点上报成功的消息
    $sys/{pid}/{device-name}/dp/post/json/rejected	订阅设备数据点上报失败的消息
    $sys/{pid}/{device-name}/dp/post/json/+	订阅设备数据点上报结果
    $sys/{pid}/{device-name}/cmd/request/+	订阅设备所有命令消息
    $sys/{pid}/{device-name}/cmd/response/+/+	订阅设备所有命令应答结果消息
    $sys/{pid}/{device-name}/cmd/#	订阅设备所有命令相关消息
    $sys/{pid}/{device-name}/#	订阅设备所有相关消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上传数据点的格式介绍:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html

    image-20220407224225557

    image-20220407224249604

    topic 命名规则如下:
    $sys/{pid}/{device-name}/dp/post/json
    
    本例中,发布 topic 名称为:
    $sys/238322/mqtts-test-device/dp/post/json
    
    payload示例如下:
    {
        "id": 123,        
        "dp": {             
            "temperatrue": [{     
                "v": 30,
            }],
            "power": [{     
                "v": 4.5,        
            }]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    当前设备的主题订阅与主题发布总结:

    IP地址: 183.230.40.96
    端口号: 1883
    clientId: dev1
    username: 507546
    password: version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D
    
    订阅主题:  $sys/507546/dev1/#
    发布主题:  $sys/507546/dev1/dp/post/json
    发布消息:  
    {"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}]}}
    
    发布消息: 
    {"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}]}}
    
    
    {"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}],"gps":[{"v":{"lon":120.086199,"lat":30.139219}}]}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (4)软件模拟登录测试

    当前采用MQTT客户端模拟设备,登录Onetnet测试,完成数据交互,测试云端产品设备交互是否OK。

    软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012

    根据软件提示,填充好参数,点击连接服务器,接着订阅主题,发送主题。

    image-20220422161528800

    然后网页登录OneNet查看设备状态,与数据显示。

    image-20220422161605727

    查看上传的数据。

    image-20220422161655457

    (5)云端下发命令给设备

    onenet支持以同步的形式发送命令给设备,方便控制设备。

    发送命令的方法和设备应答的说明文档:https://open.iot.10086.cn/doc/v5/develop/detail/267

    image-20220408112208888

    总结:

    云端下发的命令格式:
    $sys/507546/dev1/cmd/request/3baf8324-e5d4-43f1-be89-118299c3b583
    LED_ON
    
    其中:
    3baf8324-e5d4-43f1-be89-118299c3b583  表示当前的请求ID,设备应答的时候需要带上这个ID返回去。
    LED_ON  表示云端下发的命令内容
    
    
    设备收到这个命令之后,需要向云端回应。
    
    回应的格式如下:
    发布主题: $sys/507546/dev1/cmd/response/3baf8324-e5d4-43f1-be89-118299c3b583
    发布的消息:111
    
    其中:111   是返回给云端的消息内容,111是随便写的,举个例子。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    下面来实操演示一下过程:

    登录OneNet官网,点开设备列表页面,先让设备登录服务器,点击更多操作,点击下发命令。

    image-20220422161837956

    编辑好参数,点击发送。

    image-20220422161910005

    这时MQTT设备端就会收到提示。

    image-20220422161945255

    然后拼接好命令再发送应答给服务器。

    image-20220422162220453

    网页上收到正确的响应。

    image-20220422162200589

    发布的网页上也显示了正确的数据:

    image-20220422162334924

    6. LD3320语音识别模块编程

    image-20220422210935502

    下载程序示例。 将开发板的串口通过USB转TTL模块连接电脑即可。

    image-20220422211036637

    波特率是9600,语音识别时,想要说小杰,唤醒语音识别,然后再说出指令,唤醒语音识别就,模块上有一个红色的LED灯会亮。

    image-20220422213313240

    当前支持的指令如下:

    小杰,开卧室灯
    小杰,关卧室灯
    小杰,开客厅灯
    小杰,关客厅灯
    小杰,打开电视
    小杰,关闭电视
    小杰,打开风扇
    小杰,关闭风扇
    小杰,打开窗帘
    小杰,关闭窗帘
    小杰,打开空调
    小杰,关闭空调
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    image-20220422212851891

    7. STM32设备端开发

    7.1 程序下载

    image-20220422220657233

    7.2 原理图

    image-20220423011227692

    7.3 硬件接线

    本设计的硬件接线说明:1)OLED显示屏接线:
    D0----(SCK)------------------->>PB14
    D1----(MOSI)------------------>>PB13
    RES—(复位脚低电平有效)-------->>PB12
    DC--(数据和命令控制管脚)------>>PB1
    CS--(片选引脚)---------------->>PA7
    GND--------------------------->>GND
    VCC--------------------------->>3.3V或者5V
    
    
    (2)ATK-ESP8266 WIFI接线
    PA2(TX)--RXD 模块接收脚
    PA3(RX)--TXD 模块发送脚
    GND---GND 地
    VCC---VCC 电源(3.3V~5.0V)
    
    
    (3)LD3320语音识别模块接线说明
    GND----GND
    VCC---3.3V
    PB11----LD3320语音模块_TX
    PB10----LD3320语音模块_RX
    
    
    (4)开关空调:15V继电器控制
    PA6------LED
    
    (5)开关风扇:15V继电器控制
    PA4------LED
    
    (6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟
    ULN2003接线:
     IN-D: PB5   d
     IN-C: PB4   c
     IN-B: PB3   b
     IN-A: PB2   a
    +  : 5V
    -  : GND
    
    (7)卧室照明灯:一盏3W大功率LED灯模拟
    PB8------LED
    
    (8)客厅照明灯:一盏3W大功率LED灯模拟
    PB9------LED
    
    (9)环境光检测检测:BH1750数字传感器
    SDA-----PB7
    SCL-----PB6
    GND---GND 地
    VCC---VCC 电源(3.3V~5.0V)
    
    
    (10)温湿度传感器: DHT11
    VCC--VCC
    GND---GND
    DAT---PA5 
    
    (11)红外寻迹/循迹模块
    VCC--3.3V
    GND---GND
    DAT---PA8
    
    
    (--)板载LED灯:低电平亮
    LED1--PC13  
    BEEP2--PC14
    
    (--)板载按键: 
    KEY1--PA0  按下为高电平
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    7.4 核心代码

    #include "stm32f10x.h"
    #include "delay.h"
    #include "led.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"
    #include 
    #include 
    #include "timer.h"
    #include "oled.h"
    #include "fontdata.h"
    #include "esp8266.h"
    #include "app.h"
    #include "mqtt.h"
    #include "iic.h"
    #include "bh1750.h"
    #include "dht11.h"
    #include "motor.h"
    
    /*
    本设计的硬件接线说明: 
    
    (1)OLED显示屏接线:
    D0----(SCK)------------------->>PB14
    D1----(MOSI)------------------>>PB13
    RES—(复位脚低电平有效)-------->>PB12
    DC--(数据和命令控制管脚)------>>PB1
    CS--(片选引脚)---------------->>PA7
    GND--------------------------->>GND
    VCC--------------------------->>3.3V或者5V
    
    
    (2)ATK-ESP8266 WIFI接线
    PA2(TX)--RXD 模块接收脚
    PA3(RX)--TXD 模块发送脚
    GND---GND 地
    VCC---VCC 电源(3.3V~5.0V)
    
    
    (3)LD3320语音识别模块接线说明
    GND----GND
    VCC---3.3V
    PB11----LD3320语音模块_TX
    PB10----LD3320语音模块_RX
    
    
    (4)开关空调:1路5V继电器控制
    PA6------LED
    
    (5)开关风扇:1路5V继电器控制
    PA4------LED
    
    (6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟
    ULN2003接线:
     IN-D: PB5   d
     IN-C: PB4   c
     IN-B: PB3   b
     IN-A: PB2   a
    +  : 5V
    -  : GND
    
    (7)卧室照明灯:一盏3W大功率LED灯模拟
    PB8------LED
    
    (8)客厅照明灯:一盏3W大功率LED灯模拟
    PB9------LED
    
    (9)环境光检测检测:BH1750数字传感器
    SDA-----PB7
    SCL-----PB6
    GND---GND 地
    VCC---VCC 电源(3.3V~5.0V)
    
    
    (10)温湿度传感器: DHT11
    VCC--VCC
    GND---GND
    DAT---PA5 
    
    (11)红外寻迹/循迹模块
    VCC--3.3V
    GND---GND
    DAT---PA8
    
    
    (--)板载LED灯:低电平亮
    LED1--PC13  
    BEEP2--PC14
    
    (--)板载按键: 
    KEY1--PA0  按下为高电平
    
    */
    
    
    //物联网服务器的设备信息
    #define MQTT_ClientID "dev1"
    #define MQTT_UserName "507546"
    #define MQTT_PassWord "version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D"
    
    //订阅与发布的主题
    #define SET_TOPIC  "$sys/507546/dev1/#"  //订阅
    #define POST_TOPIC "$sys/507546/dev1/dp/post/json"  //发布
    
    //设置连接的路由器信息
    #define CONNECT_WIFI  "Xiaomi_meizi6"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
    #define CONNECT_PASS "12170307yu"       //将要连接的路由器密码
    
    #define CONNECT_SERVER_IP "183.230.40.96"   //服务器IP地址
    #define CONNECT_SERVER_PORT 1883            //服务器端口号
    
    
    char mqtt_message[100];
    
    //WIFI发送数据存储区域
    char data_buff[500];
    
    u8 esp8266_state=0;
    
    double Longitude=120.196517; //经度
    double latitude=30.194493;  //纬度
    
    u8 bh1750=0;
     
    u8 dht11_temp;
    u8 dht11_humidity;
    u8 sw1=0;
    u8 sw2=0;
    u8 sw3=0;
    u8 sw4=0;
    u8 sw5=0;
    u8 sw7=0;
    
    /*
    主函数: 程序执行的入口
    */
    int main(void)
    {
        u8 dian_shi=0; //1表示电视开 0表示电视关
        u8 mode=0; //0 表示手动模式  1表示自动模式
        u32 i=0;
        u8 key_val;
    	u32 TimeCnt=0;
        u32 wifi_TimeCnt=0;
        JTAG_Set();
        USART1_Init(115200);    //串口1的初始化
        USART2_Init(115200);    //串口-WIFI
        TIMER2_Init(72,20000);  //超时时间20ms
        USART3_Init(9600);      //串口-语音模块
        TIMER3_Init(36,20000);  //超时时间20ms
        
        //板载按键初始化
        KEY_Init();
        //板载LED灯初始化
        LED_Init();
        //外接LED初始化
        LED2_Init();
        //BH1750的IIC接口
        IIC_Init();
        //初始化DHT11
        DHT11_Init();
        //步进电机初始化	
        Moto_Init(); 
        //初始化
        APP_Init();
        
    
        printf("正在初始化OLED...\r\n");  
    	OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示
    	OLED_Clear(0x00);//清屏	
        
         strcpy((char*)USART2_RX_BUFFER,"<>卧室灯已打开");
         if(strstr((char*)&USART2_RX_BUFFER[1],"卧室灯已打开"))
         {
            printf("识别正确.\r\n");
         }
         else
         {
             printf("识别错误.\r\n");
         }
        
        printf("正在初始化ESP8266..\r\n");  
        for(i=0;i<5;i++)
        {
            if(ESP8266_Init()==0)
            {
                esp8266_state=1;
                break;
            }
            else
            {
                esp8266_state=0;
                printf("ESP8266硬件检测错误.\n");  
            }
        }
      
       if(esp8266_state)
       {
            printf("准备连接服务器....\r\n");
            //非加密端口
            printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
             
            //2. MQTT协议初始化	
            MQTT_Init(); 
    
            //3. 连接服务器  
            for(i=0;i<5;i++)
            {
                if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
                {
                    esp8266_state=1;
                    break;
                }
                esp8266_state=0;
                printf("服务器连接失败,正在重试...\n");
                delay_ms(500);
            }
            printf("服务器连接成功.\n");
    
            //3. 订阅主题
            if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
            {
               printf("主题订阅失败.\n");
            }
            else
            {
               printf("主题订阅成功.\n");
            } 
       }
       
       
       //上电时,让云端的按钮都处于关闭状态
       sprintf(data_buff,"{\"id\":123,\"dp\":{\"sw1\":[{\"v\":0}],\"sw2\":[{\"v\":0}],\"sw3\":[{\"v\":0}],\"sw4\":[{\"v\":0}]"
       ",\"sw5\":[{\"v\":0}],\"sw7\":[{\"v\":0}],\"mode\":[{\"v\":0}]}}");
        MQTT_PublishData(POST_TOPIC,data_buff,0);
      
       //等待稳定
       delay_ms(1000);
       
        while(1)
    	{	
            key_val=KEY_GetValue();
            if(key_val)
            {
                 printf("按键按下.\r\n");
            }
            
            //清屏
            //OLED_Clear(0);  
            //时间记录
            DelayMs(10);
            TimeCnt++;
            wifi_TimeCnt++;
            
            if(TimeCnt>=100) //1000毫秒一次
            {
                TimeCnt=0;
                LED1=!LED1;
                LED2_1=!LED2_1;
                LED2_2=!LED2_2;
                LED2_3=!LED2_3;
                
                //判断模式
                if(mode)
                {
                    printf("当前处于自动模式.\r\n");
                }
                else
                {
                    printf("当前处于手动模式.\r\n");
                }
                
                //读取光强度
                bh1750=Read_BH1750_Data();
                printf("光强度:%d\r\n",bh1750);
                
                //读取温湿度
                if(DHT11_Read_Data(&dht11_temp,&dht11_humidity))
                {
                    printf("温度读取失败.\r\n");
                }
                            
                printf("环境温度:%d\r\n环境湿度:%d\r\n",dht11_temp,dht11_humidity);
                
                //电视开
                if(dian_shi)
                {
                    sprintf(mqtt_message,"BH1750 :%4d",bh1750);
                    OLED_ShowString(0,0,16,mqtt_message);
                    
                    sprintf(mqtt_message,"DHT11_T:%4d",dht11_temp);
                    OLED_ShowString(0,16,16,mqtt_message);
                    
                    sprintf(mqtt_message,"DHT11_H:%4d",dht11_humidity);
                    OLED_ShowString(0,16*2,16,mqtt_message);
                    
                    sprintf(mqtt_message,"mode:%d p:%d",mode,DEV_HONGWAI);
                    OLED_ShowString(0,16*3,16,mqtt_message);
                }
                else
                {
                   OLED_Clear(0x00);//清屏	 
                }
                
                
                //自动模式下
                if(mode)
                {
                    //白天
                    if(bh1750>50)
                    {
                        DEV_WOSHI_LED=0;
                        DEV_KETIN_LED=0;
                        sw4=0;
                        sw5=0;
                        
                        //如果光很强,就自动关闭窗帘
                        if(bh1750>200)
                        {
                           //如果窗帘是处于开启状态,就关闭
                            if(sw3)
                            {
                                sw3=0; 
                                //启动窗帘关闭
                                Motorcw_ring(1,300);
                            } 
                        }
                    }
                    //黑夜
                    else
                    {
                        //有人--红外线检测
                        if(DEV_HONGWAI==0)
                        {
                            DEV_WOSHI_LED=1;
                            DEV_KETIN_LED=1;
                            sw4=1;
                            sw5=1;
                        }
                        //没人
                        else
                        {
                            DEV_WOSHI_LED=0;
                            DEV_KETIN_LED=0;
                            sw4=0;
                            sw5=0;
                        }
                        
                                     sprintf(data_buff,"{\"id\":123,\"dp\":{\"bh1750\":[{\"v\":%d}],\"dht11_t\":[{\"v\":%d}],\"dht11_h\":[{\"v\":%d}],\"sw1\":[{\"v\":%d}],\"sw2\":[{\"v\":%d}],\"sw3\":[{\"v\":%d}],\"sw4\":[{\"v\":%d}]"
                   ",\"sw5\":[{\"v\":%d}],\"sw7\":[{\"v\":%d}],\"mode\":[{\"v\":%d}]}}",
                            bh1750,dht11_temp,dht11_humidity,sw1,sw2,sw3,sw4,sw5,sw7,mode);
                             printf("data_buff:%s\r\n",data_buff);
                            MQTT_PublishData(POST_TOPIC,data_buff,0);
                                    
                    }
                }
    	    }
            
            //上传到物联网服务器的频率
            if(wifi_TimeCnt>=300) //3000毫秒一次
            {
                wifi_TimeCnt=0;
                
                sprintf(data_buff,"{\"id\":123,\"dp\":{\"bh1750\":[{\"v\":%d}],\"dht11_t\":[{\"v\":%d}],\"dht11_h\":[{\"v\":%d}],\"sw1\":[{\"v\":%d}],\"sw2\":[{\"v\":%d}],\"sw3\":[{\"v\":%d}],\"sw4\":[{\"v\":%d}]"
       ",\"sw5\":[{\"v\":%d}],\"sw7\":[{\"v\":%d}],\"mode\":[{\"v\":%d}]}}",
                bh1750,dht11_temp,dht11_humidity,sw1,sw2,sw3,sw4,sw5,sw7,mode);
                 printf("data_buff:%s\r\n",data_buff);
                MQTT_PublishData(POST_TOPIC,data_buff,0);
            }
    
           // 接收WIFI返回的数据
            if(USART2_RX_FLAG)
            {
                USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                
                printf("WIFI收到数据:\r\n");
                //向串口打印服务器返回的数据
                for(i=0;i<USART2_RX_CNT;i++)
                {
                    printf("%c",USART2_RX_BUFFER[i]);
                }
                printf("USART2_RX_CNT=%d\r\n",USART2_RX_CNT);
                
                 if(USART2_RX_CNT<=5)
                 {
                      USART2_RX_CNT=0;
                      USART2_RX_FLAG=0;
                     continue;
                 } 
                //如果是下发了属性
                //$sys/507546/dev1/cmd/request/a87b5e5f-f636-4e48-aa4c-b50ce32828cfsw2:1
                 //手动模式
                if(strstr((char*)&USART2_RX_BUFFER[5],"mode:0"))
                {
                    printf("开关-手动模式.\r\n");
                    mode=0;
                }
                //自动模式
                else if(strstr((char*)&USART2_RX_BUFFER[5],"mode:1"))
                {
                    printf("开关-自动模式.\r\n");
                    mode=1;
                }
                
                 //手动模式
                 if(mode==0)
                 {
                    //风扇关
                    if(strstr((char*)&USART2_RX_BUFFER[5],"sw1:0"))
                    {
                        printf("开关-风扇关闭.\r\n");
                        DEV_FEN_SAHN=0;
                        sw1=0;
                    }
                    //风扇开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw1:1"))
                    {
                        printf("开关-风扇打开.\r\n");
                        DEV_FEN_SAHN=1;
                        sw1=1;
                    }
                    //空调关
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw2:0"))
                    {
                        DEV_KONG_TIAO=0;
                        sw2=0;
                    }
                    //空调开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw2:1"))
                    {
                        DEV_KONG_TIAO=1;
                        sw2=1;
                    }
                    //窗帘关
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw3:0"))
                    {
                        Motorcw_ring(1,300);
                        sw3=0;
                    }
                    //窗帘开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw3:1"))
                    {
                        Motorcw_ring(1,300);
                        sw3=1;
                    }
                    //卧室灯关
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw4:0"))
                    {
                        DEV_WOSHI_LED=0;
                        sw4=0;
                    }
                    //卧室灯开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw4:1"))
                    {
                        DEV_WOSHI_LED=1;
                        sw4=1;
                    }
                    //客厅灯关
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw5:0"))
                    {
                        DEV_KETIN_LED=0;
                        sw5=0;
                    }
                    //客厅灯开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw5:1"))
                    {
                        DEV_KETIN_LED=1;
                        sw5=1;
                    }
                    //电视关
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw7:0"))
                    {
                       dian_shi=0;
                        sw7=0;
                    }
                    //电视开
                    else if(strstr((char*)&USART2_RX_BUFFER[5],"sw7:1"))
                    {
                       dian_shi=1;
                       sw7=1;
                    }
                 }
                 
                USART2_RX_CNT=0;
                USART2_RX_FLAG=0;
            }
            
             //实时接收语音模块返回的数据
             if(USART3_RX_FLAG)
             {
                 USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                 printf("USART3_RX_BUFF=%d,%s\r\n",USART3_RX_CNT,USART3_RX_BUFFER);
                 
                 //手动模式
                 if(mode==0)
                 {
                    //风扇关
                    if(strstr((char*)USART3_RX_BUFFER,"风扇已关闭"))
                    {
                        printf("语音-风扇已关闭.\r\n");
                        DEV_FEN_SAHN=1;
                        sw1=1;
                    }
                    //风扇开
                    else if(strstr((char*)USART3_RX_BUFFER,"风扇已打开"))
                    {
                        printf("语音-风扇已打开.\r\n");
                        DEV_FEN_SAHN=0;
                        sw1=0;
                    }
                    //空调关
                    else if(strstr((char*)USART3_RX_BUFFER,"空调已关闭"))
                    {
                        DEV_KONG_TIAO=1;
                        sw2=1;
                    }
                    //空调开
                    else if(strstr((char*)USART3_RX_BUFFER,"空调已打开"))
                    {
                        DEV_KONG_TIAO=0;
                        sw2=0;
                    }
                    //窗帘关
                    else if(strstr((char*)USART3_RX_BUFFER,"窗帘已关闭"))
                    {
                        Motorcw_ring(1,300);
                        sw3=0;
                    }
                    //窗帘开
                    else if(strstr((char*)USART3_RX_BUFFER,"窗帘已打开"))
                    {
                        Motorcw_ring(1,300);
                        sw3=1;
                    }
                    //卧室灯关
                    else if(strstr((char*)USART3_RX_BUFFER,"卧室灯已关闭"))
                    {
                        DEV_WOSHI_LED=0;
                        sw4=0;
                    }
                    //卧室灯开
                    else if(strstr((char*)USART3_RX_BUFFER,"卧室灯已打开"))
                    {
                        DEV_WOSHI_LED=1;
                        sw4=1;
                    }
                    //客厅灯关
                    else if(strstr((char*)USART3_RX_BUFFER,"客厅灯已关闭"))
                    {
                        DEV_KETIN_LED=0;
                        sw5=0;
                    }
                    //客厅灯开
                    else if(strstr((char*)USART3_RX_BUFFER,"客厅灯已打开"))
                    {
                        DEV_KETIN_LED=1;
                        sw5=1;
                    }
                    //电视关
                    else if(strstr((char*)USART3_RX_BUFFER,"电视机已关闭"))
                    {
                       dian_shi=0;
                        sw7=0;
                    }
                    //电视开
                    else if(strstr((char*)USART3_RX_BUFFER,"电视机已打开"))
                    {
                       dian_shi=1;
                       sw7=1;
                    }
                 }
                 
                 memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
                 USART3_RX_CNT=0;
                 USART3_RX_FLAG=0;
             } 
        }        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
    • 499
    • 500
    • 501
    • 502
    • 503
    • 504
    • 505
    • 506
    • 507
    • 508
    • 509
    • 510
    • 511
    • 512
    • 513
    • 514
    • 515
    • 516
    • 517
    • 518
    • 519
    • 520
    • 521
    • 522
    • 523
    • 524
    • 525
    • 526
    • 527
    • 528
    • 529
    • 530
    • 531
    • 532
    • 533
    • 534
    • 535
    • 536
    • 537
    • 538
    • 539
    • 540
    • 541
    • 542
    • 543
    • 544
    • 545
    • 546
    • 547
    • 548
    • 549
    • 550
    • 551
    • 552
    • 553
    • 554
    • 555
    • 556
    • 557
    • 558
    • 559
    • 560
    • 561
    • 562
    • 563
    • 564
    • 565
    • 566
    • 567
    • 568
    • 569
    • 570
    • 571
    • 572
    • 573
    • 574
    • 575
    • 576
    • 577
    • 578

    7.5 拿到代码怎么用?

    image-20220423094342725

    image-20220423094351970

    image-20220423094400074

  • 相关阅读:
    二、GRE(Generic Routing Encapsulation,通用路由封装协议)
    LLVM IR 构建 分析 转换 优化 IRBuilder Pass AI编译器后端代码生成
    MariaDB简介
    用户登录问题
    【Python】解决类中特性(property)覆盖同名属性(attribute)报错问题
    香橙派c# iot .net 控制ULN2003驱动板步进电机 代码实例
    Doris实践——同程数科实时数仓建设
    最强大脑记忆曲线(13)--应用程序的加密及授权码的实现
    一般需要输出的文档流程
    Apache SeaTunnel在VIP 中的使用
  • 原文地址:https://blog.csdn.net/xiaolong1126626497/article/details/126306415