劉天宋,姜楠,史吉祥
(常州劉國鈞高等職業(yè)技術(shù)學(xué)校,江蘇常州 213025)
低功耗、高效的照明控制系統(tǒng)在節(jié)能降耗的時(shí)代背景要求下越來越受到歡迎。因此研究一種節(jié)能的控制系統(tǒng)具有很大的研究意義和商業(yè)價(jià)值。例如,劉晉等[1]針對目前路燈存在的功耗高、沒有有效控制手段等缺點(diǎn),設(shè)計(jì)了時(shí)控及光控的校園LED節(jié)能路燈,在一定程度上實(shí)現(xiàn)了節(jié)能目標(biāo)。陳李華[2]結(jié)合實(shí)例,介紹了光亮工程的節(jié)能與智能控制,并對燈具安裝實(shí)施作了簡單說明。周韜等[3]用非成像光學(xué)設(shè)計(jì)方法,設(shè)計(jì)了一種基于LED光源的新型的均勻照明系統(tǒng),并以STC89C52RC單片機(jī)為核心,設(shè)計(jì)了由人體紅外和自然光照強(qiáng)度控制的LED路燈。
然而,隨著人工成本的不斷增加,對照明系統(tǒng)的監(jiān)管和控制越來越傾向于自動(dòng)化[4]。既能滿足節(jié)能要求,同時(shí)又兼顧自動(dòng)診斷故障功能,避免因損壞而長久失修現(xiàn)象出現(xiàn)的LED控制系統(tǒng)卻較為少見。針對上述問題,本文采用NodeMCU作為核心控制芯片,通過人體熱釋電傳感器和光敏傳感器,來控制LED的開關(guān)和亮度,以達(dá)到節(jié)能目的。利用物聯(lián)網(wǎng)開發(fā)平臺(tái),來及時(shí)接收LED控制系統(tǒng)的故障提醒信息,同時(shí)實(shí)現(xiàn)對LED的遠(yuǎn)端控制。本文首先介紹了文章背景;然后,對基于NodeMCU的帶故障自診斷功能的LED遠(yuǎn)程控制系統(tǒng)總體設(shè)計(jì)方法進(jìn)行了說明;接著介紹了系統(tǒng)的硬件設(shè)計(jì)和程序設(shè)計(jì);最后介紹了系統(tǒng)調(diào)試結(jié)果。
系統(tǒng)的結(jié)構(gòu)框圖如圖1所示。LED控制系統(tǒng)以NodeMCU為核心,通過人體熱釋電模塊檢測周圍環(huán)境中是否有人,決定LED的開關(guān);通過光敏模塊采集環(huán)境光線亮度,進(jìn)而通過PWM控制LED的亮度。NodeMCU通過WiFi可以與巴法云平臺(tái)連接,再通過該平臺(tái)向微信推送故障;同時(shí)也可以通過WiFi與Blinker服務(wù)器連接,實(shí)現(xiàn)手機(jī)端Blinker App對設(shè)備的控制。
圖1 系統(tǒng)結(jié)構(gòu)
控制系統(tǒng)的核心采用的是NodeMCU[5-6],一款開源快速硬件原型平臺(tái),包括固件和開發(fā)板,如圖2所示。它使用Lua腳本語言編程,也可使用Arduino IDE進(jìn)行編程和下載。其具有GPIO、PWM、I2C、1-Wire、ADC等功能,包含了可以運(yùn)行在ESP8266 WiFi SoC芯片之上的固件,以及基于ESP-12模組的硬件,如圖3所示。數(shù)據(jù)通過TCP協(xié)議與物聯(lián)網(wǎng)云平臺(tái)連接。主要有3種模式:(1)AP模式,該模式提供無線接入服務(wù),允許其他無線設(shè)備接入,提供數(shù)據(jù)訪問;(2)STA模式,該模式類似于無線終端,可以連接到AP,通俗地講,就像筆記本電腦或者手機(jī)一樣,搜索到無線網(wǎng)后連接;(3)AP+STA模式,即上述兩種方式的結(jié)合。
圖2 NodeMCU實(shí)物
圖3 ESP-12核心部分電路原理
本文中系統(tǒng)包含了2路光敏模塊。其中,第1路光敏模塊采集環(huán)境光線強(qiáng)度,進(jìn)而控制LED亮度;第2路光敏模塊采集LED光線強(qiáng)度,然后用于LED燈故障診斷。第1路光敏模塊電路原理圖如圖4所示,其包含模擬量輸出端口(連接到NodeMCU的模擬量輸入端口A0)、數(shù)字量輸出端口(連接到NodeMCU數(shù)字量端口D0)。圖中R6為光敏電阻,其阻值可變,與R2組成串聯(lián)分壓電路。當(dāng)光線照射時(shí),R6阻值發(fā)生變化,A0電壓值也發(fā)生變化。其電壓大小計(jì)算如下:
圖4 光敏模塊電路原理
LM393與周邊電阻R2、R6、R3組成一個(gè)電壓比較電路。調(diào)整電位器R3阻值后,當(dāng)光線變化時(shí),引腳2上的電壓會(huì)產(chǎn)生變化,當(dāng)LM393引腳2電壓低于引腳3時(shí),引腳1輸出高電平,反之輸出低電平。第2路光敏模塊電路原理圖和第1路相同。
系統(tǒng)可實(shí)現(xiàn)手動(dòng)運(yùn)行、自動(dòng)運(yùn)行兩種模式。手動(dòng)狀態(tài)下,可以通過Blinker[7]開關(guān)LED或者調(diào)節(jié)LED亮度,也可檢測LED、光敏模塊等模塊是否正常工作。自動(dòng)運(yùn)行又包含了LED故障診斷、光敏模塊故障診斷、連續(xù)長時(shí)間運(yùn)行報(bào)警等功能,如圖5所示。如有設(shè)備故障,系統(tǒng)將通過WIFI推送到微信,及時(shí)提醒用戶。
圖5 軟件功能
為避免環(huán)境影響對光敏模塊輸出的干擾,需對NodeMCU的A0端采樣數(shù)據(jù)進(jìn)行濾波,本文采用滑動(dòng)均值濾波方法[8-9]。該方法思路是:新建一個(gè)數(shù)組,依順序存放N次采樣數(shù)據(jù),每新采樣一個(gè)新的數(shù)據(jù),則將數(shù)組中最早采集的數(shù)據(jù)摒棄,然后求數(shù)組內(nèi)N個(gè)數(shù)據(jù)的算術(shù)平均值。其基本步驟如下。
把連續(xù)取N個(gè)采樣值看成一個(gè)隊(duì)列,假如第N次采樣后,得到該隊(duì)列中包含以下數(shù)據(jù)x[1],x[2],…,x[N],對隊(duì)列中的N個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,得到輸出結(jié)果:
按照先進(jìn)先出原則,每次采樣到一個(gè)新數(shù)據(jù)放入隊(duì)尾,并摒棄原來隊(duì)首的一次數(shù)據(jù)。假如現(xiàn)在為第j+N次采樣,則得到一組新數(shù)據(jù)x[j],x[j+1],…,x[j+N],再對隊(duì)列中的N個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,得到新的輸出結(jié)果:
經(jīng)過濾波后,A0端采樣數(shù)據(jù)變的更加平穩(wěn),如圖6所示。顯然,點(diǎn)數(shù)越大即采樣次數(shù)N越大,得到的波形越平滑,但是系統(tǒng)的濾波延遲也越大。根據(jù)實(shí)際項(xiàng)目測試,本文中N取值為6。
圖6 移動(dòng)濾波前輸入信號
LED調(diào)光器的原理有多種,例如,波寬控制調(diào)光(簡稱PWM),恒流電源調(diào)控和分組調(diào)控等方式。本文采用PWM調(diào)光方式,對LED燈組進(jìn)行控制。PWM[10-11]是一種對模擬信號電平進(jìn)行數(shù)字編碼的方法,通常用于電機(jī)調(diào)速、LED亮度調(diào)節(jié)。通過改變NodeMCU的I/O口輸出的方波的占空比從而獲得使用數(shù)字信號模擬成的模擬電壓信號。本文使用的PWM模塊如圖7所示。
圖7 PWM模塊
PID[12]控制算法是工業(yè)控制領(lǐng)域使用最廣泛的算法之一,PID控制分為模擬PID和數(shù)字PID,前者處理的是連續(xù)信號,后者處理的是離散信號。本文使用該算法對LED亮度的精確控制。PID是比例(P)、積分(I)、微分(D)控制算法。LED的亮度PID控制系統(tǒng)框圖,如圖8所示。
圖8 LED的亮度PID控制
首先計(jì)算誤差e(t)如下:
然后對誤差e(t)分別進(jìn)行比例、積分和微分運(yùn)算,最后將這3種運(yùn)算的結(jié)果疊加在一起,得到PID控制器的控制輸出值u(t),在連續(xù)的時(shí)間域里,PID控制器的表達(dá)式如下:
式中:Kp為比例系數(shù);Td為微分時(shí)間常數(shù);Ti為積分時(shí)間常數(shù);u(t)為PID控制輸出值;e(t)為采樣時(shí)刻輸入偏差值。
3.4.1 與巴法云的連接
巴法云服務(wù)器[13]采用TCP創(chuàng)客云作為中轉(zhuǎn)渠道,利用HTTP協(xié)議將云服務(wù)器與手機(jī)APP聯(lián)系起來。本文通過下述方法創(chuàng)建NodeMCU與巴法云的連接,并將消息發(fā)布到手機(jī)。
(1)注冊巴法云賬號后,在巴法云控制臺(tái)創(chuàng)建主題。
(2)編寫程序,使NodeMCU可以訂閱和發(fā)布主題,并下載。主要代碼如下:
#define DEFAULT_STASSID"xxxx"//xxxx為WIFI名稱
#define DEFAULT_STAPSW"xxxxx"//xxxxx為WIFI密碼
String uid="xxxxxx"; //xxxxxx為用戶私鑰,巴法云控制臺(tái)獲取
String type="2";//1表示是預(yù)警消息,2表示設(shè)備提醒消息
String device="燈光2控制手機(jī)客戶端";//設(shè)備名稱
int delaytime=10;//設(shè)置閑置時(shí)間,單位是秒
String ApiUrl="http://api.bemfa.com/api/wechat/v1/";//微信api網(wǎng)址
NodeMCU采集數(shù)據(jù),上傳到服務(wù)器,發(fā)布消息。手機(jī)微信訂閱主題,即可實(shí)時(shí)接收數(shù)據(jù)。
3.4.2 與Blinker的連接
Blinker是一套專業(yè)且易用物聯(lián)網(wǎng)解決方案,提供了服務(wù)器、應(yīng)用、設(shè)備端sdk支持。支持多藍(lán)牙、WiFi等方式通信。當(dāng)注冊Blinker與設(shè)備后,可以通過Arduino IDE編寫程序并下載到NodeMCU中,實(shí)現(xiàn)NodeMCU、手機(jī)APP和Blinker服務(wù)器端的相互連接。其核心代碼如下:
#define BLINKER_WIFI//選擇連接方式
#include<Blinker.h>
char auth[]="Your Device Secret Key";//設(shè)備密匙
char ssid[]="Your WiFi network SSID or name";//WIFI名稱
char pswd[]="Your WiFi network WPA password or WEP key";//WIFI密碼
BlinkerButton Button1("btn-abc");//新建組件對象。根據(jù)需求,可以創(chuàng)建多個(gè)。
void button1_callback(const String & state)//回調(diào)函數(shù)
{
}
void setup()//初始化Blinker
{
Blinker.begin(auth,ssid,pswd);
Blinker.attachData(dataRead);//綁定回調(diào)函數(shù)
Button1.attach(button1_callback);
}
3.5.1 LED故障診斷功能
設(shè)備上電初始化后,首先判斷運(yùn)行模式,手動(dòng)模式下,開啟燈組后,PWM輸出最大值255,燈組以最大強(qiáng)度發(fā)光。自動(dòng)模式下,如檢測到周圍有人移動(dòng),則根據(jù)環(huán)境光線強(qiáng)弱控制燈組的燈光強(qiáng)弱。若燈組出現(xiàn)故障不發(fā)光,電阻R6阻值發(fā)生變化,NodeMCU的端口D0將由高電平變?yōu)榈碗娖剑琋odeMCU發(fā)送信號到巴法云服務(wù)器,然后推送設(shè)備故障消息到微信客戶端。該功能流程如圖9所示。
圖9 LED功能診斷程序流程
推送程序主要代碼如下:
void doHttpStick(){ //微信消息推送函數(shù)
String pData;
pData="uid="+uid+"&type="+type+"&time="+delaytime+"&device="+device+"&msg="+msg;
http.begin(client2,ApiUrl);
http.addHeader("Content-Type","application/x-www-form-urlencoded");
int httpCode=http.POST(postData);
String payload=http.getString();
http.end();}
3.5.2 光敏電阻故障診斷
設(shè)備通過記錄一天不同時(shí)間光敏電阻的阻值變化,來對光敏電阻是否損壞進(jìn)行判斷。定義一個(gè)數(shù)組A={a0,a1,a2,a3,a4,a5},數(shù)組中各個(gè)元素ai代表每小時(shí)內(nèi)間隔10 min讀取到的NodeMCU的模擬量輸入端口A0的值。對于每個(gè)正整數(shù)i(0≤i≤4),數(shù)組的一階差分可以表示為:
顯然,當(dāng)Δai等于0或者趨向于0時(shí),可以認(rèn)為間隔10 min讀取到的A0的值無變化:
進(jìn)一步的,通過式(7)計(jì)算一階差分的方差,來觀察NodeMCU的模擬量輸入端口A0的值變化情況。方差越大,數(shù)據(jù)的波動(dòng)越大,認(rèn)為光敏電阻工作處于正常狀態(tài);方差越小,數(shù)據(jù)的波動(dòng)就越小,則認(rèn)為光敏電阻可能出現(xiàn)了故障。
在手機(jī)上安裝Blinker App后,注冊設(shè)備,對設(shè)備在手動(dòng)狀態(tài)下和自動(dòng)狀態(tài)下分別進(jìn)行測試。通過串口監(jiān)測窗口,觀測到系統(tǒng)網(wǎng)絡(luò)連接正常,獲取到了IP地址為192.168.43.107。通過遮擋LED,模擬燈泡損壞故障,觀察到系統(tǒng)發(fā)送了“燈2的燈泡可能損壞,請檢修”信息,微信在同一時(shí)間接收到了該故障信息。串口監(jiān)測窗口和微信界面分別如圖10和圖11所示。
圖10 系統(tǒng)連接網(wǎng)絡(luò)、發(fā)送信息的串口監(jiān)視界面
圖11 微信推送故障信息界面
圖12所示為Blinker App的操作界面。通過點(diǎn)擊該界面按鈕,驗(yàn)證了設(shè)備可以實(shí)現(xiàn)自動(dòng)、手動(dòng)模式切換,開、關(guān)燈和亮度調(diào)節(jié)等功能。
圖12 Blinker App界面
本文基于開源的NodeMCU設(shè)計(jì)了節(jié)能、帶故障自診斷功能的LED遠(yuǎn)程控制系統(tǒng)。該系統(tǒng)可以工作在手動(dòng)、自動(dòng)兩種模式下。手動(dòng)模式下,可以遠(yuǎn)程遙控開燈、關(guān)燈和檢測LED是否出現(xiàn)損壞。自動(dòng)狀態(tài)下,可以根據(jù)環(huán)境變化調(diào)節(jié)開燈、關(guān)燈,調(diào)節(jié)燈光亮度,達(dá)到節(jié)能目標(biāo),避免了無人燈現(xiàn)象的出現(xiàn)。該系統(tǒng)具有自動(dòng)診斷系統(tǒng)中部分模塊是否存在故障的功能,并通過微信提醒用戶。通過對樣機(jī)進(jìn)行測試,結(jié)果表明,整個(gè)系統(tǒng)運(yùn)行平穩(wěn);通過App操作LED開、關(guān),自動(dòng)、手動(dòng)模式切換指令準(zhǔn)確,響應(yīng)迅速。當(dāng)系統(tǒng)中部分模塊存在故障時(shí),微信API接收到的遠(yuǎn)程推送的故障信息準(zhǔn)確及時(shí),滿足了使用要求。