1. 功能介紹
隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展,智能家居控制系統(tǒng)成為了人們追求便捷、舒適和安全生活的重要組成部分。為了滿足用戶對(duì)智能家居的需求,設(shè)計(jì)了一款基于華為云物聯(lián)網(wǎng)平臺(tái)的智能家居控制系統(tǒng),硬件采用了STM32和ESP8266的組合,實(shí)現(xiàn)了設(shè)備的上云連接。
傳統(tǒng)的家居控制系統(tǒng)存在一些不足,比如需要人工操作、無(wú)法實(shí)現(xiàn)遠(yuǎn)程控制等。而我們的智能家居控制系統(tǒng),通過(guò)與華為云物聯(lián)網(wǎng)平臺(tái)的連接,可以實(shí)現(xiàn)遠(yuǎn)程控制各種電器開關(guān),并且可以遠(yuǎn)程收集家里煤氣、天然氣、煙霧、光照度、溫度濕度等信息,為用戶提供更加智能化和便捷的家居體驗(yàn)。
智能家居控制系統(tǒng)具有以下主要特點(diǎn)和功能:
- 遠(yuǎn)程控制:通過(guò)與華為云物聯(lián)網(wǎng)平臺(tái)的連接,用戶可以通過(guò)手機(jī)APP或者Web界面實(shí)現(xiàn)對(duì)家里各種電器開關(guān)的遠(yuǎn)程控制。比如,可以遠(yuǎn)程打開空調(diào)、關(guān)閉燈光等,無(wú)論身在何處都能夠?qū)崿F(xiàn)對(duì)家居設(shè)備的控制。
- 多種傳感器數(shù)據(jù)采集:系統(tǒng)采用了多種傳感器,包括煤氣傳感器、天然氣傳感器、煙霧傳感器、光照度傳感器、溫濕度傳感器等,可以實(shí)時(shí)采集家里的環(huán)境信息。這些數(shù)據(jù)通過(guò)ESP8266模塊上傳到華為云物聯(lián)網(wǎng)平臺(tái),用戶可以隨時(shí)查看家居環(huán)境的狀態(tài)。
- 安全監(jiān)測(cè):通過(guò)煤氣傳感器、天然氣傳感器和煙霧傳感器等,我們的系統(tǒng)可以實(shí)時(shí)監(jiān)測(cè)家里的安全狀況。一旦檢測(cè)到異常情況,比如煤氣泄漏或者火災(zāi),系統(tǒng)會(huì)立即發(fā)送警報(bào)通知用戶,保障家庭安全。
- 智能化場(chǎng)景設(shè)置:基于華為云物聯(lián)網(wǎng)平臺(tái)的數(shù)據(jù)處理能力,智能家居控制系統(tǒng)可以實(shí)現(xiàn)智能化的場(chǎng)景設(shè)置。比如,用戶可以根據(jù)時(shí)間、溫度、濕度等條件,設(shè)置自動(dòng)調(diào)節(jié)空調(diào)溫度,實(shí)現(xiàn)節(jié)能和舒適的效果。
硬件介紹:
主控MCU: STM32F103ZET6
煙霧檢測(cè)傳感器: MQ2
天然氣檢測(cè)傳感:MQ5
溫度濕度檢測(cè)傳感器: DHT11
光照強(qiáng)度檢測(cè)傳感器: BH1750
物聯(lián)網(wǎng)云平臺(tái): 華為云物聯(lián)網(wǎng)平臺(tái)
電器開關(guān)模擬采用板載的LED燈、繼電器。
WIFI: ESP8266
這是支持串口AT指令控制的WIFI模塊,聯(lián)網(wǎng)比較方便。
與華為云物聯(lián)網(wǎng)平臺(tái)通信的協(xié)議: MQTT
說(shuō)明: 當(dāng)前程序里的MQTT協(xié)議代碼是參考MQTT官方文檔編寫的,不是使用ESP8266內(nèi)置的,所以程序并不依賴ESP8266專用或者指定的SDK,使用任意可以上網(wǎng)的網(wǎng)卡都可以套用,并不是一定非要使用ESP8266。
2. 登錄華為云創(chuàng)建云端設(shè)備
2.1 創(chuàng)建產(chǎn)品
華為運(yùn)官網(wǎng): https://www.huaweicloud.com/
在這里可以查看接入的協(xié)議的端口號(hào)和地址。
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
我們?cè)O(shè)備接入的協(xié)議選擇MQTT,端口對(duì)應(yīng)是1883
接下來(lái)繼續(xù)創(chuàng)建產(chǎn)品,點(diǎn)擊產(chǎn)品頁(yè)面,點(diǎn)擊右上角創(chuàng)建產(chǎn)品:
2.2 創(chuàng)建設(shè)備
這是我的設(shè)備信息:
設(shè)備ID
61a580fad28ce3028832c2d8_esp8266_iot
?
設(shè)備密鑰
1126626497
{
"device_id": "61a580fad28ce3028832c2d8_esp8266_iot",
"secret": "1126626497"
}
2.3 產(chǎn)品模型定義
這一步就是設(shè)置上報(bào)設(shè)備的屬性,也就是設(shè)備的數(shù)據(jù)類型定義。
2.4 生成MQTT登錄密匙
創(chuàng)建完產(chǎn)品、設(shè)備之后,接下來(lái)就需要知道如何通過(guò)MQTT協(xié)議登陸華為云服務(wù)器。
官方的詳細(xì)介紹在這里: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
MQTT設(shè)備登陸密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
下面就得到了MQTT協(xié)議設(shè)備登錄的參數(shù)。
2.5 使用MQTT客戶端軟件登錄
所有的參數(shù)已經(jīng)得到,接下來(lái)采用MQTT客戶端登錄華為云進(jìn)行測(cè)試。
下面這個(gè)軟件是自己開發(fā)的,為了方便測(cè)試MQTT協(xié)議登錄。
華為云物聯(lián)網(wǎng)平臺(tái)的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
華為云物聯(lián)網(wǎng)平臺(tái)的IP地址是: 121.36.42.100
在軟件里參數(shù)填充正確之后,就看到設(shè)備已經(jīng)連接成功了。
接下來(lái)打開設(shè)備頁(yè)面,可以看到設(shè)備已經(jīng)在線了。
2.6 上報(bào)數(shù)據(jù)
在這個(gè)文檔里介紹了MQTT上報(bào)數(shù)據(jù)的格式。
總結(jié)的格式:
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/messages/down
?
//設(shè)備上報(bào)數(shù)據(jù)
$oc/devices/61a580fad28ce3028832c2d8_esp8266_iot/sys/properties/report
?
//上報(bào)的屬性消息 (一次可以上報(bào)多個(gè)屬性,在json里增加就行了)
{"services": [{"service_id": "dht11","properties":{"DHT11-C":50}}]}
下面采用MQTT軟件上報(bào)數(shù)據(jù):
到此,設(shè)備數(shù)據(jù)已經(jīng)上報(bào)成功,如果需要增加更多的屬性,按照流程繼續(xù)增加即可。
3. STM32+ESP8266上報(bào)數(shù)據(jù)到華為云
項(xiàng)目源碼下載: https://download.csdn.net/download/xiaolong1126626497/81993720
3.1 硬件設(shè)備效果圖
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(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:1\\r\\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:2\\r\\n");
IIC_Stop(); //停止信號(hào)
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:3\\r\\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:4\\r\\n");
IIC_Stop(); //停止信號(hào)
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:5\\r\\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:6\\r\\n");
IIC_Stop(); //停止信號(hào)
DelayMs(300); //等待
IIC_Start(); //發(fā)送起始信號(hào)
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:7\\r\\n");
t0=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(0); //發(fā)送應(yīng)答信號(hào)
t1=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
IIC_Stop(); //停止信號(hào)
t=(((t0< 8)|t1)/1.2);
return t;
}