謝明瑋,李里程,彭善瓊
(湖南第一師范學院 計算機學院,湖南 長沙 410205)
現階段物聯網家居系統主要采用硬件模塊化設計,系統由單片機、低功耗通信硬件等組成,在房間或區域部署不同類別的傳感器,用于監測溫度、氣體等環境數據,并利用手機終端APP客戶端分析數據后將數值反饋給使用者,例如NEST HOME系統、“智能家庭”系統等。這些系統的弊端是硬件價格高昂,因此,本文嘗試利用近些年在國內外創客領域、高校流行的開源硬件平臺技術[1-5],設計與構建了一款融合多傳感器的物聯網家居硬件“IoT家居小盒子”及配套軟件,以探索低成本物聯網家居硬件系統開發的可行之道。
系統由硬件控制子系統、軟件操作子系統構成。兩個系統共同實現了輸入設備的信號采集與分析功能。硬件控制子系統通過開發板與傳感器、執行件等電子零件連接,實現環境數據的采集檢測與用戶反饋等功能。軟件操作子系統在硬件控制子系統的基礎上,采用藍牙模塊,以無線傳輸的方式將數據反饋至手機端應用程序,便于用戶不受時間、位置等限制查看居家環境信息。系統總體架構設計如圖1所示。

圖1 系統總體架構
硬件控制子系統由Arduino開發板(主控制器)、傳感器模塊、執行件模塊、紅外遙控模塊組成,如圖2所示。

圖2 硬件控制子系統架構
傳感器模塊用于系統獲取環境檢測數值,傳感器一般有3個引腳,一個正極、一個負極和一個數據接口,它與Arduino開發板的連接十分便捷,對應正負極,確定傳感器的數據傳輸為模擬信號或數字信號,再將數據引腳連接至開發板相應區域的接口處即可。硬件控制子系統使用的傳感器模塊主要包括以下內容[6-7]:
(1)LM35溫度傳感器,用于監測環境溫度,輸出的電壓與溫度成線性關系,通過對溫度數值的判斷,系統可以提醒用戶注意天氣變化。
(2)DHT11濕度傳感器,用于監測環境濕度,輸出40 bit的監測數據,通過對環境濕度數據的提取,提醒用戶防潮或注意保濕。
(3)MQ135氣體傳感器,用于檢測環境空氣質量,可以探測空氣中是否含有氮氣、煙霧、硫化物等氣體,并且通知用戶當前環境的空氣質量等級,提醒用戶通風換氣;探測家中有害氣體,如煤氣、液化氣、天然氣等,用于家居安全保障,警示用戶家中煤氣泄漏等情況。
(4)火焰傳感器,利用紅外線接收管捕捉紅外波長從而檢測火焰值,同時可以檢測環境中的光線強度,一是可以預報火情,二是提醒用戶根據光線變化注意用眼衛生。
(5)振動傳感器,通過檢測硬件擺放位置附近與本體的微弱振動信號,反饋與告警用戶。
執行件模塊主要用于人機交互,提示用戶操作成功與否,顯示數據信息,為用戶提供良好的交互體驗。硬件控制子系統使用的執行件模塊主要包括以下內容:
(1)RGB模塊,采用HSB設置,通過色相/飽和度/亮度三要素發出不同顏色、不同明暗程度的燈光。通過不同燈光的切換,提醒用戶在按下遙控器按鍵之后,開發板接收到紅外遙控器傳送的編碼,給用戶一個交互成功的反饋信息。
(2)LED模塊,設定之后會顯示警示紅燈,當主控器監測到如火情、有害氣體濃度高等危險情況時,會立即閃爍,警示用戶注意安全。
(3)LCD模塊液晶屏采用I2C集成電路總線的串行通信方式,有串行數據線SDA和串行時鐘線SCL引腳,模塊主要顯示傳感器監測的數值,并告知用戶采取相應措施。
(4)8×8點陣屏,其由64個發光二極管組成,在用戶遙控進入不同的功能子模塊后,點陣屏會根據系統判斷的結果進入不同的場景,顯示不同的關聯圖標,實現交互目的。
(5)蜂鳴器,其與LED模塊類似,均在險情發生時警告用戶,當環境監測值達到風險閾值范圍后,蜂鳴器發出警報,長鳴告警用戶。
(6)揚聲器模塊,通過設定不同的頻率,可以產生不同的音調與旋律,提升設備使用的趣味性。
硬件具備單機按鍵使用和遠程遙控使用功能,通過紅外遙控模塊,用戶可以直接進行硬件功能切換。紅外遙控模塊流程如圖3所示。

