1. 功能介绍
随着物联网技术的快速发展,智能家居控制系统成为了人们追求便捷、舒适和安全生活的重要组成部分。为了满足用户对智能家居的需求,设计了一款基于华为云物联网平台的智能家居控制系统,硬件采用了STM32和ESP8266的组合,实现了设备的上云连接。
传统的家居控制系统存在一些不足,比如需要人工操作、无法实现远程控制等。而我们的智能家居控制系统,通过与华为云物联网平台的连接,可以实现远程控制各种电器开关,并且可以远程收集家里煤气、天然气、烟雾、光照度、温度湿度等信息,为用户提供更加智能化和便捷的家居体验。
智能家居控制系统具有以下主要特点和功能:
远程控制:通过与华为云物联网平台的连接,用户可以通过手机APP或者Web界面实现对家里各种电器开关的远程控制。比如,可以远程打开空调、关闭灯光等,无论身在何处都能够实现对家居设备的控制。
多种传感器数据采集:系统采用了多种传感器,包括煤气传感器、天然气传感器、烟雾传感器、光照度传感器、温湿度传感器等,可以实时采集家里的环境信息。这些数据通过ESP8266模块上传到华为云物联网平台,用户可以随时查看家居环境的状态。
安全监测:通过煤气传感器、天然气传感器和烟雾传感器等,我们的系统可以实时监测家里的安全状况。一旦检测到异常情况,比如煤气泄漏或者火灾,系统会立即发送警报通知用户,保障家庭安全。
智能化场景设置:基于华为云物联网平台的数据处理能力,智能家居控制系统可以实现智能化的场景设置。比如,用户可以根据时间、温度、湿度等条件,设置自动调节空调温度,实现节能和舒适的效果。
硬件介绍:
主控MCU: STM32F103ZET6
烟雾检测传感器: MQ2
天然气检测传感:MQ5
温度湿度检测传感器: DHT11
光照强度检测传感器: BH1750
物联网云平台: 华为云物联网平台
电器开关模拟采用板载的LED灯、继电器。
WIFI: ESP8266 这是支持串口AT指令控制的WIFI模块,联网比较方便。
与华为云物联网平台通信的协议: MQTT
说明: 当前程序里的MQTT协议代码是参考MQTT官方文档编写的,不是使用ESP8266内置的,所以程序并不依赖ESP8266专用或者指定的SDK,使用任意可以上网的网卡都可以套用,并不是一定非要使用ESP8266。
2. 登录华为云创建云端设备
2.1 创建产品
华为运官网: https://www.huaweicloud.com/
在这里可以查看接入的协议的端口号和地址。
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
我们设备接入的协议选择MQTT,端口对应是1883
接下来继续创建产品,点击产品页面,点击右上角创建产品:
2.2 创建设备
这是我的设备信息:
设备ID
61a580fad28ce3028832c2d8_esp8266_iot
设备密钥
1126626497
{
"device_id": "61a580fad28ce3028832c2d8_esp8266_iot",
"secret": "1126626497"
}
2.3 产品模型定义
这一步就是设置上报设备的属性,也就是设备的数据类型定义。
2.4 生成MQTT登录密匙
创建完产品、设备之后,接下来就需要知道如何通过MQTT协议登陆华为云服务器。
官方的详细介绍在这里: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
MQTT设备登陆密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
下面就得到了MQTT协议设备登录的参数。
2.5 使用MQTT客户端软件登录
所有的参数已经得到,接下来采用MQTT客户端登录华为云进行测试。
下面这个软件是自己开发的,为了方便测试MQTT协议登录。
华为云物联网平台的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
华为云物联网平台的IP地址是: 121.36.42.100
在软件里参数填充正确之后,就看到设备已经连接成功了。
接下来打开设备页面,可以看到设备已经在线了。
2.6 上报数据
官方文档: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
在这个文档里介绍了MQTT上报数据的格式。
总结的格式:
//订阅主题: 平台下发消息给设备 $oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/messages/down //设备上报数据 $oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/properties/report //上报的属性消息 (一次可以上报多个属性,在json里增加就行了) {"services": [{"service_id": "dht11","properties":{"DHT11-C":50}}]}
下面采用MQTT软件上报数据:
到此,设备数据已经上报成功,如果需要增加更多的属性,按照流程继续增加即可。
3. STM32+ESP8266上报数据到华为云
项目源码下载: https://download.csdn.net/download/xiaolong1126626497/81993720
3.1 硬件设备效果图
3.2 BH1750.c 光照度传感器
#include "bh1750.h"
float Read_BH1750_Data()
{
unsigned char t0;
unsigned char t1;
float t;
u8 r_s=0;
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:1 ");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:2 ");
IIC_Stop(); //停止信号
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:3 ");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:4 ");
IIC_Stop(); //停止信号
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:5 ");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:6 ");
IIC_Stop(); //停止信号
DelayMs(300); //等待
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:7 ");
t0=IIC_ReadOneByteData(); //接收数据
IIC_SendACK(0); //发送应答信号
t1=IIC_ReadOneByteData(); //接收数据
IIC_SendACK(1); //发送非应答信号
IIC_Stop(); //停止信号
t=(((t0< < 8)|t1)/1.2);
return t;
}
3.3 ESP8266.c WIFI代码
#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功 1表示失败
*/
u8 ESP8266_SendCmd(char *cmd)
{
u8 i,j;
for(i=0;i< 10;i++) //检测的次数--发送指令的次数
{
USARTx_StringSend(USART3,cmd);
for(j=0;j< 100;j++) //等待的时间
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]=' ';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"OK"))
{
return 0;
}
}
}
}
return 1;
}
/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功 1表示失败
*/
u8 ESP8266_Init(void)
{
//退出透传模式
USARTx_StringSend(USART3,"+++");
delay_ms(50);
return ESP8266_SendCmd("AT ");
}
/*
函数功能: TCP服务器模式下的发送函数
发送指令:
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100]; //组合发送过程中的命令
for(i=0;i< 10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d ",id,len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j< 10;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]=' ';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER," >"))
{
//继续发送数据
USARTx_DataSend(USART3,data,len);
//等待数据发送成功
for(n=0;n< 200;n++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]=' ';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
/*
函数功能: 配置WIFI为STA模式+TCP客户端模式
函数参数:
char *ssid 创建的热点名称
char *pass 创建的热点密码 (最少8位)
char *p 将要连接的服务器IP地址
u16 port 将要连接的服务器端口号
u8 flag 1表示开启透传模式 0表示关闭透传模式
函数返回值:0表示成功 其他值表示对应的错误
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
char ESP8266_SendCMD[100]; //组合发送过程中的命令
//退出透传模式
//USARTx_StringSend(USART3,"+++");
//delay_ms(50);
/*1. 测试硬件*/
if(ESP8266_SendCmd("AT "))return 1;
/*2. 关闭回显*/
if(ESP8266_SendCmd("ATE0 "))return 2;
/*3. 设置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=1 "))return 3;
/*4. 复位*/
ESP8266_SendCmd("AT+RST ");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 关闭回显*/
if(ESP8266_SendCmd("ATE0 "))return 5;
/*6. 配置将要连接的WIFI热点信息*/