劉仁貴,樊英杰,黨建林,蘇智華
(西北工業大學明德學院,西安 710124)
智能家居是指通過物聯網技術將家庭中的音視頻設備、照明系統、數字影院系統、網絡家電等各種設備通過無線的方式連接到一起,提供家用電器的遠程智能控制。與普通家居相比,智能家居不僅具有傳統的居住功能,還兼備網絡通信、信息家電、設備自動化,提供全方位的信息交互功能。
當前,高效、節能、環保和使用壽命長的LED照明燈已大范圍替代效率低、對環境污染大以及使用壽命短的白熾燈和熒光燈。LED照明燈主要采用大功率LED燈珠作為發光光源,大功率LED燈珠屬于電流型半導體器件,具有二極管的特性,通過調節其流經的電流即可調節其發光亮度,因此,通過微控制器和帶亮度調節功能的專用的LED驅動芯片,即可方便的調節燈光的亮度。另外,基于Android系統的智能電子設備,如智能手機、PAD等隨處可見,成為人們生活中必不可少的一部分。因此,將基于Android系統的智能電子設備和帶無線通信功能的可調光LED照明燈結合,將會打開產生一個新的應用空間。
本文闡述了一種帶微處理器和WIFI通信功能的可調光、可組網的LED照明燈,并提出了將多個該LED照明燈組成一個分布式的可調光的智能照明控制系統的方案。
本系統由Android終端以及分布在家居空間的LED照明燈組成,如圖1所示。

圖1 系統結構方案
圖1中,AP為無線接入點,是網絡的中心節點,在智能家居中,可以采用家庭或辦公室常用的無線路由器[1]作為AP。Android終端和其他LED照明燈為STA站點,所有的STA都以AP作為無線網絡的中心,STA 之間的相互通信都通過 AP 轉發完成。AP通過WLAN與外網連接,外網的服務終端可以通過AP訪問到內部各個STA站點。
Android終端作為TCP Server,其余的LED照明燈作為TCP Client[2], 作為TCP Client的LED照明燈上電后,其內部的WIFI模塊會主動連接指定IP地址和端口的Android終端,連接成功后,Android終端和LED照明燈之間就可以進行通信了。LED照明燈內部的處理器就會定時發送LED照明燈的狀態信息[3],如開、關狀態以及亮度比例等。安裝在Android終端的APP[4]運行后,會通過WIFI網絡接收到各個LED燈上傳的數據,并顯示各個照明燈的狀態。同時用戶通過APP的操作,通過socket通信的方式,按照自定的通信協議來控制各個燈的開、關以及調節各個照明燈的亮度。
LED照明燈是照明系統中的功能個體,主要由WIFI通信模塊、MCU和LED驅動電路組成,如圖2所示。

圖2 LED照明燈原理
在LED照明燈的電路組成中,WIFI電路構成MCU與Android終端的通信橋梁,MCU是單個LED照明的控制中心,負責解析并執行Android終端發出的控制指令,MCU選用帶有PWM控制器的微處理器,這樣很方便與帶PWM調光功能接口的LED驅動芯片無縫對接。
TPS92515 系列器件是內部集成了290 mΩ低電阻 N溝道金屬氧化物半導體場效應晶體管 (MOSFET) 的緊湊型單片開關穩壓器,該系列開關穩壓器利用恒定關斷時間和峰值電流控制功能來運行,工作原理簡單可靠。該系列器件輸出高達 2A 的恒定平均電流,具有多種調光方法,適用于注重高效率、高帶寬、PWM模擬調光以及小尺寸的高亮度 LED 照明應用場景,例如汽車照明、工業照明、農業、航海和重工業照明等領域。TPS92515 系列器件具有很寬的輸入電壓范圍,其中TPS92515x的輸入電壓范圍為5.5 V至42 V,TPS92515HVx的輸入電壓范圍為5.5 V至65 V[5]。
在LED照明燈中,采用 TPS92515作為大功率LED的驅動電路,具體設計原理圖如圖3所示。
圖3中,EN信號用于控制P型MOS管U1(IRF6216)的導通與截止,從而控制TPS92515的電源輸入,達到通過EN信號控制LED照明燈的開和關的目的。TPS92515的第9引腳為PWM調光信號輸入引腳,標準的PWM信號的頻率范圍為100 Hz至2 kHz,該引腳與微處理器可輸出PWM信號[6]的特殊引腳連接,通過固件程序改變輸出PWM信號的占空比,來調節LED照明燈的亮度。
WIFI電路作為LED照明燈與Android終端通信的橋梁,WIFI電路采用濟南有人物聯網技術有限公司的TTL轉WIFI模塊USR-WIFI232-B2,USR-WIFI232-B2模組是一款一體化的802.11 b/g/n模組,通過該模組,傳統的串口設備或MCU控制的設備可以很方便的接入WIFI無線網絡,從而實現物聯網絡控制與管理。由于模塊內部完成協議轉換,因此,對于用戶來說,無需關心內部具體細節,通過簡單設置即可實現串口與WIFI之間數據的雙向透傳,其功能結構圖如圖4所示。

