華厚強 戴奎
(中國民用航空飛行學院航空工程學院,四川廣漢 618307)
嵌入式單片機的技術發展推動了智能家居產業的進步,計算機和通信技術的快速發展也為該行業發展提供了技術基礎?,F階段,我國智能家居快速發展的同時,主要存在著物聯網和人工智能的技術突破不足、行業標準不統一、產品價格過高、系統操作繁瑣、部分產品偽智能化等方面的問題。智能家居在技術和質量水平上還處于上升發展階段,具有很大的進步空間和廣闊的市場前景,將來會隨著人工智能技術的進步到達新的高度[1]。

圖1 系統總設計框圖Fig.1 System total design block diagram
本文擬基于STM32微控制器設計出一款簡易節能、低成本的智能家居控制器,可對室內環境進行智能調節。
以STM32F103C8T6單片機為主微控制器,實現的功能包括:經由溫濕度傳感器模塊進行信息采集,將信息在OLED模塊上顯示出來;并通過光強模塊檢測光照強度,使用按鍵對溫濕度和氣體進行上限限制,當室內溫濕度到達設置上限時,會通過控制繼電器來控制空調和加濕器的運行來調節室內溫濕度;當室內煙霧濃度過高時,會觸發蜂鳴器報警,同時控制步進電機操縱窗簾系統來輔助調節煙霧濃度和光強。系統總體設計框架如圖1所示。
采用模塊化的系統設計思想,硬件系統功能部分的模塊化設計分為主控功能模塊和其他功能模塊。主控制模塊是基于Cortex-M3的微控制器最小系統板。外圍電路主要由OLED顯示、DHT11溫濕度傳感器、MQ-2煙霧傳感器、GY-30光照傳感器控制、繼電器控制和步進驅動電機控制等模塊組成。
采用STM32單片機為系統的主控芯片。在芯片的輸入和輸出端均并聯穩壓電容,使輸出電壓能穩定保持在3.3V。
采用獨立按鍵方式,三個按鍵分別滿足對預警值的加、減和完成設置。在硬件設計時沒有設置的上拉電阻,在程序中體現在對按鍵所使用的三個端口進行上拉輸入的初始化設置。顯示模塊為基于三線SPI通信的七線制OLED顯示屏模塊,采用三條通信線路傳輸數據。
選用單總線協議的DHT11模塊作為溫濕度采集模塊,采用以數字信號形式輸出的單總線數據格式。只需一根引腳來進行數據的雙向輸入與輸出,每次傳輸的數據大小為5字節,高位優先。每個字節的數據表示為濕度整數值、濕度小數值、溫度整數值、溫度小數值和校驗[2]。傳輸的數據都是未編碼的二進制數據。
設計了室內煙霧超標報警功能,對MQ-2煙霧報警器的要求僅限于可燃氣體和其他氣體濃度超標時報警,不需要顯示。以數字信號輸出的模式,連通3號引腳,選擇DO模式,TTL高低電平端輸出的是數字信號。正常情況下,檢測不到煙霧時,引腳處于高電平狀態。當檢測到煙霧時,MQ-2會向單片機的PA1引腳輸出一個低電平信號。當系統接收到來自MQ-2的信號后,經過處理后向PA3引腳即報警電路部分發送一個高電平信號,使蜂鳴器工作并報警。如果選擇連接4號腳,斷開3號腳,打開AO模式,可以更好地實時監測室內氣體濃度。
使用GY-30光照傳感器模塊對室內光線采集,其主控芯片為BH1750FVI,擁有較強靈敏度,可檢測在1Lx-65535Lx范圍內的光照變化。設計中只使用一個光強傳感器,將ADDR引腳浮空,表示默認器件地址,也就是低電平,寫操作指令為0x46,讀操作指令為0x47。
選用SRD-05VDC-SL-C繼電器,通過連接繼電器控制電路,實現控制負載與家用電器的開關。加濕器、加熱器等是大功率強電設備,單片機通過放大電路控制繼電器,繼電器通過電磁感應控制后端強電設備。利用步進電機的正反轉來控制窗簾開關,把電脈沖信號轉化為角位移來驅動設備。當采集的光照強度小于設置的預警值時,主控制器控制電機打開窗簾,否則關閉窗簾。
軟件程序流程圖如圖2所示,主要實現各外部設備的初始化、溫濕度檢測、氣體濃度檢測、燈光檢測、繼電器控制、步進電機操作和顯示屏顯示,以溫濕度、氣體濃度和采光量的含量為判斷依據來運行系統。程序編寫開發在基于ARM的Keil uVision5軟件(俗稱MKD5)上完成。
系統初始化后,通過按鍵來對溫濕度和光照的閥值進行設定,按鍵掃描函數KEY_Scan()通過檢測掃描確定是否有按鍵按下,在消除抖動10毫秒后確定哪個鍵被按下,然后執行相應鍵的功能。顯示函數通過LCD_Print()實現,可輸出漢字和字符串,并設置顯示的字體尺寸。對濕度預警值進行按鍵設置并顯示的代碼如下所示:

