久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8201|回復(fù): 5
收起左側(cè)

STM32+NRF24L01無線智能家居環(huán)境監(jiān)測系統(tǒng)設(shè)計(上位機+下位機源碼與硬件圖)

  [復(fù)制鏈接]
ID:438753 發(fā)表于 2018-12-10 20:50 | 顯示全部樓層 |閱讀模式
基于ZigBee的智能家居環(huán)境監(jiān)測系統(tǒng)設(shè)計,包括上位機和下位機,附帶源碼
0.png

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ù)濾波,代碼如下:

  1. #define N  11

  2. char filter()
  3. {
  4.    char value_buf[N];
  5.    char count,i,j,temp;
  6.    for ( count=0;count<N;count++)
  7.    {
  8.       value_buf[count] = get_ad();
  9.       delay();
  10.    }
  11.    for (j=0;j<N-1;j++)
  12.    {
  13.       for (i=0;i<N-j;i++)
  14.       {
  15.          if ( value_buf[i]>value_buf[i+1] )
  16.          {
  17.             temp = value_buf[i];
  18.             value_buf[i] = value_buf[i+1];
  19.              value_buf[i+1] = temp;
  20.          }
  21.       }
  22.    }
  23.    return value_buf[(N-1)/2];
  24. }
復(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)對濫用原理圖的論文扣分)
0.png

語音模塊
語音識別模塊 
無線模塊

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單片機源程序如下:
  1.    int main(void)
  2. {
  3.               extern u8 voice7[];
  4.               extern u8 Vscripte1[];            
  5.               extern u8 voice7[];
  6.               extern u8 voice1[];
  7.               massage.ScreenMsg=1;
  8.               massage.ScreenMain=1;
  9.               massage.Id=-1;
  10.               massage.Flag=1;
  11.               massage.HardMsg=0;
  12.               massage.Temp1=28;
  13.               massage.Temp2=39;
  14.               massage.Humi1=58;
  15.               massage.Humi2=38;

  16.               delay_init();
  17.               LCD_Config();
  18.               Touch_Init();
  19.             
  20.               LCD_Clear(BLUE);
  21.               COM1Init(9600);            
  22.               SelfCheck();
  23.               delay_ms(1000);
  24.               My_Init();
  25.               while(1){
  26.          MainMenu();
  27.               }                                   
  28. }

  29. void My_Init(void){
  30.               extern u8 voice7[];
  31.               extern u8 Vscripte1[];
  32.               extern u8 voice7[];
  33.               extern u8 voice1[];
  34.               u8 i=0;
  35.               u8 Rx_Buf[20];
  36.                                           LCD_Clear(BLUE);
  37.                                           GUI_TextV(50,80,"Waitting for data... " ,RED,BLUE,1);
  38.                                  RX_Mode();
  39.                                     while(NRF24L01_RxPacket(Rx_Buf));                                                                     
  40.                        if(Rx_Buf[0]==0xda)
  41.                                  {
  42.                          massage.Temp1=Rx_Buf[1];
  43.                          massage.Humi1=Rx_Buf[2];
  44.                          massage.Temp2=Rx_Buf[3];
  45.                          massage.Humi2=Rx_Buf[4];//
  46.                                   }            
  47.                                   for(i=0;i<11;i++)
  48.                         {
  49.                            Usart2_Putc(Vscripte1[i]);
  50.                         }
  51.                         while(Usart2_Getc()==0x4f);
  52.                                   //聯(lián)機成功提示音
  53.                         for(i=0;i<11;i++)
  54.                         {
  55.                            Usart2_Putc(Vscripte1[i]);
  56.                         }
  57.                         while(Usart2_Getc()!=0x4f);
  58.                                   //開機成功歡迎音
  59.                         for(i=0;i<27;i++)
  60.                         {
  61.                            Usart2_Putc(voice1[i]);
  62.                         }
  63.                                 Touch_Init();
  64. }

  65. void MainMenuV(void){
  66.                            
  67.         GetId();
  68.                             switch(massage.Id){
  69.                                   case 0:
  70.                                                   bluetooth();
  71.                                                                       break;
  72.                                              case 8:
  73.                                                   changeS();
  74.                                                                       break;
  75.                                                         case 12:
  76.                                                             monitor();
  77.                                                                       break;
  78.                                                         case 13:
  79.                                                                          temperature();
  80.                                                             break;
  81.                                                         case 15:
  82.                                                             setting();
  83.                                                                       break;
  84.                                               case 16:
  85.                                                             humidity();
  86.                                                                       break;
  87.                                                         case 17:
  88.                                                                       voice();
  89.                                                             break;
  90.                                                         case 19:
  91.                                                                          speaker();
  92.                                                             break;
  93.                                                         default:
  94.                                                             break;
  95.                             }

  96. }
  97. void MainMenuH(void){
  98.                 /*AI_LoadPicFile("0:/JPG/mas.jpg",0,0,240,320);
  99.                                                         delay_ms(800);
  100.                                                         AI_LoadPicFile("0:/JPG/mas1.jpg",0,0,240,320);
  101.                                                         delay_ms(800);
  102.                                                         AI_LoadPicFile("0:/JPG/mas2.jpg",0,0,240,320);
  103.                                                         delay_ms(800);
  104.                                                         AI_LoadPicFile("0:/JPG/mas3.jpg",0,0,240,320);
  105.                                                         delay_ms(800);
  106.                                                         AI_LoadPicFile("0:/JPG/mas4.jpg",0,0,240,320);
  107.                                                         delay_ms(800);
  108.                                                         AI_LoadPicFile("0:/JPG/mas5.jpg",0,0,240,320);
  109.                                                         delay_ms(800);*/
  110.                                                         //RTC_TimeShow();
  111.                             GetId();
  112.                             switch(massage.Id){
  113.                                   case 15:
  114.                                                   bluetooth();
  115.                                                                       break;
  116.                                              case 16:
  117.                                                   setting();
  118.                                                                       break;
  119.                                                         case 3:
  120.                                                             voice();
  121.                                                                       break;
  122.                                                         case 10:
  123.                                                                          temperature();
  124.                                                             break;
  125.                                                         case 2:
  126.                                                             //changeS();
  127.                                                                       break;
  128.                                               case 18:
  129.                                                             humidity();
  130.                                                                       break;
  131.                                                         case 11:
  132.                                                                       speaker();
  133.                                                             break;
  134.                                                         case 19:
  135.                                                                          network();
  136.                                                             break;
  137.                                               case 14:
  138.                                                             nowtime();
  139.                                                                       break;
  140.                                                         case 6:
  141.                                                             monitor();
  142.                                                                       break;
  143.                                                         case 7:
  144.                                                             calendar();
  145.                                                                       break;
  146.                                                         default:
  147.                                                             break;
  148.                             }
  149.                             slither();


  150. }

  151. void sysmas(void){
  152.                  if(massage.ScreenMsg==0){
  153.                                              //GUI_Text(50,80,"Speaker for you      " ,RED,BLACK,1);
  154.                  }else{
  155.                        AI_LoadPicFile("0:/JPG/happ.jpg",0,0,240,320);
  156.                                              if(massage.HardMsg|0x00){
  157.                                                               GUI_TextV(30,20,"SD   working well...     ",RED,BLACK,0);
  158.                                           }else{
  159.                                                                         GUI_TextV(30,20,"SD   can not work...     ",RED,BLACK,0);
  160.                                           }
  161.                                           if(massage.HardMsg|0x02){
  162.                                                               GUI_TextV(50,20,"Net  working well...     ",RED,BLACK,0);
  163.                                           }else{
  164.                                                                         GUI_TextV(50,20,"Net  can not work...     ",RED,BLACK,0);
  165.                                           }
  166.                                           if(massage.HardMsg|0x04){
  167.                                                               GUI_TextV(70,20,"BlueTooth working well...",RED,BLACK,0);
  168.                                           }else{
  169.                                                                         GUI_TextV(70,20,"BlueTooth can not work...",RED,BLACK,0);
  170.                                           }
  171.                                           if(massage.HardMsg|0x08){
  172.                                                               GUI_TextV(90,20,"SYN6288   working well...",RED,BLACK,0);
  173.                                           }else{
  174.                                                                         GUI_TextV(90,20,"SYN6288   can not work...",RED,BLACK,0);
  175.                                           }
  176.                                           while(!exit_fun("0:/JPG/happ.jpg")){}//end for while
  177.                  }
  178. }

  179. char exit_fun(u8 *path){
  180.      char temp[2];
  181.               extern MSG massage;
  182.               GetId();
  183.               temp[0]=massage.Id;
  184.               delay_ms(100);
  185.               GetId();
  186.               temp[1]=massage.Id;  
  187.                  if(massage.ScreenMsg){
  188.                      //橫屏
  189.                                //雙指收縮
  190.                      if((temp[0]==0)){
  191.                                           if((temp[1]==5)||(temp[1]==1)||((temp[1]==4)))
  192.                                                                         {
  193.                                                                           turnback(path,"0:/JPG/happbg.jpg");
  194.                                                                                //MainMenuH();
  195.                                                                                     temp[0]=0;
  196.                                   temp[1]=0;
  197.                                                                                     massage.Id=-1;
  198.                                                                                     return 1;
  199.                                                                          }
  200.                                }

  201.                                // 單指滑屏
  202.                                if((temp[0]==9)){
  203.                                            if(temp[1]>temp[0]){
  204.                                                                                           turnback(path,"0:/JPG/happbg.jpg");
  205.                                                                                       temp[0]=0;
  206.                                     temp[1]=0;
  207.                                                                                       massage.Id=-1;
  208.                                                                                       return 1;
  209.                                                                          }
  210.                                }else{
  211.                                     if(temp[0]==10){
  212.                                                                          if(temp[1]>temp[0]){
  213.                                                                                           turnback(path,"0:/JPG/happbg.jpg");
  214.                                                                                       temp[0]=0;
  215.                                     temp[1]=0;
  216.                                                                                       massage.Id=-1;
  217.                                                                                       return 1;
  218.                                                                          }            
  219.                                                         }
  220.                                }
  221.               }else{
  222.                      // 豎屏狀態(tài)
  223.                                // 雙指放縮
  224.                      if((temp[0]==3)){
  225.                                            if((temp[1]==2)||(temp[1]==7)||(temp[1]==6))
  226.                                                                          {
  227.                                                                             turnback(path,"0:/JPG/vappbg.jpg");
  228.                                                                                //MainMenuV();
  229.                                                                                       temp[0]=0;
  230.                                     temp[1]=0;
  231.                                                                                       massage.Id=-1;
  232.                                                                                       return 1;
  233.                                                                          }
  234.                                }
  235.                                // 單指滑屏
  236.                                if((temp[0]==6)||(temp[0]==10)||(temp[0]==14)){
  237.                                                                          if(temp[1]<temp[0])
  238.                                                                       {
  239.                                                                            turnback(path,"0:/JPG/vappbg.jpg");
  240.                                                                                //MainMenuV();
  241.                                                                                       temp[0]=0;
  242.                                     temp[1]=0;
  243.                                                                                       massage.Id=-1;
  244.                                                                                       return 1;
  245.                                                                       }
  246.                                }
  247.                               
  248.               }
  249.               temp[0]=0;
  250.               temp[1]=0;
  251.               massage.Id=-1;
  252.               return 0;
  253. }

  254. void slither(void){
  255.               char temp[2];
  256.               extern MSG massage;
  257.               GetId();
  258.               temp[0]=massage.Id;
  259.               delay_ms(20);
  260.               GetId();
  261.               temp[1]=massage.Id;
  262.               if(massage.ScreenMsg==0)
  263.               {
  264.             
  265.               }else{
  266.                               if((temp[0]==5||temp[0]==1)){
  267.                                            if(temp[1]>temp[0]){                                                              
  268.                                                                                       sysmas();
  269.                                                                                       temp[0]=0;
  270.                                     temp[1]=0;
  271.                                                                                       massage.Id=-1;
  272.                                                                          }
  273.                                }
  274.                                if((temp[0]==13||temp[0]==17)){
  275.                                            if(temp[1]<temp[0]){
  276.                                                                                       sysmas();
  277.                                                                                       temp[0]=0;
  278.                                     temp[1]=0;
  279.                                                                                       massage.Id=-1;               
  280.                                                                          }
  281.                                }
  282.               }
  283. }
