郭占苗
(西安航空職業技術學院 電子工程學院, 西安 710089)
智能家居是在現代時尚家居的基礎上,將組合智能、電子智能、機械智能和物聯智能巧妙的融入家居產品當中,使家居更加智能化、國際化、時尚化,是未來國際家居發展的潮流和趨勢。智能窗簾是智能家居的一個重要組成部分,設計一款人性化、智能化、便捷化和多樣化的智能窗簾不僅可以改變人們的生活方式,還能提高生活質量。經過實踐驗證,基于STC12C5A60S2 單片機系統的智能窗簾可以很好地完成窗簾的智能控制,較傳統靠人為去拉開和關閉窗簾的方式更方便,且不易損壞,具有廣闊的應用前景。
智能窗簾系統設計由達林頓管電路構成的ULN2003芯片驅動步進電機28BYJ控制窗簾的開啟和閉合狀態,用霍爾傳感器控制窗簾開啟和關閉的最大位移。利用光敏電阻采集外界光的強度,利用溫度傳感器采集環境溫度,結合I2C協議和1-wire總線編程,經PCF8591AD轉換器輸入單片機進行控制,由單片機輸出控制電機的正反轉,并將窗簾狀態、溫度和光照度參數結果顯示在LCD12864液晶上[1],同時,可通過按鍵模塊調整時間,也可設定窗簾自動開關的時間,時鐘顯示模塊能夠準確顯示實時時間,在時鐘模塊安裝紐扣電池可實現掉電后數據不丟失功能。智能窗簾具體原理框圖,如圖1所示。

圖1 智能窗簾系統框圖
main函數里主要調用“BS18B20.h”溫度采集頭文件函數、“LCD12864.h”液晶顯示、“DS1302.h”時鐘函數和“PCF8591.h”模數轉換函數,在液晶第一行顯示“智能窗簾控制系統”,第二行上顯示出“窗簾狀態”是“打開”或者“關閉”,第三行顯示當前時間,第四行顯示溫度和光照度。液晶時間顯示主要代碼如下:
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( )漢字轉化函數,顯示出相應漢字[2],其它狀態顯示函數與此類同,不再贅述。通過編寫按鍵函數,實現時間調整、光照度的閾值設定和窗簾開關的定時。
通過DS18B20可以實時采集室內溫度,并將結果顯示在液晶上。該溫度采集模塊主要包括DS18B20初始化、寫字節操作、讀字節和溫度采集等子函數。DS18B20的讀寫字節和初始化程序按照器件手冊1-wire工作協議時序編寫即可,初始化程序檢測1-wire總線是否存在DS18B20器件,讀寫時序要注意采樣時間[3]。溫度采集程序設計主要包括DS18B20的初始化,啟動溫度轉換和讀取寄存器的程序設計,讀取時先讀取低字節再讀取高字節,最后返回溫度值,主要用語句“temp = high<<4; temp |= (low>>4); return temp;”實現該功能。
DS1302時鐘模塊主要實現實時顯示當前時間和定時窗簾開啟與關閉時間的功能,按照DS1302時序編寫字節讀函數,字節寫函數,“unsigned char read_1302(unsigned char add)”地址讀函數,即將寄存器地址的數據讀出來,以及地址寫函數等。DS1302的6腳雙向通信引腳I/O接單片機的P0^1,7腳通信時鐘信號引腳SCLK接單片機P0^2,5腳使能引腳CE接P0^0,在寫時鐘程序時先進行聲明[4]。時鐘模塊芯片初始化函數,主要根據DS1302的時鐘寄存器功能表編寫,向DS1302內寫秒寄存器80H寫入初始秒數據,向寫分寄存器82H寫入初始分數據,向DS1302內寫小時寄存器84H寫入初始小時數據,根據實際時間分別寫入初始“時分秒”的數據,最后再調用BCD碼轉換十進制函數,BCD碼轉化十進制子函數由“unsigned char BCD_Decimal(unsigned char bcd)”BCD碼轉十進制函數實現,主要語句有{unsigned char Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F)); },實現第一次開啟時將寫入設置的初始時間顯示在LCD12864上的功能。
注意,為了使斷電再開機后時間不初始化成程序設置的初始時間,所以在DS1302初始化程序使進行寫保護,并用了備用電池。
PCF8591 具有 4 個模擬輸入、1 個模擬輸出和 1個串行 I2C 總線接口。其中PCF8591的第4引腳AIN3,即模擬輸入接口3連接光敏電阻,可采集環境光強精確數值。在 PCF8591 器件上輸入輸出的地址、控制和數據信號都是通過雙線雙向 I2C 總線以串行的方式進行傳輸[5]。I2C模塊化頭文件函數程序主要包括I2C起始信號程序,即在SCL高電平期間,SDA產生一個由高到低的下降沿;數據傳輸函數,I2C協議的數據傳輸是按照高位在前低位在后的順序傳輸;以及停止信號,即SCL在高電平期間,SDA由低電平向高電平變化產生一個上升沿。PCF8591將光敏電阻值讀出來轉換成數字量,將光照度顯示在液晶上,轉換代碼函數主要調用“i2c_start();” I2C初始化、“i2c_sendbyte(0x91);”尋址PCF8591和“temp = i2c_receivebyte();”讀取轉換數值函數,最后通過語句“return temp;”返回要顯示的溫度值。
因為電機功耗比較大,所以用驅動芯片為電機提供較大電流,步進電機的A、B、C、D四相通過驅動ULN2003分別與單片機的P1^0、P1^1、P1^2和P1^3依次相連,并采用雙四拍模式工作。當窗簾閉合時,步進電機的AB、BC、CD、DA相依次導通,達到霍爾傳感器控制下限位移時電機停轉;當窗簾開啟時,步進電機的DA、CD、BC、AB相依次導通,達到霍爾傳感器控制上限位移時,電機停轉。可見,通過控制電機正反轉動來控制窗簾開啟與閉合狀態,并由霍爾傳感器限定窗簾位移的極限[6]。主要在“void T0_time() interrupt 1”定時器T0中斷函數里實現該功能。
窗簾狀態和相關參數用LCD12864液晶顯示,液晶顯示模塊主要包括寫指令、寫數據和初始化子函數。以時間顯示為例,時間顯示在液晶的第三行第一列,主要包括寫指令和寫數據代碼,讀寫指令時,發送數據分高四位、第四位兩次發送,通過語句“send_byte(0xf0&com);”(高四位)、“send_byte(0xf0&com<<4);”(第四位)實現。
編程實現第一行漢字顯示從0X80地址開始,第二行從0X90,第三行從0X88,第四行從0X98地址開始,聲明時依次定義漢字位置地址,當顯示漢字不再變化時,定義時加關鍵字“code”,存儲在flash里。液晶的5腳讀/寫位接單片機P2^0引腳,3腳在模塊上接電位器調整背光,6腳E使能引腳接P2^1引腳,因為采用串口方式編寫程序[7],所以15腳PSB接地,19腳背光源正端接智能窗簾系統電源VCC,20腳背光源負端接地GND。
PCF8591的14腳接智能窗簾系統5V電源,電路擴展時,可以給PCF8591的AIN0,AIN1,AIN2分別接入濕度傳感器、煙霧傳感器和氣敏傳感器等傳感器,輸入的模擬量通過PCF8951AD采集轉換送給單片機,設定閾值,超過閾值時,窗簾“開啟”或“閉合”,設計思路與光敏電阻采集光照度類似[8],A/D轉換電路圖,如圖2所示。