圖2 系統軟件設計流程圖Fig.2 System software design flow chart

圖3 燈光采集程序流程圖Fig.3 Flow chart of light collection program
void setHumi( )
{
LCD_Print(0, 0, "set Humi Value", TYPE16X16,TYPE8X16);
memset(buf, 0, sizeof(buf));
sprintf(buf, "%d", humiValue);
LCD_Print(60, 16, buf, TYPE16X16, TYPE8X16);
while(1)
{
key = KEY_Scan(0);
if(key == 1)
{
humiValue ++;
memset(buf, 0, sizeof(buf));
sprintf(buf, "%d", humiValue);
LCD_Print(60, 16, buf, TYPE16X16, TYPE8X16);
}
else if(key == 2)
{
humiValue --;
memset(buf, 0, sizeof(buf));
sprintf(buf, "%d", humiValue);
LCD_Print(60, 16, buf, TYPE16X16, TYPE8X16);
}
else if(key == 3)
{
break;
}
}
}
選用DHT11作為溫濕度采集模塊,用單引腳進行輸入和輸出雙向的數據傳輸,PA11引腳要進行輸入和輸出的初始化。輸入模式時GPIO引腳應處于浮空,而輸出模式時處于推挽輸出。系統上電后先進行模塊初始化,之后主控制器發送指令檢測模塊是否工作。然后系統開始讀取模塊采集到的信息,單引腳傳輸,數據一位一位地進行傳輸,每次傳輸5個字節,通過算法計算校驗和與實際符合后,在主函數中調用子函數DHT11_Read_Data()將讀取到的所測溫濕度通過顯示函數顯示出來。
選用的GY-30光照采集模塊基于IIC協議進行通信[3]。先完成IIC通信程序,再依照BH1750fvi芯片發出的控制指令對光照數據進行獲取。IIC通信程序與光照模塊的程序設計流程圖如圖3所示。
采用MKD5軟件對程序進行編譯和下載,在系統開機完成初始化后,通過按鍵對溫濕度及光照強度進行閥值的設定,并顯示在OLED屏上。在完成預警值的設定以后系統進入待定狀態,實時監測環境信息并顯示在屏幕上,一旦某參數的數據超過所設的閥值時,會通過控制繼電器來控制開啟或關閉空調(加熱器)和加濕器等大功率電器來調節溫濕度,或者通過控制步進電機進行控制窗簾的開關來調節光照強度,或者對室內火災或煤氣泄露等煙霧異常的緊急情況進行報警,來達到智能調節室內環境的目的。經過實際測試,結果表明:本控制器系統可以順利地實現預設功能。
基于STM32的智能家居控制器主要實現了對室內溫濕度以及光照的監測和顯示,并通過感知溫濕度的強弱來操縱繼電器控制空調和加濕器等家電調節環境,通過感知光照的強弱來控制步進電機開關窗簾,還輔以煙霧報警器來更好的對室內環境進行監測和調節。該設計思路較簡單,功能較全面,具有一定的使用和推廣價值。