復(fù)制代碼

所有資料51hei提供下載:

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:104779 發(fā)表于 2018-12-10 22:42 | 顯示全部樓層
高手啊高手,你可以出專輯了。
回復(fù)

使用道具 舉報

ID:424598 發(fā)表于 2018-12-11 09:38 來自手機 | 顯示全部樓層
設(shè)計不錯,不過用這種屏有點浪費
回復(fù)

使用道具 舉報

ID:301069 發(fā)表于 2018-12-20 12:19 | 顯示全部樓層
什么上位機
回復(fù)

使用道具 舉報

ID:719991 發(fā)表于 2020-4-1 15:03 | 顯示全部樓層
下載了,但是里面沒有原理圖,設(shè)計報告也就展示的這些,完整的只有上下位機的源碼,想要硬件設(shè)計的別下載。

評分

參與人數(shù) 1黑幣 +4 收起 理由
Adiós + 4 贊一個!

查看全部評分

回復(fù)

使用道具 舉報

ID:696335 發(fā)表于 2021-7-24 15:03 | 顯示全部樓層
請問大佬可以把主機F4的換為F1的嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频在线播放 | 亚洲第一视频 | 日韩精品a在线观看图片 | 日本韩国电影免费观看 | 免费看黄色小视频 | 超碰在线亚洲 | 国产精品日韩欧美一区二区三区 | 亚洲精选一区二区 | 日本一区二区三区免费观看 | 精品国产免费一区二区三区演员表 | 精品国产91亚洲一区二区三区www | 日日夜夜影院 | 九一在线观看 | 人人九九精 | 国产精品爱久久久久久久 | 日韩成人av在线播放 | 成人精品国产免费网站 | 91成人在线| 91在线免费观看网站 | 四虎影院在线播放 | 黄色片在线观看网址 | 亚洲+变态+欧美+另类+精品 | 男女爱爱福利视频 | 欧美国产视频 | av 一区二区三区 | 在线色| 日韩欧美在线视频 | 在线观看免费高清av | 日韩在线观看 | 九九久久免费视频 | 91高清在线观看 | 男人av网 | 免费在线成人 | 99re国产 | 亚洲综合色网站 | 99精品国产一区二区三区 | 91久久精品一区二区二区 | 欧美中文字幕一区二区三区 | 久久精品成人热国产成 | 久久久精品网站 | 天堂亚洲 |