圖2 PCF8591A/D轉換模塊電路圖
步進電機控制窗簾原理圖如圖3所示。

圖3 步進電機控制窗簾原理圖
步進電機的四相“ABCD”分別于單片機的“P1^0、P1^1、P1^2和P1^3”端口依次相連,通過電機的轉反轉編程實現窗簾的開啟與閉合,上限位霍爾傳感器和下限位霍爾傳感器分別與單片機的“P0^5”和“P0^4”相連接,編程實現當窗簾打開時,設置霍爾傳感器上限開關閾值,電機正轉窗簾開啟;當窗簾閉合時,設置下限開關閾值,電機反轉窗簾關閉;除開啟和閉合以外,則電機停轉維持原狀態不變,多次用“if…else”語句來編寫判斷電機轉動程序。
實物制作如圖4所示。

圖4 智能窗簾實物制作
系統電源采用手機充電器數據線接入USB端口供電,同時在電路板背面裝配電池盒,以備在不插電時由電池供電保證智能窗簾的正常運行;DS1302時鐘芯片的2腳和3腳接32.768KHz的晶振,給DS1302提供一個時間基準;PCF8591AD模塊通過跳線帽給電路擴展預留了端口;4個按鍵開關從左到右依次是菜單鍵、菜單功能鍵、減一鍵和加一鍵,菜單鍵里可以選擇“窗簾打開時間”、“窗簾關閉時間”、“光線設定”、“窗簾狀態”和“時間調整”,然后按菜單功能鍵,結合加減鍵,選擇調時間閾值和光照度的閾值,采集到的值和閾值進行比較[9],達到條件時,由電機帶動窗簾進行動作并在液晶上顯示狀態,由于液晶采自帶字庫,所以編程時直接將要顯示的漢字直接賦給數組的地址即可顯示相應的漢字和字符。
基于STC12C5A60S2單片機的智能窗簾系統設計,通過電機正反轉來控制窗簾的升降,霍爾傳感器控制窗簾的行程,可以手動設置光照度閾值和定時時間,利用PCF8591AD轉換器采集模擬量送給單片機自動控制窗簾的開啟和閉合模式[10]。該系統可移植性強、易于擴展、實施方便,具有較高的商業推廣和實際應用價值。