找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7440|回复: 5
收起左侧

STM32+NRF24L01无线智能家居环境监测系统设计(上位机+下位机源码与硬件图)

  [复制链接]
ID:438753 发表于 2018-12-10 20:50 | 显示全部楼层 |阅读模式
基于ZigBee的智能家居环境监测系统设计,包括上位机和下位机,附带源码
0.png

ARM-STM32校园创新大赛
题    目:基于STM32的智能环境监测系统  

摘要
     本系统采用stm32f407作为主控芯片,实现对环境的监测。并且通过和手机通信,获取当前的天气预报信息,结合当前测得的温湿度,可以为用户提供出行建议。利用stm32自带的RTC可以实现时间及闹钟功能。此外RTC还可以用于电子日历的制作。从机主控芯片是STM32f103,其主要功能是测取当前的温湿度信息和语音识别。主从机通过nrf24l01无线通信。

1.        引言
  科技发展越来越快,我们将要进入物联网的世界。利用已经成熟的温湿度传感器技术,可以获得当前的温湿度信息;利用已经很成熟的光敏传感器技术可以获得当前的光照强度。如果我们将这些信息搜集起来,通过微处理器分析,从而给出控制信息,实现智能控制。我们所要做的事情就是:通过微处理器丰富的外设,来获取周围信息。再分析这些数据,利用自动控制算法,控制外围器件,实现环境的调控。
2.    系统方案
  一、温湿度监测模块:1.与数字温度传感器通信,获取当前的温湿度信息。
                2.将获得温湿度信息进行滤波处理
             3.将温湿度数据打包传送给上位机
             4.上位机接受下位机传输数据,将数据解包存储
             5.上位机数据分析
该模块中最关键的算法是数据滤波,代码如下:

  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. }
复制代码

二、光照强度监测模块
     本模块比较简单。通过监测光敏电阻两端的电压,来获得电压数据。再将电压数据转化成光照强度数据。检测电压的方法是采用STM32F407的AD模块来实现。同上一个模块一样,要对数据进行滤波处理。算法如上。
三、2.4G无线通信模块
     本模块是连接主从机的关键模块。采用的通信芯片是NRF24L01。该芯片内部包括频率发生器、增强型ShockBurst模式控制器、功率放大器、晶体振荡器、调制器、解调器等功能模块。通信接口为SPI,待机电流22uA。
     该模块的使用主要是通过对其进行初始化、再选择工作状态(RX/TX)、发送或接收数据。通过软件查询方式,来通信。前期调试时,下位机由于以前调试过,没有遇到什么问题。主要是在STM32F407上由于干接触,还不太了解该SPI库函数的使用方法,犯了一些低级错误。后期调好之后没有出现过大的问题。
  • 蓝牙通信模块
     蓝牙通行模块是用于与智能手机及电脑通信的。本系统通过该模块与手机通信,获取当前的天气预报信息。此外,还可通过智能手机、电脑等获取本系统当前的信息以及控制本系统。该模块与STM32f407通过USART通信。主要难点是:控制指令是AT指令。由于此前没有学习过该指令,学习该指令花费了几天时间。该模块稳定性高,调试成功后一直没有出现过大的问题。
  五、SYN6288合成语音模块
          本模块采用USART进行通信。该语音合成芯片,支持多种编码的数据。如:ASIC GBK UTF等。语音合成数据通过打包发送到该模块。
支持多音字及人名的智能识别。该模块控制命令多大几十条,可以很好的实现对输出音量、语速、背景音、多音字识别、强制连读等调控。该模块实现时遇到两个难题:1、多指令的学习使用问题 2、电流干扰问题。第一个问题通过学习该芯片使用手册很快得到了解决。第二个问题的现象是,每当播放语音时,显示屏上就会乱码。经过多次检测,发现问题是该模块播音时电流变化大,对开发板上的电源产生了干扰。解决办法是采用外界电源。
六、语音识别模块LSD3320
   本模块基本功能是识别语音,附加功能是播放语音。本模块通过SPI与从机主控芯片通信。从机控制该模块进行语音识别和语音播放。结合fatfs与sdio,可从sd卡上读取MP3数据,从而实现了语音识别MP3播放器。该模块使用时首先初始化,再选择模块工作模式。通过查阅数据手册,可以更好的控制该芯片。结合无线模块可以实现对上位机的控制。结合语音识别功能和语音播放功能可以实现语音对话。

3.        系统硬件设计
详细介绍系统各个模块的硬件实现过程,包括电路系统仿真,说明采用关键器件的理由及关键部分的原理图 (不得大量复制原理图和PCB图,更多用框图的方式示意,仅对能体现工作量和创新的部分提供原理图,评委有权对滥用原理图的论文扣分)
0.png

语音模块
语音识别模块 
无线模块

4.        系统软件设计

5.        系统创新
   本系统将主从机分开,利用从机进行语音识别和温湿度监控,主机进行数据分析。通过蓝牙通信,获取智能手机上的天气数据,很好的解决了微控制器连接网路难题。并且,通过蓝牙连接,用户能够使用手机获得当前的温度信息。语音识别功能,增添了更加丰富的人机交互方式。此外,利用开发板上自带的加速度模块,能够实现彩屏的横竖屏切换。
6.   评测与结论  
系统的测试分三个阶段,第一个阶段主要是对硬件的测试。包括原理图,焊接等检测。焊接时,分模块焊接、测试。最后,进行整个模块上电测测。
  第二个阶段主要是对软件的测试。软件测试也是先分模块测试,再总的进行测试。

  第三个阶段是黑盒测试。我们小组内先进行组内测试。通过后,再请其他同学通过使用,发现其中的问题。再进行改进。

进过测试,第一,第二个阶段的测试比较顺利。第三个阶段的测试出现一些问题,主要是语音识别上的问题。通过不断改变算法,最终得到了很好的效果。
附录



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.                                   //联机成功提示音
  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.                      // 竖屏状态
  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. }
复制代码

所有资料51hei提供下载:
基于STM32 环境智能监测、报警系统(硬件、上位机、下位机源码、设计报告等).rar (3.56 MB, 下载次数: 269)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:104779 发表于 2018-12-10 22:42 | 显示全部楼层
高手啊高手,你可以出专辑了。
回复

使用道具 举报

ID:424598 发表于 2018-12-11 09:38 来自手机 | 显示全部楼层
设计不错,不过用这种屏有点浪费
回复

使用道具 举报

ID:301069 发表于 2018-12-20 12:19 | 显示全部楼层
什么上位机
回复

使用道具 举报

ID:719991 发表于 2020-4-1 15:03 | 显示全部楼层
下载了,但是里面没有原理图,设计报告也就展示的这些,完整的只有上下位机的源码,想要硬件设计的别下载。

评分

参与人数 1黑币 +4 收起 理由
Adiós + 4 赞一个!

查看全部评分

回复

使用道具 举报

ID:696335 发表于 2021-7-24 15:03 | 显示全部楼层
请问大佬可以把主机F4的换为F1的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表