圖3 LED驅動電路

圖4 WIFI電路功能結構圖
USR-WIFI232-B2有5中數據傳輸模式,分別為透明傳輸模式、串口指令模式、GPIO模式、Httpd client模式和AT命令模式。本設計中,USR-WIFI232-B2采用透明傳輸模式,在此模式下,所有需要收發的數據在串口與WIFI之間不做任何解析,降低用戶使用的復雜度。透傳傳輸模式可以完全兼容用戶原有的軟件平臺,用戶設備基本不用做軟件改動就可以實現此功能[7]。USR-WIFI232-B2的電路接口如圖5所示。

圖5 WIFI接口電路
智能家居調光系統的LED照明燈的微處理器采用STM32F030F4P6[8],STM32F030F4P6是STM32F系列微控制器中,成本很低的一種32位ARM處理器,主頻48 MHz,該系列芯片是意法半導體(ST)公司出品,其內核是Cortex-M0,傳承了STM32系列的重要特性,特別適合成本敏感型應用,該芯片集成定時器Timer,UART等多種外設功能,這些外設功能的存在,非常有利于簡化電路的設計工作和降低產品的成本。
STM32F030F4P6處理器內部有1個高級定時器TIM1,通用定時器TIM3、TIM14、TIM15、TIM16、TIM17和基本定時器TIM6、TIM7,一共8個定時器,除了TIM6和TIM7以外,其他的定時器都可以用來配置產生PWM信號,其中高級定時器TIM1可以同時產生6通道的 PWM 輸出,而通用時器也能同時產生多達 4路的 PWM 輸出。PWM (脈沖寬度調制)是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。在本設計中,我們將STM32F030F4P6的第18引腳PA10與LED驅動電路的PWM控制引腳相連接,通過底層軟件配置,將TIM1的 CH3產生一路1 kHz的 PWM 輸出,用于調節LED的亮度。STM32F030F4P6的第17引腳PA9與LED驅動電路的EN信號相連接,用于控制驅動電路的供電。STM32F030F4P6的第8引腳PA2(USART1_TX)和第9引腳PA3(USART1_RX)分別與USR-WIFI232-B2的第4和第3引腳連接,用于與WIFI模塊進行串行通信。微處理器電路如圖6所示。

