1. 前言
智能系統作為新興產業,是國家重點發展產業之一。國外自美國在1984年建設出真正的智能建筑至今為止已經有30多年的歷史了。由于智能家居的安全、高效、便捷以,及智能化等獨特魅力,使智能家居行業在2003年逐步進入我國的家居市場,但是由于我國起步晚,使得智能家居行業標準在我國家居市場上并不統一。隨著全球資源的不斷減少以及環境的破壞,“節能環保”成為了全球科技發展的首要要求,而“全球智能化”在節能環保方面的優勢使得智能家居成為了發展主流,因此具有十分廣闊的市場前景。同時,隨著科技的進步,傳統建筑已經不能滿足現代人對生活方面舒適度的需求,而智能系統也在不知不覺間滲入我們的生活。
智能家居(smart home)以住宅為平臺,利用嵌入式單片機為核心控制器來實現無 線通信、安全防范及自動控制技術的智能家居環境的系統集成,用以實現對智能家居 環境的遠程安防監控,環境監測以及各個子系統的控制,構建了高效智能的住宅設施 與家庭安全的管理系統,家居智能性、安全性,便利性和舒適性等都有顯著提高,有效的提高了人們生活品質。
智能家居不僅提供舒適宜人且高品位的家庭生活空間,實現更智能的家庭安防系統;還將家居環境由原來的被動靜止結構轉變為具有能動智慧的工具,提供全方位的信息交互功能。物聯網中的無線傳感器應用對家庭的智能防災,燈光控制,以及家電聯網都提供了一種很好的解決辦法。而且使用GPRS通信模塊,可以將家庭中的突發事件信息告知戶主,并且進行智能報警。這樣就極大降低了家庭意外災難的損失。
本次設計結合現代生活的具體需求,設計出一套基于華為云IoT設計的云平臺監控系統,可以遠程實時查看家里光照強度、溫濕度等信息,支持在云端控制家里的電器設備,實現遠程控制。
2. 具體需求
主要實現對光照強度、溫濕度等信息的實時監測,將相關信息、設備狀態信息等實時顯示,通過ESP8266wifi模塊進行聯網可實現遠程數據傳輸,利用華為云IoT物聯網云平臺,MQTT傳輸協議,調用華為云IOT平臺提供的接口設計上位機實現遠程控制顯示。
硬件選項要求:
(1)ESP8266 串口WIFI,用來與OneNet進行遠程通信。
(2)DHT11 溫度傳感器,檢測本地環境的溫度濕度信息。
(3)繼電器,來模擬控制家里的電器。
(4)BH1750 光敏傳感器,檢測環境光強度
(5)MQ135 空氣質量傳感器。可以檢測可燃氣體、煙霧濃度,實現火警預警。
(6)OLED顯示屏顯示本地的傳感器的參數情況,實時展示
3. 硬件選型
3.1 繼電器
3.2 ESP8266 WIFI
(1)模塊采用串口(LVTTL)與MCU(或其他串口設備)通信,內置TCP/IP協議棧,能夠實現串口與WIFI之間的轉換
(2)模塊支持LVTTL串口,兼容3.3V和5V單片機系統
(3)模塊支持串口轉WIFI STA、串口轉AP和WIFI STA+WIFIAP的模式,從而快速構建串口-WIFI數據傳輸方案
3.3 MQ-135空氣質量傳感器
MQ135傳感器對氨氣、硫化物、苯系蒸汽的靈敏度高,對煙霧和其它有害的監測也很理想。這種傳感器可檢測多種有害氣體,是一款適合多種應用的低成本傳感器。
3.4 DHT11溫濕度傳感器
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有可靠性與卓越的長期穩定性,成本低、相對濕度和溫度測量、快響應、抗干擾能力強、信號傳輸距離長、數字信號輸出、精確校準。傳感器包括一個電容式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。可用于暖通空調、除濕器、測試及檢測設備、消費品、汽車、自動控制、數據記錄器、氣象站、家電、濕度調節器、醫療、其他相關濕度檢測控制。
特點如下:
1、可以檢測周圍環境的濕度
2、可以檢測周圍環境的溫度
3、濕度測量范圍:20%-95%(0度-50度范圍)濕度測量誤差:±5%4、溫度測量范圍:o度-50度溫度測量誤差:±2度
4、工作電壓3.3V-5V
5、輸出形式數字輸出
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彩屏,可以顯示當前傳感器數據以及一些運行狀態信息。
3.6 OLED顯示屏
特點:
OLED是有機發光二極管又稱為有機激光顯示、OLED顯示技術具有自發光的特性、采用非常薄的有機材料涂層、和玻璃基板、當有電流通過時、這些有機材料就會發光、而且OLED顯示屏幕可視角大、功耗低、OLED由于同時具備自發光、不需背光源(只是供電不會亮的、驅動程序和接線正確才會點亮)對比度高、厚度薄視角廣、反應速度快、可用于撓曲面板、使用溫度范圍廣、結構及制程等優異之特性、先接觸的1286屏都是LCD的、需要背光、功耗較高、而OLED的功耗低、更加適合小系統、由于兩者發光材料的不同、在不同的環境中、OLED的顯示效果好、模塊供電可以是3.3v也可以是5V、不需要修改模塊電路、OLED屏具有多個控制指令、可以控制oLED的亮度、對比度、開關升壓電路等指令、操作方便、功能豐富、可顯示漢字、ASCH、圖案等、同時為了方便應用在產品上、預留4個M3固定孔、方便用戶固在機殼上。
3.7 母對母杜邦線
3.8 BH1750光敏傳感器
4. 登錄華為云創建云端設備
4.1 創建產品
華為運官網: https://www.huaweicloud.com/
在這里可以查看接入的協議的端口號和地址。
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
我們設備接入的協議選擇MQTT,端口對應是1883
接下來繼續創建產品,點擊產品頁面,點擊右上角創建產品:
4.2 創建設備
這是我的設備信息:
設備ID 61a580fad28ce3028832c2d8_esp8266_iot 設備密鑰 1126626497 { "device_id": "61a580fad28ce3028832c2d8_esp8266_iot", "secret": "1126626497" }
4.3 產品模型定義
這一步就是設置上報設備的屬性,也就是設備的數據類型定義。
4.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協議設備登錄的參數。
4.5 使用MQTT客戶端軟件登錄
所有的參數已經得到,接下來采用MQTT客戶端登錄華為云進行測試。
下面這個軟件是自己開發的,為了方便測試MQTT協議登錄。
華為云物聯網平臺的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
華為云物聯網平臺的IP地址是: 121.36.42.100
在軟件里參數填充正確之后,就看到設備已經連接成功了。
接下來打開設備頁面,可以看到設備已經在線了。
4.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軟件上報數據:
到此,設備數據已經上報成功,如果需要增加更多的屬性,按照流程繼續增加即可。
5. STM32設備端代碼
串口上會輸出當前程序運行的狀態信息,可以打開串口調試助手查看。
5.1 LCD漢字取模
LCD上需要顯示漢字,使用點陣字模取模軟件進行取模。
5.2 硬件連線
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工程布局
工程Get地址: https://download.csdn.net/download/xiaolong1126626497/81993720
5.3 main.c代碼
#include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include #include "timer.h" #include "esp8266.h" #include "motor.h" #include "oled.h" #include "dht11.h" #include "adc.h" #include #include #include "font.h" #include "mqtt.h" #include "iic.h" #include "bh1750.h" /* (1)ESP8266 串口WIFI,用來與華為云IOT進行遠程通信。 (2)DHT11 溫度傳感器,檢測本地環境的溫度濕度信息。 (3)繼電器,來模擬控制家里的電器。 (4)BH1750 光敏傳感器,檢測環境光強度 (5)MQ135 空氣質量傳感器。可以檢測可燃氣體、煙霧濃度,實現火警預警。 (6)OLED顯示屏顯示本地的傳感器的參數情況,實時展示 */ //華為物聯網服務器的設備信息 #define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510" #define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497" #define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242" //訂閱與發布的主題 #define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //訂閱 #define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //發布 //設置連接的路由器信息 #define CONNECT_WIFI "Xiaomi_meizi6" //將要連接的路由器名稱 --不要出現中文、空格等特殊字符 #define CONNECT_PASS "12170307yu" //將要連接的路由器密碼 #define CONNECT_SERVER_IP "121.36.42.100" //服務器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,"{\"services\":{\"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;i5) { //向服務器應答 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); } //上報給服務器的數據 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++; } }
IoT 硬件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。