基于STM32设计智能家居控制系统(OneNet)_2022

1. 前言

随着科学技术的发展,人们的生活方式发生着巨大改变,基于物联网技术实现的智能家居使我们的生活变得更加方便快捷。本次设计结合现代生活的具体需求,设计出一套基于物联网技术的智能家居电子系统设计,可以远程实时查看家里光照强度、温湿度等信息,支持在云端控制家里的电器设备,实现远程控制。

2. 具体需求

主要实现对光照强度、温湿度等信息的实时监测,将相关信息、设备状态信息等实时显示,通过ESP8266wifi模块进行联网可实现远程数据传输,利用OneNET云平台,MQTT传输协议,编辑应用实现手机端和电脑端的远程控制显示,操作界面美观方便,便于使用。

硬件选项要求:

(1)ESP8266 串口WIFI,用来与OneNet进行远程通信。

(2)DHT11 温度传感器,检测本地环境的温度湿度信息。

(3)继电器,来模拟控制家里的电器。

(4)BH1750 光敏传感器,检测环境光强度

(5)MQ135 空气质量传感器。可以检测可燃气体、烟雾浓度,实现火警预警。

(6)OLED显示屏显示本地的传感器的参数情况,实时展示

image-20220408095005963

image-20220408095020528

image-20220408095036200

image-20220408212113263

image-20220408212133681

image-20220408212154827

image-20220408212217647

image-20220408212236110

3. 硬件选型

3.1 继电器

image-20220320120540240

3.2 ESP8266 WIFI

(1)模块采用串口(LVTTL)与MCU(或其他串口设备)通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换
(2)模块支持LVTTL串口,兼容3.3V和5V单片机系统
(3)模块支持串口转WIFI STA、串口转AP和WIFI STA+WIFIAP的模式,从而快速构建串口-WIFI数据传输方案

image-20220319213658741

3.3 MQ-135空气质量传感器

MQ135传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾和其它有害的监测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。

image-20220319211928010

img

img

3.4 DHT11温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。可用于暖通空调、除湿器、测试及检测设备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗、其他相关湿度检测控制。

特点如下:

1、可以检测周围环境的湿度

2、可以检测周围环境的温度

3、湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:±5%4、温度测量范围:o度-50度温度测量误差:±2度

4、工作电压3.3V-5V

5、输出形式数字输出

image-20220319211432662

image-20220319211455249

3.5 STM32系统板

主控CPU采用STM32F103RCT6,这颗芯片包括48 KB SRAM、256 KB Flash、2个基本定时器、4个通用定时器、2个高级定时器、51个通用IO口、5个串口、2个DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个1.4寸的TFT-LCD彩屏,可以显示当前传感器数据以及一些运行状态信息。

image-20220319202557220

3.6 OLED显示屏

image-20220321181209155

特点:

OLED是有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源(只是供电不会亮的、驱动程序和接线正确才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制oLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCH、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。

3.7 母对母杜邦线

image-20220331175035193

3.8 BH1750光敏传感器

image-20220331175354383

4. OneNet平台创建产品与设备

4.1 创建产品

(1)登录账号注册

官网: https://open.iot.10086.cn/

image-20220407214211444

点击右上角控制台。

image-20220407214324135

(2)选择旧版本控制台

image-20220407232517136

(3)选择MQTT物联网套件

image-20220407232606783

(4)创建产品

image-20220407232630923

填写信息。

image-20220407232725045

image-20220407232736326

image-20220407232812445

4.2 创建设备

(1) 添加设备

image-20220407232852936

image-20220407232913340

添加成功。

image-20220407232932023

(2)添加数据流模板

image-20220407233020666

接下来根据自己传感器需要上传的数据,添加对应的数据点。

image-20220407233058239

image-20220407233144528

image-20220407233209509

image-20220407233230137

image-20220407233319296

image-20220407233346548

添加完成。

image-20220407233401589

4.3 软件模拟设备登录测试

(1)MQTT服务器地址信息

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

image-20220407222214766

IP地址: 183.230.40.96
端口号: 1883

(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 <stdio.h>
#include <time.h>
 #include <time.h>
 
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;
}

image-20220407223202125

设备密匙查看:

image-20220407233648314

products/501579/devices/dev1
1680445911
NrbXMe5YHavoxRab+YscPKXcZhWmS04+KE3BHSYqJqA=

生成登录密匙:

image-20220407233837901

version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D

生成的数据就是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}/#	订阅设备所有相关消息

上传数据点的格式介绍: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,        
        }]
    }
}

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

IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: 501579
password: version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D

订阅主题:  $sys/501579/dev1/#
发布主题:  $sys/501579/dev1/dp/post/json
发布消息:  {
    
    "id":123,"dp":{
    
    "BH1750":[{
    
    "v":45}],"DHT11_H":[{
    
    "v":88}],"DHT11_T":[{
    
    "v":26}],"MQ135":[{
    
    "v":66}]}}

发布消息: 
{
    
    "id":123,"dp":{
    
    "BH1750":[{
    
    "v":45}],"DHT11_H":[{
    
    "v":88}],"DHT11_T":[{
    
    "v":26}],"MQ135":[{
    
    "v":66}],"motor":[{
    
    "v":1}],"LED":[{
    
    "v":1}]}}

(4)软件模拟登录测试

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

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

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

image-20220407235032237

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

image-20220407235113433

查看上传的数据。

image-20220407235138797

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

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

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

image-20220408112208888

总结:

云端下发的命令格式:
$sys/501579/dev1/cmd/request/3baf8324-e5d4-43f1-be89-118299c3b583
LED_ON

其中:
3baf8324-e5d4-43f1-be89-118299c3b583  表示当前的请求ID,设备应答的时候需要带上这个ID返回去。
LED_ON  表示云端下发的命令内容


设备收到这个命令之后,需要向云端回应。

回应的格式如下:
发布主题: $sys/501579/dev1/cmd/response/3baf8324-e5d4-43f1-be89-118299c3b583
发布的消息:111

其中:111   是返回给云端的消息内容,111是随便写的,举个例子。

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

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

image-20220408112709317

编辑好参数,点击发送。

image-20220408112738875

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

image-20220408112840193

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

image-20220408112912646

网页上收到正确的响应。

image-20220408112948232

4.4 创建web网页应用

(1)访问新版编辑器

地址:https://open.iot.10086.cn/develop/mqtts/product/#/app/independent?pid=501579

image-20220407235610404

(2)新建项目

image-20220407235904621

image-20220407235919721

根据自己需求设计界面。

image-20220408115201109

接下来需要绑定数据来源,可以显示设备上传的数据。

选中控件,再选择数据源。

image-20220408115341287

点击管理数据源,添加新的数据源。

image-20220408115406816

image-20220408115423890

新增数据源。

image-20220408115552818

image-20220408115607221

注意:上面提示栏里的key从产品页面获取。

image-20220408001204361

创建完之后,在将控件的数据源绑定起来。

image-20220408130236619

然后接下来就继续创建每个仪表盘需要显示的数据源。

注意:为了让数据可以实时显示,这里获取数据点数要填1。

image-20220408132040739

添加的数据源如下:

image-20220408130717348

依次绑定每个仪表盘的数据源。

image-20220408130819673

绑定两个开关的数据源。

image-20220408130914690

每个开关可以向设备端发送命令,修改命令下发的格式。

这里的{V} 表示是一个变量,如果我设置成LED:{V} 那么就表示下发的命令就是LED:0或者是LED:1

image-20220408132218773

image-20220408132346757

表盘可以设置最大数值的范围。

image-20220408134014668

(3)测试数据显示

整体界面已经设计完成,点击右上角的预览。

image-20220408131802734

image-20220408132557195

image-20220408132609565

image-20220408133344338

(4)发布页面

在数据可视化页面发布项目。

image-20220408133508382

然后得到的链接,可以分享给其他人,直接浏览器打开就可以查看传感器数据了。

https://open.iot.10086.cn/view/main/index.html#/share2d?id=624f0a67bb4cd1003509e43b

image-20220408133716278

5. STM32设备端代码

整个项目代码的下载地址: https://download.csdn.net/download/xiaolong1126626497/85588806

串口上会输出当前程序运行的状态信息,可以打开串口调试助手查看。

image-20220408201532756

5.1 LCD汉字取模

LCD上需要显示汉字,使用点阵字模取模软件进行取模。

image-20220408103722736

5.2 硬件连线

image-20220409130153550

image-20220409131142571

image-20220609102417487

1. ESP8266 WIFI接线
ATK-ESP8266串口WIFI模块与STM32的串口2相连接。
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)

2. TFT 1.44 寸彩屏接线
GND   电源地
VCC   接5V或3.3v电源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL	  接PB11

3. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PA5 

4. LED灯-模拟房间的照明灯
VCC--->5V
DAT--->PB12 
GND--->GND

5. 智能窗帘-模拟家里的窗帘
VCC--->5V
DAT--->PB13  
GND--->GND

6. MQ135空气质量检测传感器
VCC--->5V
GND--->GND
DAT--->PA1

7. BH1750环境光检测模块:
SDA-----PB5
SCL-----PB6
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)

8. 板载LED灯接线
LED1---PA8
LED2---PD2

9. 板载按键接线
K0---PA0 
K1---PC5 
K2---PA15

5.2 keil工程布局

image-20220408134704414

image-20220408134725300

5.3 main.c代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "motor.h"
#include "oled.h"
#include "dht11.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "mqtt.h"
#include "iic.h"
#include "bh1750.h"

/*

(1)ESP8266  串口WIFI,用来与OneNet进行远程通信。

(2)DHT11 温度传感器,检测本地环境的温度湿度信息。

(3)继电器,来模拟控制家里的电器。

(4)BH1750 光敏传感器,检测环境光强度

(5)MQ135 空气质量传感器。可以检测可燃气体、烟雾浓度,实现火警预警。

(6)OLED显示屏显示本地的传感器的参数情况,实时展示

*/


//物联网服务器的设备信息
#define MQTT_ClientID "dev1"
#define MQTT_UserName "501579"
#define MQTT_PassWord "version=2018-10-31&res=products%2F501579%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=c9RN5dgyyaCqh1EbkKjqKA%3D%3D"

//订阅与发布的主题
#define SET_TOPIC  "$sys/501579/dev1/#"  //订阅
#define POST_TOPIC "$sys/501579/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            //服务器端口号

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)
{
    
    
	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式
}


u8 motor_flag=0; //窗帘的状态      0表示关闭  1表示打开
u8 led_flag=0;   //房间照明灯状态  0表示关闭  1表示打开
u16 MQ135_data=0; //MQ135烟雾传感器的值
u8 DHT11_T=0; //环境温度
u8 DHT11_H=0; //环境湿度
u8 BH1750_data=0; //环境光照强度

char request_id[100];
char mqtt_message[100];

//WIFI发送数据存储区域
char data_buff[300];

