- 開發(fā)背景
隨著顯示器件的多樣化,人機(jī)交互界面也在不斷地進(jìn)行著變更,如今在TFT顯示屏上進(jìn)行圖標(biāo)化的功能管理已成為一種趨勢,為此以ART-Pi STM32H750開發(fā)板為硬件平臺,來構(gòu)建一個以圖標(biāo)界面進(jìn)行功能管理的桌面式智能家居控制系統(tǒng),該系統(tǒng)的主要功能如圖1所示,整體構(gòu)成如圖2所示。
圖1 功能結(jié)構(gòu)圖
圖2 整體構(gòu)成圖
功能規(guī)劃:
RTC: 利用MCU內(nèi)部的RTC實(shí)現(xiàn)電子時鐘的計時功能,可用于定時控制固態(tài)繼電器來驅(qū)動家用電器的開關(guān)。
ADC: 利用MCU內(nèi)部的A/D轉(zhuǎn)換器對外部的模擬量進(jìn)行采集,并可繪制出數(shù)據(jù)波形圖。在連接土壤濕度傳感器的情況下,可對家庭養(yǎng)植的綠色植物進(jìn)行補(bǔ)水控制,當(dāng)然這需要小型水泵的配合。
PWM調(diào)光:利用MCU內(nèi)部的定時器通過占空比的設(shè)置來控制光源的明亮程度,也可利用亮度強(qiáng)弱變化的呼吸燈效果來輔助睡眠。
環(huán)境溫濕度檢測: 使用數(shù)字式溫濕度傳感器DHT22對家居的溫濕度狀態(tài)進(jìn)行檢測,若配置2個DHT22的情況下,還可將2個DHT22分別放置在居室內(nèi)外,以檢測冬季供暖與墻體的保溫性能。
環(huán)境光照度檢測: 使用數(shù)字式光照度傳感器BH1750對居室的日照狀態(tài)進(jìn)行檢測,從而對日照采光情況提供一個可靠的依據(jù)。
樂曲播放: 利用MCU內(nèi)部的UART向MP3功能模塊來發(fā)送指令,從而對播放的樂曲加以選擇。受板載按鍵只有一個的制約,這里只采用單鍵控制,若對按鍵加以擴(kuò)展,則可實(shí)現(xiàn)雙向的選擇處理及音量的調(diào)控。
開關(guān)控制: 利用MCU的GPIO口,在連接固態(tài)繼電器的情況下,可通過按鍵來控制家居的小電器進(jìn)行開關(guān)控制,也可與RTC計時器相配合來進(jìn)行定時控制電器的開關(guān)。
圖像顯示: 該功能要依托W25Q16之類的FLASH存儲器件或是TF卡來輔助存儲圖片數(shù)據(jù),受時間的制約該功能只預(yù)備了一個功能調(diào)用的接口,具體的功能實(shí)現(xiàn)有待于輔助存儲功能的實(shí)現(xiàn)。
該系統(tǒng)的整體硬件結(jié)構(gòu)如圖3所示,主要由顯示模塊、語音模塊、繼電控制模塊及傳感器模塊等組成。
圖3 原理構(gòu)成圖
1)顯示部分
顯示部分是通過SPI接口的TFT屏來實(shí)現(xiàn)的,這樣比較節(jié)省GPIO資源,其連接關(guān)系如圖4所示。
2)音頻播放部分
音頻播放是通過MP3播放模塊來實(shí)現(xiàn),這樣有利于節(jié)省MCU資源并可形成并行的處理關(guān)系。MP3播放模塊是采用通訊方式來控制MP3播放模塊。除連接5V電源外,只需將MP3播放模塊的RX引腳與PA9連接。
圖5 MP3播放模塊引腳圖
3)控制部分
為了進(jìn)行電器的控制,使用帶光隔的繼電器模塊以防止繼電器對MCU的干擾,對稍大功率的電器,則使用固態(tài)繼電器來控制。
4)傳感器部分
為了進(jìn)行物理信號的檢測,可選取不同類型的傳感器,例如對綠植的管控是采用土壤濕度傳感器,屬模擬量的傳感器,相應(yīng)的接口電路如圖6和圖7所示。此外,對數(shù)字式的傳感器的使用,則可省去數(shù)值標(biāo)度的麻煩,DHT22和BH1750就屬于這一類型。
圖6 土壤濕度檢測模塊接口
圖7 土壤濕度傳感器
5)按鍵部分
按鍵是人機(jī)交互的主要器件,為便于控制所用的是開發(fā)板上用戶USER,若增添更多的處理,則需要自行擴(kuò)展更多的按鍵。
3. 軟件設(shè)計
1)界面設(shè)計
操作界面是人機(jī)交互的窗口,系統(tǒng)的主界面如圖8所示,主要以圖標(biāo)的形式來標(biāo)識功能,并通過文字的反顯來指示待選的功能,主菜單下的相關(guān)界面如圖8~圖10所示。
圖8 主界面
圖9 RTC計時
圖10 MP3播放選擇
2)功能實(shí)現(xiàn)
在功能管理方面,是采用模塊化的設(shè)計方法并通過功能函數(shù)調(diào)用來實(shí)現(xiàn)。在功能設(shè)計中,既涉及到外部功能模塊的使用,也涉及到MCU內(nèi)部的RTC、A/D、UART、GPIO等。
界面生成程序:
void jm(void)
{
LCD_Clear(WHITE);
show_tbh(20,240,0);
showhanzi16h(80,280,3,1);
showhanzi16h(80,264,4,1);
show_tbh(20,180,1);
show_tbh(20,120,2);
show_tbh(20,60,3);
showhanzi16h(80,100,5,1);
showhanzi16h(80,84,6,1);
show_tbh(120,60,4);
show_tbh(120,120,5);
show_tbh(120,180,6);
show_tbh(120,240,7);
showhanzi16h(180,280,13,1);
showhanzi16h(180,264,14,1);
showhanzi16h(180,220,11,1);
showhanzi16h(180,204,12,1);
showhanzi16h(180,160,9,1);
showhanzi16h(180,144,10,1);
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,160,'R',1);
LCD_ShowCharh(80,152,'T',1);
LCD_ShowCharh(80,144,'C',1);
LCD_ShowCharh(80,220,'P',1);
LCD_ShowCharh(80,212,'W',1);
LCD_ShowCharh(80,204,'M',1);
}
圖標(biāo)布置程序:
void show_tbh(unsigned int x,unsigned int y,unsigned int n)
{
unsigned int i,j,k;
unsigned int da;
k=0;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(n==0) da=gImage_tb[k*2];
if(n==1) da=gImage_pwm[k*2];
if(n==2) da=gImage_rtc[k*2];
if(n==3) da=gImage_a2d[k*2];
if(n==4) da=gImage_tft[k*2];
if(n==5) da=gImage_sz[k*2];
if(n==6) da=gImage_kz[k*2];
if(n==7) da=gImage_dht[k*2];
da<<=8;
if(n==0) da|=gImage_tb[k*2+1];
if(n==1) da|=gImage_pwm[k*2+1];
if(n==2) da|=gImage_rtc[k*2+1];
if(n==3) da|=gImage_a2d[k*2+1];
if(n==4) da|=gImage_tft[k*2+1];
if(n==5) da|=gImage_sz[k*2+1];
if(n==6) da|=gImage_kz[k*2+1];
if(n==7) da|=gImage_dht[k*2+1];
POINT_COLOR=da;
LCD_DrawPoint(x+i,y+j);
k++;
}
}
}
MP3樂曲選擇播放程序:
if(i==0)
{
setVolume(18);
for(j=0;j<10;j++)
{
USART1->TDR=cmd6[j];
while((USART1->ISR&0X40)==0);
}
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
delay_ms(200);
LCD_Clear(WHITE);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(60,280,'1',0);
LCD_ShowCharh(60,260,'-',0);
LCD_ShowCharh(80,280,'2',0);
LCD_ShowCharh(80,260,'-',0);
LCD_ShowCharh(100,280,'3',0);
LCD_ShowCharh(100,260,'-',0);
LCD_ShowCharh(120,280,'4',0);
LCD_ShowCharh(120,260,'-',0);
LCD_ShowCharh(140,280,'5',0);
LCD_ShowCharh(140,260,'-',0);
LCD_ShowCharh(160,280,'6',0);
LCD_ShowCharh(160,260,'-',0);
LCD_ShowCharh(180,280,'7',0);
LCD_ShowCharh(180,260,'-',0);
showhanzi16h(60,240,39,1);
showhanzi16h(60,220,40,1);
showhanzi16h(60,200,41,1);
showhanzi16h(80,240,19,1);
showhanzi16h(80,220,20,1);
showhanzi16h(100,240,35,1);
showhanzi16h(100,220,36,1);
showhanzi16h(100,200,37,1);
showhanzi16h(100,180,38,1);
showhanzi16h(120,240,33,1);
showhanzi16h(120,220,34,1);
showhanzi16h(140,240,29,1);
showhanzi16h(140,220,30,1);
showhanzi16h(140,200,31,1);
showhanzi16h(140,180,32,1);
showhanzi16h(160,240,21,1);
showhanzi16h(160,220,22,1);
showhanzi16h(180,240,42,1);
showhanzi16h(180,220,43,1);
j=0;
while(j<7)
{
if(KEY1==0)
{
if(j>0)
{
LCD_ShowCharh(40+20*j,300,' ',0);
LCD_ShowCharh(40+20*j,292,' ',0);
showhanzi16h(60+20*j,300,27,1);
}
else
{
showhanzi16h(60,300,27,1); // Èý½Ç + 20
}
if(j<5)
{
playn(j+1);
for(k=0;k<10;k++)
{
USART1->TDR=cmd3[k];
while((USART1->ISR&0X40)==0);
}
}
j++;
}
delay_ms(200);
}
for(k=0;k<10;k++)
{
USART1->TDR=cmd5[k];
while((USART1->ISR&0X40)==0);
}
LCD_Clear(WHITE);
jm();
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
}
4. 功能測試
在功能測試中,測試方法的選擇是較為重要的,應(yīng)加以合理地選擇。
為了進(jìn)行MP3播放模塊的控制,可先通過虛擬串口來驗(yàn)證指令的發(fā)送功能,待功能得到驗(yàn)證后再將虛擬串口通訊改為實(shí)際的MP3模塊控制能節(jié)省許多的驗(yàn)證時間。虛擬串口的驗(yàn)證效果如圖11所示,說明指令發(fā)送是正確的。在連接MP3播放模塊后,有效地證明了控制的有效性。
圖11 Play指令測試
對RTC計時功能的測試如圖12所示,對DHT22的溫濕度測試如圖13所示。
圖12 RTC計時
圖13 溫濕度測試
對BH1750的照度測試如圖14所示,對波形繪制功能的驗(yàn)證如圖15所示。
圖14 照度測試
圖15 波形繪制功能驗(yàn)證
結(jié)語
盡管設(shè)計已初具規(guī)模,但受時間和技術(shù)水平的限制,還存在著待補(bǔ)充和完善的地方,例如STM32H750的閃存只有128K,相對來說還是比較小,要想完全達(dá)到設(shè)計目標(biāo),W25Q16和TF卡之類的外存使用還是十分必要的,它可以有效地解決圖標(biāo)、中文字庫及數(shù)碼相框的存儲問題,有利于界面的美觀和中文化。
視頻內(nèi)容:
1.硬件基本構(gòu)成
2.樂曲的選擇播放
3.整體的功能瀏覽
4.PWM調(diào)節(jié)下的呼吸燈效果: