基于ZigBee的智能家居環(huán)境監(jiān)測系統(tǒng)設(shè)計,包括上位機和下位機,附帶源碼
ARM-STM32校園創(chuàng)新大賽
題 目:基于STM32的智能環(huán)境監(jiān)測系統(tǒng)
摘要 本系統(tǒng)采用stm32f407作為主控芯片,實現(xiàn)對環(huán)境的監(jiān)測。并且通過和手機通信,獲取當前的天氣預(yù)報信息,結(jié)合當前測得的溫濕度,可以為用戶提供出行建議。利用stm32自帶的RTC可以實現(xiàn)時間及鬧鐘功能。此外RTC還可以用于電子日歷的制作。從機主控芯片是STM32f103,其主要功能是測取當前的溫濕度信息和語音識別。主從機通過nrf24l01無線通信。
1. 引言 科技發(fā)展越來越快,我們將要進入物聯(lián)網(wǎng)的世界。利用已經(jīng)成熟的溫濕度傳感器技術(shù),可以獲得當前的溫濕度信息;利用已經(jīng)很成熟的光敏傳感器技術(shù)可以獲得當前的光照強度。如果我們將這些信息搜集起來,通過微處理器分析,從而給出控制信息,實現(xiàn)智能控制。我們所要做的事情就是:通過微處理器豐富的外設(shè),來獲取周圍信息。再分析這些數(shù)據(jù),利用自動控制算法,控制外圍器件,實現(xiàn)環(huán)境的調(diào)控。 2. 系統(tǒng)方案 一、溫濕度監(jiān)測模塊:1.與數(shù)字溫度傳感器通信,獲取當前的溫濕度信息。 2.將獲得溫濕度信息進行濾波處理 3.將溫濕度數(shù)據(jù)打包傳送給上位機 4.上位機接受下位機傳輸數(shù)據(jù),將數(shù)據(jù)解包存儲 5.上位機數(shù)據(jù)分析 該模塊中最關(guān)鍵的算法是數(shù)據(jù)濾波,代碼如下:
- #define N 11
-
- char filter()
- {
- char value_buf[N];
- char count,i,j,temp;
- for ( count=0;count<N;count++)
- {
- value_buf[count] = get_ad();
- delay();
- }
- for (j=0;j<N-1;j++)
- {
- for (i=0;i<N-j;i++)
- {
- if ( value_buf[i]>value_buf[i+1] )
- {
- temp = value_buf[i];
- value_buf[i] = value_buf[i+1];
- value_buf[i+1] = temp;
- }
- }
- }
- return value_buf[(N-1)/2];
- }
復(fù)制代碼
二、光照強度監(jiān)測模塊 本模塊比較簡單。通過監(jiān)測光敏電阻兩端的電壓,來獲得電壓數(shù)據(jù)。再將電壓數(shù)據(jù)轉(zhuǎn)化成光照強度數(shù)據(jù)。檢測電壓的方法是采用STM32F407的AD模塊來實現(xiàn)。同上一個模塊一樣,要對數(shù)據(jù)進行濾波處理。算法如上。 三、2.4G無線通信模塊 本模塊是連接主從機的關(guān)鍵模塊。采用的通信芯片是NRF24L01。該芯片內(nèi)部包括頻率發(fā)生器、增強型ShockBurst模式控制器、功率放大器、晶體振蕩器、調(diào)制器、解調(diào)器等功能模塊。通信接口為SPI,待機電流22uA。 該模塊的使用主要是通過對其進行初始化、再選擇工作狀態(tài)(RX/TX)、發(fā)送或接收數(shù)據(jù)。通過軟件查詢方式,來通信。前期調(diào)試時,下位機由于以前調(diào)試過,沒有遇到什么問題。主要是在STM32F407上由于干接觸,還不太了解該SPI庫函數(shù)的使用方法,犯了一些低級錯誤。后期調(diào)好之后沒有出現(xiàn)過大的問題。 藍牙通行模塊是用于與智能手機及電腦通信的。本系統(tǒng)通過該模塊與手機通信,獲取當前的天氣預(yù)報信息。此外,還可通過智能手機、電腦等獲取本系統(tǒng)當前的信息以及控制本系統(tǒng)。該模塊與STM32f407通過USART通信。主要難點是:控制指令是AT指令。由于此前沒有學(xué)習(xí)過該指令,學(xué)習(xí)該指令花費了幾天時間。該模塊穩(wěn)定性高,調(diào)試成功后一直沒有出現(xiàn)過大的問題。 五、SYN6288合成語音模塊 本模塊采用USART進行通信。該語音合成芯片,支持多種編碼的數(shù)據(jù)。如:ASIC GBK UTF等。語音合成數(shù)據(jù)通過打包發(fā)送到該模塊。 支持多音字及人名的智能識別。該模塊控制命令多大幾十條,可以很好的實現(xiàn)對輸出音量、語速、背景音、多音字識別、強制連讀等調(diào)控。該模塊實現(xiàn)時遇到兩個難題:1、多指令的學(xué)習(xí)使用問題 2、電流干擾問題。第一個問題通過學(xué)習(xí)該芯片使用手冊很快得到了解決。第二個問題的現(xiàn)象是,每當播放語音時,顯示屏上就會亂碼。經(jīng)過多次檢測,發(fā)現(xiàn)問題是該模塊播音時電流變化大,對開發(fā)板上的電源產(chǎn)生了干擾。解決辦法是采用外界電源。 六、語音識別模塊LSD3320 本模塊基本功能是識別語音,附加功能是播放語音。本模塊通過SPI與從機主控芯片通信。從機控制該模塊進行語音識別和語音播放。結(jié)合fatfs與sdio,可從sd卡上讀取MP3數(shù)據(jù),從而實現(xiàn)了語音識別MP3播放器。該模塊使用時首先初始化,再選擇模塊工作模式。通過查閱數(shù)據(jù)手冊,可以更好的控制該芯片。結(jié)合無線模塊可以實現(xiàn)對上位機的控制。結(jié)合語音識別功能和語音播放功能可以實現(xiàn)語音對話。
3. 系統(tǒng)硬件設(shè)計詳細介紹系統(tǒng)各個模塊的硬件實現(xiàn)過程,包括電路系統(tǒng)仿真,說明采用關(guān)鍵器件的理由及關(guān)鍵部分的原理圖 (不得大量復(fù)制原理圖和PCB圖,更多用框圖的方式示意,僅對能體現(xiàn)工作量和創(chuàng)新的部分提供原理圖,評委有權(quán)對濫用原理圖的論文扣分)
語音模塊  語音識別模塊  無線模塊 
4. 系統(tǒng)軟件設(shè)計
5. 系統(tǒng)創(chuàng)新 本系統(tǒng)將主從機分開,利用從機進行語音識別和溫濕度監(jiān)控,主機進行數(shù)據(jù)分析。通過藍牙通信,獲取智能手機上的天氣數(shù)據(jù),很好的解決了微控制器連接網(wǎng)路難題。并且,通過藍牙連接,用戶能夠使用手機獲得當前的溫度信息。語音識別功能,增添了更加豐富的人機交互方式。此外,利用開發(fā)板上自帶的加速度模塊,能夠?qū)崿F(xiàn)彩屏的橫豎屏切換。 6. 評測與結(jié)論
系統(tǒng)的測試分三個階段,第一個階段主要是對硬件的測試。包括原理圖,焊接等檢測。焊接時,分模塊焊接、測試。最后,進行整個模塊上電測測。 第二個階段主要是對軟件的測試。軟件測試也是先分模塊測試,再總的進行測試。
第三個階段是黑盒測試。我們小組內(nèi)先進行組內(nèi)測試。通過后,再請其他同學(xué)通過使用,發(fā)現(xiàn)其中的問題。再進行改進。
進過測試,第一,第二個階段的測試比較順利。第三個階段的測試出現(xiàn)一些問題,主要是語音識別上的問題。通過不斷改變算法,最終得到了很好的效果。 附錄
STM32單片機源程序如下: - int main(void)
- {
- extern u8 voice7[];
- extern u8 Vscripte1[];
- extern u8 voice7[];
- extern u8 voice1[];
- massage.ScreenMsg=1;
- massage.ScreenMain=1;
- massage.Id=-1;
- massage.Flag=1;
- massage.HardMsg=0;
- massage.Temp1=28;
- massage.Temp2=39;
- massage.Humi1=58;
- massage.Humi2=38;
-
- delay_init();
- LCD_Config();
- Touch_Init();
-
- LCD_Clear(BLUE);
- COM1Init(9600);
- SelfCheck();
- delay_ms(1000);
- My_Init();
- while(1){
- MainMenu();
- }
- }
-
- void My_Init(void){
- extern u8 voice7[];
- extern u8 Vscripte1[];
- extern u8 voice7[];
- extern u8 voice1[];
- u8 i=0;
- u8 Rx_Buf[20];
- LCD_Clear(BLUE);
- GUI_TextV(50,80,"Waitting for data... " ,RED,BLUE,1);
- RX_Mode();
- while(NRF24L01_RxPacket(Rx_Buf));
- if(Rx_Buf[0]==0xda)
- {
- massage.Temp1=Rx_Buf[1];
- massage.Humi1=Rx_Buf[2];
- massage.Temp2=Rx_Buf[3];
- massage.Humi2=Rx_Buf[4];//
- }
- for(i=0;i<11;i++)
- {
- Usart2_Putc(Vscripte1[i]);
- }
- while(Usart2_Getc()==0x4f);
- //聯(lián)機成功提示音
- for(i=0;i<11;i++)
- {
- Usart2_Putc(Vscripte1[i]);
- }
- while(Usart2_Getc()!=0x4f);
- //開機成功歡迎音
- for(i=0;i<27;i++)
- {
- Usart2_Putc(voice1[i]);
- }
- Touch_Init();
- }
-
- void MainMenuV(void){
-
- GetId();
- switch(massage.Id){
- case 0:
- bluetooth();
- break;
- case 8:
- changeS();
- break;
- case 12:
- monitor();
- break;
- case 13:
- temperature();
- break;
- case 15:
- setting();
- break;
- case 16:
- humidity();
- break;
- case 17:
- voice();
- break;
- case 19:
- speaker();
- break;
- default:
- break;
- }
-
- }
- void MainMenuH(void){
- /*AI_LoadPicFile("0:/JPG/mas.jpg",0,0,240,320);
- delay_ms(800);
- AI_LoadPicFile("0:/JPG/mas1.jpg",0,0,240,320);
- delay_ms(800);
- AI_LoadPicFile("0:/JPG/mas2.jpg",0,0,240,320);
- delay_ms(800);
- AI_LoadPicFile("0:/JPG/mas3.jpg",0,0,240,320);
- delay_ms(800);
- AI_LoadPicFile("0:/JPG/mas4.jpg",0,0,240,320);
- delay_ms(800);
- AI_LoadPicFile("0:/JPG/mas5.jpg",0,0,240,320);
- delay_ms(800);*/
- //RTC_TimeShow();
- GetId();
- switch(massage.Id){
- case 15:
- bluetooth();
- break;
- case 16:
- setting();
- break;
- case 3:
- voice();
- break;
- case 10:
- temperature();
- break;
- case 2:
- //changeS();
- break;
- case 18:
- humidity();
- break;
- case 11:
- speaker();
- break;
- case 19:
- network();
- break;
- case 14:
- nowtime();
- break;
- case 6:
- monitor();
- break;
- case 7:
- calendar();
- break;
- default:
- break;
- }
- slither();
-
-
- }
-
- void sysmas(void){
- if(massage.ScreenMsg==0){
- //GUI_Text(50,80,"Speaker for you " ,RED,BLACK,1);
- }else{
- AI_LoadPicFile("0:/JPG/happ.jpg",0,0,240,320);
- if(massage.HardMsg|0x00){
- GUI_TextV(30,20,"SD working well... ",RED,BLACK,0);
- }else{
- GUI_TextV(30,20,"SD can not work... ",RED,BLACK,0);
- }
- if(massage.HardMsg|0x02){
- GUI_TextV(50,20,"Net working well... ",RED,BLACK,0);
- }else{
- GUI_TextV(50,20,"Net can not work... ",RED,BLACK,0);
- }
- if(massage.HardMsg|0x04){
- GUI_TextV(70,20,"BlueTooth working well...",RED,BLACK,0);
- }else{
- GUI_TextV(70,20,"BlueTooth can not work...",RED,BLACK,0);
- }
- if(massage.HardMsg|0x08){
- GUI_TextV(90,20,"SYN6288 working well...",RED,BLACK,0);
- }else{
- GUI_TextV(90,20,"SYN6288 can not work...",RED,BLACK,0);
- }
- while(!exit_fun("0:/JPG/happ.jpg")){}//end for while
- }
- }
-
- char exit_fun(u8 *path){
- char temp[2];
- extern MSG massage;
- GetId();
- temp[0]=massage.Id;
- delay_ms(100);
- GetId();
- temp[1]=massage.Id;
- if(massage.ScreenMsg){
- //橫屏
- //雙指收縮
- if((temp[0]==0)){
- if((temp[1]==5)||(temp[1]==1)||((temp[1]==4)))
- {
- turnback(path,"0:/JPG/happbg.jpg");
- //MainMenuH();
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 1;
- }
- }
-
- // 單指滑屏
- if((temp[0]==9)){
- if(temp[1]>temp[0]){
- turnback(path,"0:/JPG/happbg.jpg");
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 1;
- }
- }else{
- if(temp[0]==10){
- if(temp[1]>temp[0]){
- turnback(path,"0:/JPG/happbg.jpg");
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 1;
- }
- }
- }
- }else{
- // 豎屏狀態(tài)
- // 雙指放縮
- if((temp[0]==3)){
- if((temp[1]==2)||(temp[1]==7)||(temp[1]==6))
- {
- turnback(path,"0:/JPG/vappbg.jpg");
- //MainMenuV();
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 1;
- }
- }
- // 單指滑屏
- if((temp[0]==6)||(temp[0]==10)||(temp[0]==14)){
- if(temp[1]<temp[0])
- {
- turnback(path,"0:/JPG/vappbg.jpg");
- //MainMenuV();
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 1;
- }
- }
-
- }
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- return 0;
- }
-
- void slither(void){
- char temp[2];
- extern MSG massage;
- GetId();
- temp[0]=massage.Id;
- delay_ms(20);
- GetId();
- temp[1]=massage.Id;
- if(massage.ScreenMsg==0)
- {
-
- }else{
- if((temp[0]==5||temp[0]==1)){
- if(temp[1]>temp[0]){
- sysmas();
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- }
- }
- if((temp[0]==13||temp[0]==17)){
- if(temp[1]<temp[0]){
- sysmas();
- temp[0]=0;
- temp[1]=0;
- massage.Id=-1;
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載: |