圖3 紅外遙控模塊流程
在圖3中,硬件控制子系統設置了一個全局判斷變量,啟動系統之后會判別標志位,進入功能首頁,執行件中的LCD屏幕顯示歡迎界面。借助紅外遙控器按鍵切換功能,開發板上連接的紅外接收器會接收一個紅外編碼值,根據接收的編碼值對全局標志位進行變更,完成一輪控制,緊接著循環判斷標志位的值,進入相應的傳感器功能模塊,并開啟下一個傳感器的功能檢測。
軟件操作子系統是基于藍牙無線通信技術開發的一款安卓移動端應用程序。該程序可以通過手機藍牙模塊與低功耗藍牙模塊無線連接,從而實現軟硬件互聯互通。應用程序的功能界面可以顯示硬件傳遞的數據信息,并根據特定算法將數據信息有效利用,轉化為符合用戶閱讀習慣的圖文報告。軟件操作子系統的功能模塊設計如圖4所示。

圖4 軟件操作子系統功能模塊
硬件控制子系統需要獲取傳感器數據,之后對數據進行分析,最后驅動執行件依照分析結果響應。不同傳感器的硬件特性不同,獲取數據的格式也不相同,得到的數據均需進行處理,并使用不同的有效數值算法轉為可利用數值。以DHT11濕度傳感器數值獲取與轉換為例,在DHT.h文件代碼中,read_data()函數先將開發板的D9引腳拉低18 ms再拉高40 μs,通知DTH11傳感器輸入數據,DHT11傳感器收到信息后響應,向開發板傳輸1 B數據,存儲在data變量中。當DTH11傳感器出現持續50 μs的低電和20 μs的高電平時,傳輸數據為0,若高電平時長大于20 μs,則傳輸數據為1。divideData()函數將read_data()函數中讀取的字節放入dhtSensor數組,共4個字節,分別代表濕度整數位、濕度小數位、溫度整數位、溫度小數位,最后在loop()函數中以十進制顯示各字節數值。
分析判斷傳感器的有效數據后,執行件根據判斷結果做出不同響應,實現硬件對用戶的反饋。以點陣屏執行件功能實現為例,硬件使用8×8點陣屏,該點陣屏由64個發光二極管組成,當某一列置1電平,某一行置0電平時,其對應的二極管發光。該模塊采用SPI協議與開發板通信,實現串行輸入與并行輸出控制點陣屏,因此可以基于點陣屏制作與展示簡易的圖標信息。開發點陣屏圖標顯示功能需要將點陣屏上的DIN數據接口、CLK時鐘接口、LTH鎖存接口分別連接到Arduino傳感器擴展板的數字4、5、6引腳,VCC、GND分別連接傳感器擴展板的任意一個正極、接地端口。以樹形圖標的制作為例,先將圖標的點陣編碼存在數組中,然后使用循環語句掃描點亮二極管。每個功能模塊中都會調用該功能模塊中對應的點陣屏顯示頭文件,并根據不同情形顯示不同的圖標,例如火焰報警模塊功能在安全環境中會顯示樹形圖標,當檢測到有危險的情況時,則會顯示警鈴圖標。
要實現硬件控制子系統中的紅外遙控功能[8],在Arduino IDE中編寫紅外遙控測試代碼上傳到開發板后,可以按下遙控器按鍵,觀察ComMonitor串口監視器中是否接收到正確的遙控器編碼。其次,通過導入IRremote頭文件,定義紅外接收器引腳號SensorIRreceive,調用頭文件IRrecv類創建一個紅外接收對象IRrecv,在程序入口setup函數中開始運行監聽紅外代碼enableIRIn()函數,接著循環判斷,如果接收到紅外遙控器發出的紅外編碼就將其以十六進制的格式打印在串口監視框中,然后調用resume()方法開始重新監聽一段代碼,最后得到遙控器所有按鍵值的編碼。
得到所有遙控按鍵的編碼值后,為每個按鍵設置特定響應動作,本系統選取6個按鍵作為硬件的響應按鈕:PREV/NEXT按鍵,切換主功能模塊(主界面、顯示時間、播放音樂、顯示溫度、火焰報警、振動報警、紅外檢測);ENTER/BACK按鍵:硬件功能的確認與返回;VOL-/VOL+按鍵:調整硬件音量。調用IRremote頭文件中的控制函數,接收判斷紅外遙控編碼,增加自定義算法,實現標志位的變更。紅外遙控功能控制流程如圖5所示。

