陳廣金,藍(lán)慕云
(1.西安交通大學(xué) 電氣工程學(xué)院,陜西 西安 710049;2.華南理工大學(xué) 電力學(xué)院,廣東 廣州 510641;3.華南理工大學(xué) 電氣信息及控制國(guó)家級(jí)實(shí)驗(yàn)教學(xué)示范中心,廣東 廣州 510006)
隨著時(shí)代的發(fā)展,人們更加重視家居生活的智能化,期望在外出忙碌之后,在家中能夠享受更加舒適便捷的生活,免受電器溫度需要實(shí)地觀察和來回調(diào)控帶來的煩擾。設(shè)計(jì)智能化的溫度控制系統(tǒng)可以很好地解決這一問題。
市場(chǎng)上主要采用ZigBee 來實(shí)現(xiàn)智能家居的功能控制,ZigBee 不僅安裝復(fù)雜、成本高,而且不能連接用戶的手機(jī)來進(jìn)行遠(yuǎn)程控制。在智能手機(jī)飛速發(fā)展的時(shí)代,以WiFi 來遠(yuǎn)程控制智能家居已經(jīng)成為研究設(shè)計(jì)的重要方向。WiFi 技術(shù)是一種標(biāo)準(zhǔn)的無線局域網(wǎng)絡(luò)技術(shù),是重要的遠(yuǎn)程控制手段,相對(duì)其他控制方式優(yōu)勢(shì)明顯,而且具有成本較低、整合度高、安全性強(qiáng)、開發(fā)方便等優(yōu)點(diǎn)。WiFi 的遙控半徑可達(dá)100 m,足以在室內(nèi)甚至室外一定范圍內(nèi)掌控整座建筑的溫度情況,只需要放置一個(gè)熱點(diǎn)即可讓用戶自行連接,成本較低,己經(jīng)應(yīng)用于生活中各種場(chǎng)合。手機(jī)、Pad 以及便攜式計(jì)算機(jī)等移動(dòng)設(shè)備與互聯(lián)網(wǎng)連接,在智能家居的設(shè)計(jì)之中使用十分普遍?;赪iFi 來控制開關(guān),用戶可以實(shí)時(shí)監(jiān)控室內(nèi)溫度情況并在手機(jī)窗口進(jìn)行調(diào)節(jié)控制,讓生活更加便捷舒適,克服了傳統(tǒng)家居手動(dòng)調(diào)節(jié)的機(jī)械化與不穩(wěn)定性。
系統(tǒng)由電源模塊、以Arduino 為核心的執(zhí)行模塊、顯示模塊三個(gè)主要模塊組成,總體設(shè)計(jì)如圖1 所示。系統(tǒng)以Arduino 控制器為核心,WiFi-ESP8266 無線模塊和MQTT(Message Queuing Telemetry Transport)服務(wù)器協(xié)作,進(jìn)行信息反饋和遠(yuǎn)程操作。將傳感器采集的溫度數(shù)據(jù)上傳到物聯(lián)網(wǎng)云服務(wù)器,服務(wù)器接收數(shù)據(jù)之后,用戶可以在手機(jī)端對(duì)溫度進(jìn)行控制。將采集數(shù)據(jù)與數(shù)據(jù)閾值作比較,若出現(xiàn)異常,則蜂鳴器會(huì)及時(shí)報(bào)警并關(guān)斷設(shè)備,用戶也可以發(fā)出指令,隨時(shí)觀察設(shè)備的溫度情況并確定遠(yuǎn)程控制設(shè)備運(yùn)行與否。
圖1 系統(tǒng)整體框架
在硬件設(shè)計(jì)中,要設(shè)計(jì)各個(gè)模塊,包括元器件型號(hào)的選擇、電路原理圖的設(shè)計(jì)、硬件電路正確性的檢測(cè)。系統(tǒng)硬件有電源模塊,為系統(tǒng)供電;繼電器模塊,產(chǎn)生開關(guān)信號(hào);溫度采集模塊,采集溫度物理量;智能移動(dòng)終端模塊,實(shí)現(xiàn)智能溫度控制。系統(tǒng)硬件結(jié)構(gòu)圖如圖2所示。
圖2 系統(tǒng)硬件結(jié)構(gòu)圖
電源模塊電路如圖3 所示。
圖3 電源模塊電路圖
電源模塊將220 V 家用交流電通過變壓器降壓,再通過電容濾波的全橋整流電路,使用LM7805 芯片將輸出電壓穩(wěn)定在5 V。在該電源模塊中,為降低損耗,提高輸出電壓質(zhì)量,選用合適的濾波電容,并采用LM7805芯片進(jìn)一步改善輸出電壓。用LM78 系列三端穩(wěn)壓IC來組成穩(wěn)壓電源所需的外圍元件極少,電路內(nèi)部還有過流、過熱及調(diào)整管的保護(hù)電路,使用起來可靠、方便,而且價(jià)格便宜,穩(wěn)定電壓在4.8~5.2 V 之間,適于給控制系統(tǒng)供電。
繼電器分為低壓控制電路和高壓工作電路,通過Arduino 的I/O 端口輸出高低電平來控制繼電器開閉,進(jìn)而可以控制220 V 用電回路,并控制用電設(shè)備的運(yùn)行。繼電器內(nèi)部電路圖如圖4 所示,其用電設(shè)備連線圖如圖5 所示。
圖4 繼電器內(nèi)部電路圖
圖5 繼電器用電設(shè)備連線圖
DS18B20 是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號(hào),具有體積小、測(cè)溫系統(tǒng)簡(jiǎn)單、硬件開銷低、抗干擾能力強(qiáng)、精度高的特點(diǎn)。DS18B20 數(shù)字溫度傳感器接線方便,在智能家居領(lǐng)域十分適用,可以用于一些室內(nèi)用電設(shè)備的溫度檢測(cè)。同時(shí)DS18B20 具有獨(dú)特的一線接口,只需要一條口線即可實(shí)現(xiàn)通信,電壓范圍為3.0~5.5 V ,無需備用電源,測(cè)量溫度范圍為-55~125 ℃。DS18B20外接電路圖如圖6 所示。
圖6 DS18B20 接線圖
關(guān)于警報(bào)裝置,設(shè)計(jì)簡(jiǎn)易蜂鳴器電路,接線簡(jiǎn)易,如圖7 所示。
圖7 蜂鳴器電路圖
Arduino UNO 板負(fù)責(zé)控制溫度傳感器和繼電器,ESP8266 MCUNode 模塊負(fù)責(zé)Arduino UNO 板與服務(wù)器通信,再通過服務(wù)器與手機(jī)端進(jìn)行遠(yuǎn)程連接。用Arduino 的IDE 分別進(jìn)行Arduino UNO 和ESP8266 NodeMCU 的開發(fā)編程,將程序下載到NodeMCU 板和Arduino UNO 板中,通電即可運(yùn)行,滿足功能需求。
2.4.1 Arduino UNO 開發(fā)板
Arduino UNO 是一款基于微控制器ATmega328P 的開發(fā)板,有14 個(gè)數(shù)字輸入/輸出引腳(這些引腳中有6 個(gè)引腳可以作為PWM輸出引腳),6個(gè)模擬輸入引腳,16 MHz石英晶振,USB 接口,電源接口,支持在線串行編程以及復(fù)位按鍵。用戶只需要將開發(fā)板通過USB 接口連接計(jì)算機(jī)就可以。
2.4.2 NodeMCU
NodeMCU 是一個(gè)開源的物聯(lián)網(wǎng)(Internet of Things,IoT)硬件開發(fā)板,支持WiFi 功能且使用方法與Arduino開發(fā)板十分類似。ESP8266 是一塊芯片,NodeMCU 則是以ESP8266 芯片為核心的開發(fā)板。NodeMCU 開發(fā)板上的兩排插針與ESP8266 芯片的引腳相連,可以使用杜邦線將芯片的引腳接到實(shí)驗(yàn)電路中。NodeMCU 開發(fā)板上還配有USB 接口以及電壓轉(zhuǎn)換電路,只需用一根USB 數(shù)據(jù)線就可以實(shí)現(xiàn)為ESP8266 供電以及上傳程序的操作。
2.4.3 Arduino UNO 板與ESP8266 MCUNode 通信
NodeMCU 通過IC 接口連接Arduino,IC 是一種總線式結(jié)構(gòu),它只需要SCL 時(shí)鐘信號(hào)線與SDA 數(shù)據(jù)線就能與總線上的設(shè)備連接,實(shí)現(xiàn)數(shù)據(jù)通信。Arduino 將溫度傳感器的數(shù)據(jù)向ESP8266 MCUNode 傳輸,ESP8266 MCUNode 向服務(wù)器傳輸,而手機(jī)端發(fā)出的指令通過服務(wù)器傳輸?shù)?ESP8266 MCUNode,再由ESP8266 MCUNode 向Arduino UNO 板傳輸。
IC 的工作模式分為:主模式(Master Mode)和從模式(Slave Mode),主設(shè)備啟動(dòng)與從設(shè)備的通信。主設(shè)備需要從設(shè)備地址來啟動(dòng)與從設(shè)備的對(duì)話,當(dāng)主設(shè)備尋址時(shí),從設(shè)備響應(yīng)主設(shè)備,其接線如圖8 所示。
圖8 WiFi模塊連接Arduino 示意圖
2.4.4 MQTT 服務(wù)器
MQTT 是一個(gè)客戶端服務(wù)端架構(gòu)的發(fā)布/訂閱模式的消息傳輸協(xié)議。它的特點(diǎn)是輕巧、開放、簡(jiǎn)單、規(guī)范,易于實(shí)現(xiàn)。在MQTT 協(xié)議通信中,有兩個(gè)最為重要的角色,分別是服務(wù)端和客戶端。MQTT 服務(wù)端通常是一臺(tái)服務(wù)器,它是MQTT 信息傳輸?shù)臉屑~,負(fù)責(zé)將MQTT 客戶端發(fā)送的信息傳遞給MQTT 客戶端。MQTT 客戶端可以向服務(wù)端發(fā)布信息,也可以從服務(wù)端收取信息??蛻舳税l(fā)送信息的行為稱為“發(fā)布”信息。而客戶端要想從服務(wù)端收取信息,則首先要向服務(wù)端“訂閱”信息。MQTT 服務(wù)端在管理MQTT 信息通信時(shí),是使用“主題”來控制的。MQTT 服務(wù)器和客戶端通信示意圖如圖9所示。
圖9 MQTT 服務(wù)器和客戶端通信示意圖
在此將Arduino UNO 板的第6 腳作為控制繼電器的管腳,定義管腳為輸出模式,該模式下可以通過代碼控制管腳的電平高低,并通過電平高低控制繼電器的通斷。向總線上所有設(shè)備發(fā)送溫度轉(zhuǎn)換請(qǐng)求,獲取溫度傳感器數(shù)據(jù);然后注冊(cè)回調(diào)函數(shù),當(dāng)ESP8266 發(fā)來數(shù)據(jù)請(qǐng)求時(shí),將溫度數(shù)據(jù)發(fā)給ESP8266,當(dāng)收到ESP8266 傳來的指令數(shù)據(jù),執(zhí)行相關(guān)函數(shù),按照指令控制繼電器動(dòng)作。最后,實(shí)現(xiàn)ESP8266 與WiFi 連接,連接MOTT 服務(wù)器實(shí)現(xiàn)訂閱主題,以便接收手機(jī)發(fā)出的指令,并發(fā)布主題,向手機(jī)端傳輸溫度數(shù)據(jù)。
開發(fā)手機(jī)端APP 的主要工具是Android Studio,利用其新建工程文件目錄界面。開發(fā)者根據(jù)自己的功能需求在Android Studio 的工程文件目錄中編輯的文件主要 包 括:AndroidManifest. xml(確 定APP 權(quán) 限)、activity_main.xml(APP 界面布局)、MainActivity.Java(定義界面布局各控件的回調(diào)函數(shù),決定APP 的功能)。完成APP 界面布局后,還需要給一些按鈕控件綁定回調(diào)函數(shù),當(dāng)檢測(cè)到用戶點(diǎn)擊按鈕,執(zhí)行相應(yīng)的回調(diào)函數(shù),實(shí)現(xiàn)特定的功能。
系統(tǒng)工作流程如圖10 所示。
圖10 系統(tǒng)工作流程
根據(jù)實(shí)際需求,手機(jī)端需要實(shí)時(shí)反映設(shè)備溫度,當(dāng)用戶打開手機(jī)APP,在APP 界面會(huì)實(shí)時(shí)更新溫度信息,用戶便可以遠(yuǎn)程監(jiān)控溫度情況。與此同時(shí),用戶可以根據(jù)自己的實(shí)際需求和主觀意愿對(duì)界面進(jìn)行操作,隨時(shí)通過手機(jī)發(fā)出指令遠(yuǎn)程中斷或開啟繼電器??梢栽谑謾C(jī)端遠(yuǎn)程操作,給人們生活帶來了諸多便利。
APP 溫度操控界面如圖11 所示。
圖11 APP 溫度操控界面
本文系統(tǒng)的硬件端是基于ArduinoIDE 的程序設(shè)計(jì)的,Arduino 中均有封裝好的各種函數(shù)庫文件,程序設(shè)計(jì)相對(duì)簡(jiǎn)單。各模塊的程序節(jié)選說明如下:
3.3.1 Arduino 板
1)溫度數(shù)據(jù)獲取以及發(fā)送
#include
//將DallasTemperature.h 文件導(dǎo)入對(duì)應(yīng)子目錄
sensors.requestTemperatures();
//向總線上所有設(shè)備發(fā)送溫度轉(zhuǎn)換請(qǐng)求
tempC = sensors.getTempCByIndex(0);
//將傳感器攝氏溫度數(shù)據(jù)儲(chǔ)存入tempC 變量中
Wire.begin(8); /* join IC bus with address 8 */
Wire.onReceive(receiveEvent);
//主設(shè)備接收到信息后調(diào)用函數(shù)receiveEvent,執(zhí)行APP 指令Wire.onRequest(requestEvent);
//主設(shè)備接收到從設(shè)備數(shù)據(jù)請(qǐng)求后,向從設(shè)備發(fā)送溫度數(shù)據(jù)
2)繼電器的通斷設(shè)置
要實(shí)現(xiàn)繼電器的通斷,只需設(shè)置其所連接的管腳的電平高低即可,如下:
pinMode(relayPin,OUTPUT);
digitalWrite(relayPin,LOW); //接通繼電器
digitalWrite(relayPin,HIGH); //斷開繼電器
可以利用判斷語句,將接受到的APP 指令作為判斷條件,滿足條件便將管腳電平設(shè)置成所需要的水平,以及實(shí)現(xiàn)特定的功能。
3.3.2 ESP8266WiFi模塊程序設(shè)計(jì)
1)初始化設(shè)置
const char* ssid = "zz10"; //WiFi 名稱
const char* password = "66666666"; //WiFi 密碼
const char* mqttServer = "test.mosquitto.org";//MQTT 服務(wù)器地址
float Command=65.00; //指令參數(shù),取值不同代表不同指
令,初始化取值65,表示暫不執(zhí)行任何操作
WiFiClient WiFiClient;
PubSubClient mqttClient(WiFiClient);//建立MQTT 服務(wù)器對(duì)象
Serial.begin(9600);
//初始化串口通信,便于在計(jì)算機(jī)打印調(diào)試信息
Wire.begin(D1,D2);
//join i2c bus with SDA=D1 and SCL=D2 of NodeMCU
WiFi.mode(WiFi_STA);
//設(shè)置ESP8266 工作模式為無線終端模式
connectWiFi(); //連接WiFi
mqttClient.setCallback(receiveCallback);//設(shè)置MQTT 訂閱回調(diào)函數(shù),收到服務(wù)器的消息后調(diào)用此函數(shù),用于向Arduino 板發(fā)送APP 端的指令
mqttClient.setServer(mqttServer,1883);//設(shè)置MQTT 服務(wù)器和端口號(hào)
connectMQTTServer();
//連接MQTT 服務(wù)器,并且訂閱特定主題以便接受APP 指令
2)循環(huán)執(zhí)行主程序
Wire.beginTransmission(8);//啟動(dòng)IC 通信,8 代表從設(shè)備地址
char *p1 = float2char(Command);//Command 的不同數(shù)值代表不同指令
Wire.write(p1,sizeof(float)); //發(fā)送指令給Arduino
free(p1);
delay(1 000);
Wire.endTransmission(); //發(fā)送結(jié)束
Command=65.00; //每次發(fā)送完畢后賦予其初始值,下次接收到新的指令后重新賦值,發(fā)送給Arduino 板執(zhí)行
Wire.requestFrom(8,sizeof(float)); //向主機(jī)請(qǐng)求數(shù)據(jù)
while(!Wire.available()) //如果沒有獲取數(shù)據(jù)
{
Serial.println("waiting!");
}
while(Wire.available()){ //如果成功獲取了數(shù)據(jù)
char c;
int j;
char *p1 =(char *)malloc(sizeo(ffloat));
fo(rj = 0;j { *(p1 + j)= Wire.read(); } float x = char2float(p1);//從Arduino 獲取了數(shù)據(jù),儲(chǔ)存于變量x 中 tempC=x; if(x==-999||x==-998||x==-997) { if(x==-999) {Serial.println("自動(dòng)切斷");} if(x==-998) { Serial.println("操作切斷"); } if(x==-997) { Serial.println("重啟繼電器"); } } else{ Serial.println("正常工作,匯報(bào)溫度為:"); Serial.println(x); } free(p1); delay(1 000); } if(mqttClient.connected()){ //如果開發(fā)板成功連接服務(wù)器//每隔3 s 鐘發(fā)布一次信息 if(count >= 3){ pubMQTTmsg();//向服務(wù)器發(fā)布消息,報(bào)告當(dāng)前硬件端的情況 count = 0; }//保持心跳 mqttClient.loop(); } else { //如果開發(fā)板未能成功連接服務(wù)器 connectMQTTServer(); //則嘗試連接服務(wù)器 } } 系統(tǒng)模擬測(cè)試時(shí),分別使用手機(jī)和Arduino UNO 開發(fā)板顯示溫度采集數(shù)據(jù)并對(duì)溫度進(jìn)行控制。系統(tǒng)實(shí)物圖如圖12 所示,其中手機(jī)APP 端顯示溫度數(shù)值與LCD測(cè)量溫度數(shù)值一致,WiFi 工作狀態(tài)良好,且繼電器可以正常斷開,調(diào)壓器用于調(diào)節(jié)LCD 液晶顯示屏的亮度。 圖12 系統(tǒng)實(shí)物圖 為進(jìn)一步檢驗(yàn)系統(tǒng)結(jié)果,給出溫度控制曲線如圖13 所示。 圖13 溫度控制曲線 以22~28 ℃為例,當(dāng)溫度達(dá)到設(shè)置下限時(shí),繼電器自動(dòng)閉合,可以讓升溫系統(tǒng)進(jìn)行工作;當(dāng)溫度達(dá)到上限時(shí),繼電器斷開,與之關(guān)聯(lián)的電氣加熱系統(tǒng)停止加熱。模擬測(cè)試結(jié)果表明,本文系統(tǒng)不僅可以通過Ardino UNO 板對(duì)電器溫度顯示與控制,還可通過手機(jī)端進(jìn)行實(shí)時(shí)監(jiān)控,且系統(tǒng)功耗小。 基于WiFi 控制的溫度調(diào)節(jié)系統(tǒng)實(shí)現(xiàn)了遠(yuǎn)程監(jiān)測(cè)設(shè)備或環(huán)境溫度,滿足了用戶的需求,能夠通過手機(jī)APP遠(yuǎn)程操縱開關(guān),實(shí)現(xiàn)非接觸式開關(guān)控制。該系統(tǒng)可以根據(jù)不同的應(yīng)用環(huán)境設(shè)置不同的溫度閾值,超出該閾值,系統(tǒng)會(huì)自動(dòng)關(guān)斷,由用戶排查故障并通過手機(jī)重啟設(shè)備。將所設(shè)計(jì)系統(tǒng)引入智能家居體系中,可以便利人們生活,提高生活質(zhì)量,讓日常的生產(chǎn)生活更加智能化。4 系統(tǒng)模擬測(cè)試
5 結(jié) 論