郭占苗
(西安航空職業(yè)技術(shù)學(xué)院 電子工程學(xué)院, 西安 710089)
智能家居是在現(xiàn)代時尚家居的基礎(chǔ)上,將組合智能、電子智能、機(jī)械智能和物聯(lián)智能巧妙的融入家居產(chǎn)品當(dāng)中,使家居更加智能化、國際化、時尚化,是未來國際家居發(fā)展的潮流和趨勢。智能窗簾是智能家居的一個重要組成部分,設(shè)計一款人性化、智能化、便捷化和多樣化的智能窗簾不僅可以改變?nèi)藗兊纳罘绞?,還能提高生活質(zhì)量。經(jīng)過實踐驗證,基于STC12C5A60S2 單片機(jī)系統(tǒng)的智能窗簾可以很好地完成窗簾的智能控制,較傳統(tǒng)靠人為去拉開和關(guān)閉窗簾的方式更方便,且不易損壞,具有廣闊的應(yīng)用前景。
智能窗簾系統(tǒng)設(shè)計由達(dá)林頓管電路構(gòu)成的ULN2003芯片驅(qū)動步進(jìn)電機(jī)28BYJ控制窗簾的開啟和閉合狀態(tài),用霍爾傳感器控制窗簾開啟和關(guān)閉的最大位移。利用光敏電阻采集外界光的強(qiáng)度,利用溫度傳感器采集環(huán)境溫度,結(jié)合I2C協(xié)議和1-wire總線編程,經(jīng)PCF8591AD轉(zhuǎn)換器輸入單片機(jī)進(jìn)行控制,由單片機(jī)輸出控制電機(jī)的正反轉(zhuǎn),并將窗簾狀態(tài)、溫度和光照度參數(shù)結(jié)果顯示在LCD12864液晶上[1],同時,可通過按鍵模塊調(diào)整時間,也可設(shè)定窗簾自動開關(guān)的時間,時鐘顯示模塊能夠準(zhǔn)確顯示實時時間,在時鐘模塊安裝紐扣電池可實現(xiàn)掉電后數(shù)據(jù)不丟失功能。智能窗簾具體原理框圖,如圖1所示。
圖1 智能窗簾系統(tǒng)框圖
main函數(shù)里主要調(diào)用“BS18B20.h”溫度采集頭文件函數(shù)、“LCD12864.h”液晶顯示、“DS1302.h”時鐘函數(shù)和“PCF8591.h”模數(shù)轉(zhuǎn)換函數(shù),在液晶第一行顯示“智能窗簾控制系統(tǒng)”,第二行上顯示出“窗簾狀態(tài)”是“打開”或者“關(guān)閉”,第三行顯示當(dāng)前時間,第四行顯示溫度和光照度。液晶時間顯示主要代碼如下:
void sfm_show() //時間顯示行
{ convert();
temp1=time0/10%10;
temp2=time0%10;
temp3=time1/10%10;
temp4=time1%10;
temp5=time2/10%10;
temp6=time2%10;
lcd_pos(3,1);
write_com(0x06);
write_data(ASII[temp1]);
write_data(ASII[temp2]);
chinese(s); //顯示漢字“時”
write_data(ASII[temp3]);
write_data(ASII[temp4]);
chinese(f); //顯示漢字“分”
write_data(ASII[temp5]);
write_data(ASII[temp6]);
chinese(m); //顯示漢字“秒” }
將“時分秒”的個位和十位分別取出來從液晶的第三行第一列開始一次顯示,并利用chinese( )漢字轉(zhuǎn)化函數(shù),顯示出相應(yīng)漢字[2],其它狀態(tài)顯示函數(shù)與此類同,不再贅述。通過編寫按鍵函數(shù),實現(xiàn)時間調(diào)整、光照度的閾值設(shè)定和窗簾開關(guān)的定時。
通過DS18B20可以實時采集室內(nèi)溫度,并將結(jié)果顯示在液晶上。該溫度采集模塊主要包括DS18B20初始化、寫字節(jié)操作、讀字節(jié)和溫度采集等子函數(shù)。DS18B20的讀寫字節(jié)和初始化程序按照器件手冊1-wire工作協(xié)議時序編寫即可,初始化程序檢測1-wire總線是否存在DS18B20器件,讀寫時序要注意采樣時間[3]。溫度采集程序設(shè)計主要包括DS18B20的初始化,啟動溫度轉(zhuǎn)換和讀取寄存器的程序設(shè)計,讀取時先讀取低字節(jié)再讀取高字節(jié),最后返回溫度值,主要用語句“temp = high<<4; temp |= (low>>4); return temp;”實現(xiàn)該功能。
DS1302時鐘模塊主要實現(xiàn)實時顯示當(dāng)前時間和定時窗簾開啟與關(guān)閉時間的功能,按照DS1302時序編寫字節(jié)讀函數(shù),字節(jié)寫函數(shù),“unsigned char read_1302(unsigned char add)”地址讀函數(shù),即將寄存器地址的數(shù)據(jù)讀出來,以及地址寫函數(shù)等。DS1302的6腳雙向通信引腳I/O接單片機(jī)的P0^1,7腳通信時鐘信號引腳SCLK接單片機(jī)P0^2,5腳使能引腳CE接P0^0,在寫時鐘程序時先進(jìn)行聲明[4]。時鐘模塊芯片初始化函數(shù),主要根據(jù)DS1302的時鐘寄存器功能表編寫,向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù),向?qū)懛旨拇嫫?2H寫入初始分?jǐn)?shù)據(jù),向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù),根據(jù)實際時間分別寫入初始“時分秒”的數(shù)據(jù),最后再調(diào)用BCD碼轉(zhuǎn)換十進(jìn)制函數(shù),BCD碼轉(zhuǎn)化十進(jìn)制子函數(shù)由“unsigned char BCD_Decimal(unsigned char bcd)”BCD碼轉(zhuǎn)十進(jìn)制函數(shù)實現(xiàn),主要語句有{unsigned char Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F)); },實現(xiàn)第一次開啟時將寫入設(shè)置的初始時間顯示在LCD12864上的功能。
注意,為了使斷電再開機(jī)后時間不初始化成程序設(shè)置的初始時間,所以在DS1302初始化程序使進(jìn)行寫保護(hù),并用了備用電池。
PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。其中PCF8591的第4引腳AIN3,即模擬輸入接口3連接光敏電阻,可采集環(huán)境光強(qiáng)精確數(shù)值。在 PCF8591 器件上輸入輸出的地址、控制和數(shù)據(jù)信號都是通過雙線雙向 I2C 總線以串行的方式進(jìn)行傳輸[5]。I2C模塊化頭文件函數(shù)程序主要包括I2C起始信號程序,即在SCL高電平期間,SDA產(chǎn)生一個由高到低的下降沿;數(shù)據(jù)傳輸函數(shù),I2C協(xié)議的數(shù)據(jù)傳輸是按照高位在前低位在后的順序傳輸;以及停止信號,即SCL在高電平期間,SDA由低電平向高電平變化產(chǎn)生一個上升沿。PCF8591將光敏電阻值讀出來轉(zhuǎn)換成數(shù)字量,將光照度顯示在液晶上,轉(zhuǎn)換代碼函數(shù)主要調(diào)用“i2c_start();” I2C初始化、“i2c_sendbyte(0x91);”尋址PCF8591和“temp = i2c_receivebyte();”讀取轉(zhuǎn)換數(shù)值函數(shù),最后通過語句“return temp;”返回要顯示的溫度值。
因為電機(jī)功耗比較大,所以用驅(qū)動芯片為電機(jī)提供較大電流,步進(jìn)電機(jī)的A、B、C、D四相通過驅(qū)動ULN2003分別與單片機(jī)的P1^0、P1^1、P1^2和P1^3依次相連,并采用雙四拍模式工作。當(dāng)窗簾閉合時,步進(jìn)電機(jī)的AB、BC、CD、DA相依次導(dǎo)通,達(dá)到霍爾傳感器控制下限位移時電機(jī)停轉(zhuǎn);當(dāng)窗簾開啟時,步進(jìn)電機(jī)的DA、CD、BC、AB相依次導(dǎo)通,達(dá)到霍爾傳感器控制上限位移時,電機(jī)停轉(zhuǎn)??梢姡ㄟ^控制電機(jī)正反轉(zhuǎn)動來控制窗簾開啟與閉合狀態(tài),并由霍爾傳感器限定窗簾位移的極限[6]。主要在“void T0_time() interrupt 1”定時器T0中斷函數(shù)里實現(xiàn)該功能。
窗簾狀態(tài)和相關(guān)參數(shù)用LCD12864液晶顯示,液晶顯示模塊主要包括寫指令、寫數(shù)據(jù)和初始化子函數(shù)。以時間顯示為例,時間顯示在液晶的第三行第一列,主要包括寫指令和寫數(shù)據(jù)代碼,讀寫指令時,發(fā)送數(shù)據(jù)分高四位、第四位兩次發(fā)送,通過語句“send_byte(0xf0&com);”(高四位)、“send_byte(0xf0&com<<4);”(第四位)實現(xiàn)。
編程實現(xiàn)第一行漢字顯示從0X80地址開始,第二行從0X90,第三行從0X88,第四行從0X98地址開始,聲明時依次定義漢字位置地址,當(dāng)顯示漢字不再變化時,定義時加關(guān)鍵字“code”,存儲在flash里。液晶的5腳讀/寫位接單片機(jī)P2^0引腳,3腳在模塊上接電位器調(diào)整背光,6腳E使能引腳接P2^1引腳,因為采用串口方式編寫程序[7],所以15腳PSB接地,19腳背光源正端接智能窗簾系統(tǒng)電源VCC,20腳背光源負(fù)端接地GND。
PCF8591的14腳接智能窗簾系統(tǒng)5V電源,電路擴(kuò)展時,可以給PCF8591的AIN0,AIN1,AIN2分別接入濕度傳感器、煙霧傳感器和氣敏傳感器等傳感器,輸入的模擬量通過PCF8951AD采集轉(zhuǎn)換送給單片機(jī),設(shè)定閾值,超過閾值時,窗簾“開啟”或“閉合”,設(shè)計思路與光敏電阻采集光照度類似[8],A/D轉(zhuǎn)換電路圖,如圖2所示。
圖2 PCF8591A/D轉(zhuǎn)換模塊電路圖
步進(jìn)電機(jī)控制窗簾原理圖如圖3所示。
圖3 步進(jìn)電機(jī)控制窗簾原理圖
步進(jìn)電機(jī)的四相“ABCD”分別于單片機(jī)的“P1^0、P1^1、P1^2和P1^3”端口依次相連,通過電機(jī)的轉(zhuǎn)反轉(zhuǎn)編程實現(xiàn)窗簾的開啟與閉合,上限位霍爾傳感器和下限位霍爾傳感器分別與單片機(jī)的“P0^5”和“P0^4”相連接,編程實現(xiàn)當(dāng)窗簾打開時,設(shè)置霍爾傳感器上限開關(guān)閾值,電機(jī)正轉(zhuǎn)窗簾開啟;當(dāng)窗簾閉合時,設(shè)置下限開關(guān)閾值,電機(jī)反轉(zhuǎn)窗簾關(guān)閉;除開啟和閉合以外,則電機(jī)停轉(zhuǎn)維持原狀態(tài)不變,多次用“if…else”語句來編寫判斷電機(jī)轉(zhuǎn)動程序。
實物制作如圖4所示。
圖4 智能窗簾實物制作
系統(tǒng)電源采用手機(jī)充電器數(shù)據(jù)線接入USB端口供電,同時在電路板背面裝配電池盒,以備在不插電時由電池供電保證智能窗簾的正常運(yùn)行;DS1302時鐘芯片的2腳和3腳接32.768KHz的晶振,給DS1302提供一個時間基準(zhǔn);PCF8591AD模塊通過跳線帽給電路擴(kuò)展預(yù)留了端口;4個按鍵開關(guān)從左到右依次是菜單鍵、菜單功能鍵、減一鍵和加一鍵,菜單鍵里可以選擇“窗簾打開時間”、“窗簾關(guān)閉時間”、“光線設(shè)定”、“窗簾狀態(tài)”和“時間調(diào)整”,然后按菜單功能鍵,結(jié)合加減鍵,選擇調(diào)時間閾值和光照度的閾值,采集到的值和閾值進(jìn)行比較[9],達(dá)到條件時,由電機(jī)帶動窗簾進(jìn)行動作并在液晶上顯示狀態(tài),由于液晶采自帶字庫,所以編程時直接將要顯示的漢字直接賦給數(shù)組的地址即可顯示相應(yīng)的漢字和字符。
基于STC12C5A60S2單片機(jī)的智能窗簾系統(tǒng)設(shè)計,通過電機(jī)正反轉(zhuǎn)來控制窗簾的升降,霍爾傳感器控制窗簾的行程,可以手動設(shè)置光照度閾值和定時時間,利用PCF8591AD轉(zhuǎn)換器采集模擬量送給單片機(jī)自動控制窗簾的開啟和閉合模式[10]。該系統(tǒng)可移植性強(qiáng)、易于擴(kuò)展、實施方便,具有較高的商業(yè)推廣和實際應(yīng)用價值。