圖5 紅外遙控功能控制流程
手機端應用程序的主界面由軟件名稱、連接設備、硬件功能、簡介模塊構成[9]。具體界面設計如圖6所示。

圖6 Android端應用程序主界面
應用程序“IoT家居小盒子”主界面中的軟件名稱和功能簡介模塊由TextView控件構建,中間連接設備模塊是一個按鈕控件,硬件功能模塊區域是GridView布局,布局中鑲嵌多個按鈕子控件,每個按鈕子控件對應一個標志位,點擊某按鈕后,通過識別其標志位找到對應按鈕響應事件[10]。
藍牙通信功能的實現需通過4個Java語言的源代碼文件,如圖7所示。newBleConnect文件的功能為注冊廣播,按鈕點擊事件中又分為連接設備、斷開設備、掃描附近設備等,這些模塊會發出不同的廣播信號。BluetoothClientService文件中的onCreate函數用于處理接收到的廣播信號;hanlder子線程用于發送廣播信號,可以將接收的數據發送至各功能模塊。manageConnectedSocket文件用于接發數據的處理,首先進行數據類型的轉換,run函數中接收緩沖區數據,將數據劃分,再發給對應的功能模塊,write函數發送指令給硬件控制程序,cancel函數中關閉socket傳輸流,close函數用于清空數據緩沖區。ConnectThread文件用于連接子線程。

圖7 藍牙通信功能的源代碼文件結構
針對應用程序功能模塊的實現,以有害氣體功能模塊為例,其使用界面如圖8所示。實時數據顯示389 ppm,可檢測的化合物包含一氧化碳、甲烷、丙烷、丁烷等,室內通風后,可從折線圖的示意中直觀感受有害氣體的含量持續下降。

圖8 有害氣體功能模塊界面
其他檢測功能模塊與有害氣體功能模塊的代碼結構類似,均包含2個函數,如圖9所示。onStart()函數用于接收廣播ACTION_DATA_TO_GAME和廣播ACTION_CONNECT_SUCCESS,其中廣播ACTION_DATA_TO_GAME用于接收數據的折線圖顯示,以及數據閾值判斷。廣播ACTION_CONNECT_SUCCESS用于通知其他模塊數據接收成功。onCreate()函數用于響應topBar和接收數據按鈕的點擊事件,在接收數據按鈕的點擊事件中會攜帶harmgas模塊的標識,發送廣播ACTION_DATA_SERVICE,然后在有害氣體功能模塊的界面中顯示有害氣體的濃度值。

圖9 有害氣體功能模塊的代碼結構
本設計采用了硬件控制子系統與軟件操作子系統相結合的方式,可以很好利用開源硬件平臺實現低成本的物聯網家居硬件系統開發。開發的設備原型經過長期測試,能夠滿足目標用戶的基本需求。現階段,硬件原型采集的所有數據都存于手機端應用程序,后期會通過搭建基于容器化技術的物聯網設備云平臺實現硬件與終端數據交互的遠程傳遞。