int main()
{
    
    
    u8 esp8266_state=0;
    u8 key;
    u8 i;
    u32 time_cnt=0;
    u32 timer_hour_cnt=0; //记录定时的时间
    
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    LED_Init();
    KEY_Init();
    USART1_Init(115200);
    Moto_Init();  //风扇、加热棒初始化
    USART2_Init(115200);//串口-WIFI
    TIMER2_Init(72,20000); //超时时间20ms
    DHT11_Init();		//初始化DHT11
    Lcd_Init(); //LCD初始化
    Lcd_Clear(0); //清屏为黑色
    LCD_LED_SET;//通过IO控制背光亮		
    AdcInit();  //ADC初始化--检测MQ2烟雾传感器的数据
    IIC_Init();
    printf("正在初始化WIFI请稍等.\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");
        } 
   }
   
    
    //环境温度
   LCD_ShowChineseFont(0,0,16,HZ_FONT_16[0],RED,0);
   LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[1],RED,0);
   LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[2],RED,0);
   LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[3],RED,0);
	 
   //环境湿度
   LCD_ShowChineseFont(0,16*1,16,HZ_FONT_16[4],RED,0);
   LCD_ShowChineseFont(16*1,16*1,16,HZ_FONT_16[5],RED,0);
   LCD_ShowChineseFont(16*2,16*1,16,HZ_FONT_16[6],RED,0);
   LCD_ShowChineseFont(16*3,16*1,16,HZ_FONT_16[7],RED,0);
   
   //光照强度
   LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[8],RED,0);
   LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[9],RED,0);
   LCD_ShowChineseFont(16*2,16*2,16,HZ_FONT_16[10],RED,0);
   LCD_ShowChineseFont(16*3,16*2,16,HZ_FONT_16[11],RED,0);
   
   //空气质量
   LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[12],RED,0);
   LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[13],RED,0);
   LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[14],RED,0);
   LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[15],RED,0);
   
   //智能照明
   LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0);
   LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0);
   LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0);
   LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0);
   
   //智能窗帘
   LCD_ShowChineseFont(0,16*5,16,HZ_FONT_16[20],RED,0);
   LCD_ShowChineseFont(16,16*5,16,HZ_FONT_16[21],RED,0);
   LCD_ShowChineseFont(16*2,16*5,16,HZ_FONT_16[22],RED,0);
   LCD_ShowChineseFont(16*3,16*5,16,HZ_FONT_16[23],RED,0);
   
   while(1)
   {
    
    
        //按键可以手动控制开启窗帘和LED灯
        key=KEY_Scan();
        if(key)printf("key=%d\r\n",key);
       
        //控制LED灯
        if(key==2)
        {
    
    
            led_flag=!led_flag;
            if(led_flag)
            {
    
    
                LED_OUT=1;
            }
            else
            {
    
    
                LED_OUT=0;
            }
        }    
        
        //控制继电器
        if(key==1)
        {
    
    
            motor_flag=!motor_flag; 
            if(motor_flag)
            {
    
    
                MOTOR_OUT=1;
            }
            else
            {
    
    
                MOTOR_OUT=0;
            }
        }    
        
        //轮询时间到达
        if(time_cnt>=100)
        {
    
    
            time_cnt=0;
            LED1=!LED1;
            
            //读取光强度
            BH1750_data=Read_BH1750_Data();
            printf("环境光强度:%d\r\n",BH1750_data);
            
            //获取环境温湿度
            if(DHT11_Read_Data(&DHT11_T,&DHT11_H))
            {
    
    
                printf("温度读取失败.\r\n");
            }
            printf("环境温度:%d\r\n环境湿度:%d\r\n",DHT11_T,DHT11_H);
            
            //获取空气质量
            MQ135_data=GetAdcCHxDATA(1);
            printf("空气质量:%d\r\n",MQ135_data);
            
            //LCD屏实时显示温湿度、空气质量,系统工作状态等等。
            
            //环境温度
            sprintf(data_buff,"%d",DHT11_T);
            Gui_DrawFont_GBK16(72,16*0,RED,0,(u8*)data_buff);
            
            //环境湿度
            sprintf(data_buff,"%d",DHT11_H);
            Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)"       ");
            Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)data_buff);
              
            //环境光强度
            sprintf(data_buff,"%d",BH1750_data);
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)"       ");
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)data_buff);
            
            //空气质量
            sprintf(data_buff,"%d",MQ135_data);
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)"        ");
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);
    
            //智能照明
            sprintf(data_buff,"%d",led_flag);
            Gui_DrawFont_GBK16(72,16*4,RED,0,(u8*)"        ");
            Gui_DrawFont_GBK16(72,16*4,RED,0,(u8*)data_buff);

            //智能窗帘
            sprintf(data_buff,"%d",motor_flag);
            Gui_DrawFont_GBK16(72,16*5,RED,0,(u8*)"        ");
            Gui_DrawFont_GBK16(72,16*5,RED,0,(u8*)data_buff);

            //上报数据
            sprintf(data_buff,"{\"id\":123,\"dp\":{\"BH1750\":[{\"v\":%d}],\"DHT11_H\":[{\"v\":%d}],\"DHT11_T\":[{\"v\":%d}],\"MQ135\":[{\"v\":%d}],\"motor\":[{\"v\":%d}],\"LED\":[{\"v\":%d}]}}",
            BH1750_data,DHT11_H,DHT11_T,MQ135_data,motor_flag,led_flag);
            
            MQTT_PublishData(POST_TOPIC,data_buff,0);
            printf("更新数据.\r\n");
        }
			 
        // 接收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]);
            }
            
            /*
            LED_ON    智能照明灯打开
            LED_OFF   智能照明灯关闭
            MOTOR_ON  智能窗帘打开
            MOTOR_OFF 智能窗帘关闭
            */
            
            //如果是下发了属性
            //len:71,Data:$sys/501579/dev1/cmd/request/162bceba-683c-43d0-a88b-23d6947e5ebeLED_ON
            if(USART2_RX_CNT>5)
            {
    
    
                //向服务器应答
                if(strstr((char*)&USART2_RX_BUFFER[5],"cmd/request/"))
                {
    
      
                    char *p=NULL;
                    p=strstr((char*)&USART2_RX_BUFFER[5],"cmd/request/");
                    if(p)
                    {
    
            
                        //解析数据
                        strncpy(request_id,p+12,36);      
                    }
                    
                    //$sys/501579/dev1/cmd/response/162bceba-683c-43d0-a88b-23d6947e5ebe
                    
                    //上报给服务器的数据
                    sprintf(mqtt_message,"success");
                    
                    //应答主题
                    sprintf(data_buff,"$sys/501579/dev1/cmd/response/%s",request_id);
                    
                    MQTT_PublishData(data_buff,mqtt_message,0);
                    
                    printf("发布主题:%s\r\n",data_buff);
                    printf("发布数据:%s\r\n",mqtt_message);
                }
                
                //LED:0 LED:1 MOTOR:0 MOTOR:1
                
                //开灯
                if(strstr((char*)&USART2_RX_BUFFER[5],"LED:0"))
                {
    
    
                    LED_OUT=0;
                    led_flag=0;
                }
                //关灯
                else if(strstr((char*)&USART2_RX_BUFFER[5],"LED:1"))
                {
    
    
                    LED_OUT=1;
                    led_flag=1;
                }
                //开窗帘
                else if(strstr((char*)&USART2_RX_BUFFER[5],"MOTOR:0"))
                {
    
    
                    MOTOR_OUT=0;
                    motor_flag=0;
                }
                //关窗帘
                else if(strstr((char*)&USART2_RX_BUFFER[5],"MOTOR:1"))
                {
    
    
                    MOTOR_OUT=1;
                    motor_flag=1;
                }
            }
            
            USART2_RX_CNT=0;
            USART2_RX_FLAG=0;
        }
        
        DelayMs(10);
        time_cnt++;
        timer_hour_cnt++;
	 }
}

猜你喜欢

转载自blog.csdn.net/xiaolong1126626497/article/details/125198551