圖6 微處理器電路
ToggleButton[9]是Android中一個具有選中和未選中兩種狀態的按鈕,并可為不同的狀態設置不同的顯示文本,常用于表示開、關場景中。在Android終端的APP軟件設計中,LED照明燈的開和關用ToggleButton來實現。在xml布局文件中設置ToggleButton,然后在Activity文件中初始化用于控制照明燈開關的ToggleBuuton控件,并設置控件的OnCheckedChangeListener監聽器和重寫監聽器的onCheckedChanged()方法,通過該方法的傳入參數isChecked,判斷控件的狀態。如果控件壓下,則發送開燈指令,如果控件彈起,則發送關燈指令。具體實現代碼如下。
LED_Lightting.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(!buttonView.isPressed())
{
return;
}
else
{
if(isChecked)
{
//發送開燈指令
printWriter.print("$$o##");
printWriter.flush();
}
else
{
printWriter.print("$$p##");
printWriter.flush();
}
}
}
});
在Android系統中,SeekBar繼承于ProgressBar,是增加了滑動塊的擴展 ProgressBar。SeekBar的目的是讓用戶可以自主拖動,用來調節進度,比如通過拖動進度條來改變音樂和視頻的播放進度,這里我們也用SeekBar來調節LED照明燈的亮度。其具體實現代碼如下。
private SeekBar mseekBarBrightness;
mseekBarBrightness.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onStopTrackingTouch(SeekBar seekBar)
{
//移動后放開事件
}
@Override
public void onStartTrackingTouch(SeekBar seekBar)
{
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser)
{
// TODO Auto-generated method stub
// 取得當前亮度
int Brightness= seekBar.getProgress();
// 當進度小于5時,設置成0,關閉LED照明燈
if (Brightness< 5)
{
Brightness= 0;
}
// 根據當前進度改變亮度String orderStr = "";
orderStr = String.valueOf(Brightness);
try
{
printWriter.print(orderStr);
printWriter.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
Android終端的APP中,通過ToggleButton來打開和關閉LED照明燈,通過SeekBar來調節LED照明燈的亮度是外在的,處于應用層,而內在的通信,即Android終端與LED照明燈之間通信指令的傳輸則是通過Socket來實現的。Socket即為套接字,用于描述IP地址和端口,是支持TCP/IP協議的網絡通信的基本操作單元,也是應用層與TCP/IP協議族通信的中間軟件抽象層,表現為一個封裝了TCP/IP協議族的編程接口(API),主要解決數據如何在網絡中傳輸。對我們用戶來說,在Andorid平臺上進行TCP/IP協議開發,只需調用Socket按照指定的協議,向網絡發出請求或者應答網絡請求,即可實現通信,內部具體實現則無需關心。
在本設計中,采用基于TCP的Socket實現客戶端與服務器間的雙向可靠連接的實時通信,是一種C/S 模型的通信方式。Android終端為服務端,LED照明燈為客戶端,由于LED照明燈采用的是具有透明傳輸功能的WIFI模塊,內部集成了Socket通信功能,在使用時,只要對模塊進行配置成客戶端,并綁定服務器的IP地址和端口號即可,而服務器端的程序則要另行開發。基于TCP的Socket通信模型如圖7所示。

圖7 Socket通信模型
圖7中,服務器與客戶端通信前,需要創建服務器端的Socket,綁定端口號并開始監聽端口,等待建立基于TCP面向連接的端對端的傳輸。具體實現代碼如下。
public class LightServer
{
public static ArrayList
public static void main(String[] args)
throws IOException
{
//創建8899端口的服務端
ServerSocket socket = new ServerSocket(8899);
while(true)
{
//等待連接
Socket new_socket = socket.accept();
socketList.add(new_socket);
//為新加入的連接創建線程
new Thread(new ServerThread(new_socket)).start();
}
}
}
服務器與客戶端一旦創建連接后,就可以通過getInputStream和getOutputStream來接收和發送數據。getInputStream 用于獲得讀Socket的輸入流,getOutputStream 用于獲得寫Socket的輸出流。通過getInputStream和getOutputStream,實現LED照明燈亮度調節指令的發送和LED照明燈狀態的收集,特別是APP軟件中途退出重新啟動時,APP根據收集LED照明燈狀態調整顯示信息,確保APP顯示的狀態與實際的狀態一致。
固件程序運行于STM32F030F4P6,主要有兩個功能,一是用于從串口1接收Android終端通過WIFI模塊發送的控制指令,打開和關閉LED照明燈和調節亮度,二是將照明燈的狀態信息,例如當時的實際亮度比和開、關狀態等信息,通過WIFI模塊定時上傳到Android終端,使Android終端的顯示狀態與實際的一致。固件程序的流程圖如圖8所示。

圖8 固件程序流程圖
固件程序中,STM32F030F4P6的USART1的收發數據均采用DMA的方式來完成,其中數據發送采用DMA1的通道4,數據接收采用DMA1的通道5,并通過空閑中斷的方式來響應接收到的指令,這樣可以大大提高CPU對外設的響應速度。通用定時器TIM3用來設置上傳信息的2秒時間間隔,每隔 2秒,LED照明燈上傳當前的狀態信息,APP如果超時未收到照明燈發送的信息,則認為LED照明燈故障或者失聯,并給出提示信息。用于調光的PWM信號是通過配置STM32F030F4P6的TIM1來產生1 kHz的PWM信號,并通過庫函數TIM_SetCompare3(TIM1, Duty)或者通過修改寄存器的值TIM1->CCR3=Duty來修改PWM信號的占空比,達到調節亮度的目的。Duty為占空比,取值范圍為0~100。
為了解決普通照明燈開燈和關燈時,照明燈瞬間點亮和瞬間熄滅,對人眼的沖擊,固件程序在接收到開燈指令時,并不會將亮度直接調節到指定值,而是先將LED驅動電路的電源關閉,將輸出的PWM信號的占空比調節到最小,然后打開LED驅動電路的電源,再將輸出PWM信號的占空比逐步增大,使亮度慢慢增加。在接收到關燈的指令時,先將PWM信號的占空比逐步減小,使亮度慢慢降低,達到最小值后再關閉LED驅動電路的電源。
根據設計,制作了原理樣機,并在功能和指標上做了測試。
在功能上,各個LED照明燈上電后,默認均處于關燈狀態,并每隔2秒發送狀態信息,用于連接Android終端。打開運行在Android手機上的APP后,LED照明燈與Android終端能很快建立連接。建立連接前,APP上LED照明燈的狀態是灰色,建立連接后,狀態變為綠色,表示連接成功。連接成功后,通過APP上的控件可以對LED照明燈進行開燈和關燈操作,通過拖動進度條可以很靈敏地調節對應照明燈的亮度,并且在開、關燈的時候,亮度有明顯的變化,對人眼沒有明顯的刺激。另外,對樣機進行了高溫環境下的老化測試,樣機能連續較長時間穩定工作。
在指標上,主要測試了實際輸出電流與PWM信號占空比的關系。通過對PWM信號的占空比與輸出電流的監測,得出LED驅動電路的輸出電流與PWM信號占空比的關系如圖9所示。

圖9 電流與占空比關系圖
從實驗結果來看,在功能上,樣機能很好地滿足設計的要求,達到了預期的目的,另外,由于采用市面成熟的WIFI模塊、性價比非常高的微處理器和專用LED驅動電路,簡化了電路和軟件的設計,提高了照明燈的可靠性。在指標上,專用LED驅動芯片的引入,輸出電流能很好地線性跟隨PWM信號的占空,達到良好的調光效果。
另外還測試了樣機LED驅動的效率,其最高效率高達92%。效率高的原因是由于TPS92515內部開關管的內阻很低,僅為290 mΩ,而外部電路則采用了高品質的電感和低ESR的濾波電容,而這些因素恰恰是影響BUCK電路效率的因素。
本文介紹了一種基于Android系統的可聯網LED照明燈的設計,給出了關鍵部分的硬件電路和軟件實現方法,并對樣機進行了測試,測試的結果表明樣機很好地滿足設計的要求,達到了預計的目的。由于照明燈的控制是采用無線控制[10],通過組網,可以形成一個物聯網照明系統,不僅在局域網[11]范圍內,還可以通過廣域網,對部署的照明燈進行控制。該系統具有部署簡單、實用性強的特點,具有較好的推廣價值和市場前景。