基于STM32智能环境系统

摘要 

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

引言

  科技发展越来越快,我们将要进入物联网的世界。利用已经成熟的温湿度传感器技术,可以获得当前的温湿度信息;利用已经很成熟的光敏传感器技术可以获得当前的光照强度。如果我们将这些信息搜集起来,通过微处理器分析,从而给出控制信息,实现智能控制。我们所要做的事情就是:通过微处理器丰富的外设,来获取周围信息。再分析这些数据,利用自动控制算法,控制外围器件,实现环境的调控。

 系统方案 

  一、温湿度监测模块:1.与数字温度传感器通信,获取当前的温湿度信息。

                2.将获得温湿度信息进行滤波处理

             3.将温湿度数据打包传送给上位机

             4.上位机接受下位机传输数据,将数据解包存储

             5.上位机数据分析

该模块中最关键的算法是数据滤波,代码如下:

#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];

}

二、光照强度监测模块

     本模块比较简单。通过监测光敏电阻两端的电压,来获得电压数据。再将电压数据转化成光照强度数据。检测电压的方法是采用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播放器。该模块使用时首先初始化,再选择模块工作模式。通过查阅数据手册,可以更好的控制该芯片。结合无线模块可以实现对上位机的控制。结合语音识别功能和语音播放功能可以实现语音对话。

     

系统硬件设计

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

语音模块

语音识别模块 

无线模块

系统软件设计

主机:

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);

      //联机成功提示音

          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{

       // 竖屏状态

   // 双指放缩

       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;   

   }

   }

 }

}

系统创新

   本系统将主从机分开,利用从机进行语音识别和温湿度监控,主机进行数据分析。通过蓝牙通信,获取智能手机上的天气数据,很好的解决了微控制器连接网路难题。并且,通过蓝牙连接,用户能够使用手机获得当前的温度信息。语音识别功能,增添了更加丰富的人机交互方式。此外,利用开发板上自带的加速度模块,能够实现彩屏的横竖屏切换。

评测与结论

  系统的测试分三个阶段,第一个阶段主要是对硬件的测试。包括原理图,焊接等检测。焊接时,分模块焊接、测试。最后,进行整个模块上电测测。

  第二个阶段主要是对软件的测试。软件测试也是先分模块测试,再总的进行测试。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数分面试题2-牛客

1、面对大方差如何解决 1&#xff0c;AB实验场景下&#xff0c;如果一个指标的方差较大表示它的波动较大&#xff0c;那么实验组和对照组的显著差异可能是因为方差较大即随机波动较大。解决方法有&#xff1a;PSM方法、CUPED(方差缩减) PSM代表"Propensity Score Matchin…

phpstudy本地快速搭建网站,并外网访问【无公网IP】

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

深入解析 qsort 排序(上),它为什么是万能排序?

前言&#xff1a;对于库函数有适当了解的朋友们&#xff0c;对于 qsort 函数想必是有认知的&#xff0c;因为他可以对任意数据类型进行排序的功能属实是有点厉害的&#xff0c;本次分享&#xff0c;笔者就给大家带来 qsort 函数的全面的解读 本次知识的分享笔者分为上下俩卷文章…

网工内推 | 国企网络运维,大专以上即可,有厂商认证优先

01 北京新明星电子技术开发有限公司 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、负责所在特定客户的技术支持服务工作&#xff0c;负责各厂商服务器、存储设备的日常操作、系统升级、故障处理工作。 2、对运维工作进行总结、提出问题或隐患&#xff0c;给出建议…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

C++位图

一、前提引入 思考如何实现下面的题目 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 一个整型数据int为4个字节&#xff0c;计算得 &#xff0c;大约需要16G的存储空间。如果采用遍历判断…

01-从JDK源码级别剖析JVM类加载机制

上一篇&#xff1a;JVM虚拟机调优大全 1. 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 public class Math {public static final int initData 666;public static User user new User();public i…

论文阅读 - Outlier detection in social networks leveraging community structure

目录 摘要 1. Introduction 2. Related works 3. Preliminaries 3.1. 模块化度量 3.2. Classes of outliers 3.2.1. 点异常 3.2.2. Contextual anomalies 3.2.3. Collective anomalies 3.3. Problem definition 3.4. Outliers score 4. Methodology 4.1. Proposed appr…

初识FUSE(Filesystem in userspace)

初识FUSE&#xff08;Filesystem in userspace&#xff09; 什么是FUSE&#xff1f;FUSE原理FUSE协议 如何去使用&#xff1f;参考文章 之前因为一次作业有幸接触过FUSE,觉得它是一个很不错的框架&#xff0c;没来得及仔细了解。现在有点时间了&#xff0c;想要利用它做一个文件…

Linux部署kettle并设置定时任务

一.安装Kettle linux中使用kettle时首先需要jdk环境&#xff0c;这里就不概述linux中jdk的安装与配置了。 1.首先将kettle压缩包放入linux并解压 unzip data-integration.zip kettle安装路径为:/root/Kettle9.3/data-integration 设置权限 chmod -R 755 /root/Kettle9.3/d…

LVS负载均衡群集NAT模式

LVS负载均衡群集NAT模式 一、集群与分布式1.1、集群的含义1.2、lvs模型1.3、系统性能扩展方式1.4、群集的三种类型1.4.1、负载均衡群集1.4.2、高可用群集1.4.3、高性能运算群集 1.5、LVS的负载调度算法1.5.1、轮询1.5.2、加权轮询1.5.3、最少连接1.5.4、加权最少连接1.5.5、ip_…

pc端测试手机浏览器运行情况,主要是测试硬件功能

测试h5震动摇晃等功能时不方便测试&#xff0c;需要连电脑显示调试数据 方法&#xff1a; 1.需要手机下载谷歌浏览器&#xff0c;pc端用edge或这谷歌浏览器 2.手机打开USB调试&#xff0c;打开要测试的网页 3.pc端地址栏输入edge://inspect/#devices&#xff08;这里用的edge浏…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …

Linux HTTP协议

目录 1.浏览器与服务器通信过程2.HTTP请求报头&#xff08;1&#xff09;HTTP的请求报头结构&#xff08;2&#xff09;HTTP的请求方法 3.HTTP应答报头&#xff08;1&#xff09;HTTP的应答报头结构&#xff08;2&#xff09; HTTP的应答状态 1.浏览器与服务器通信过程 浏览器…

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…

清理Maven仓库中下载失败的文件

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Nginx详解 五:反向代理

文章目录 1. 正向代理和反向代理1.1 正向代理概述1.1.1 什么是正向代理1.1.2 正向代理的作用1.1.3 正向代理的基本格式 1.2 反向代理概述1.2.1 什么是反向代理1.2.2 反向代理可实现的功能1.2.3 反向代理的可用模块 2. 配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其…

当你的公司突然开始大量的裁员,被留下的你,真的准备好面对以后了吗?

留下来的&#xff0c;也是迷茫的 最近公司突然开始大量裁员&#xff0c;裁了一多半&#xff0c;作为唯一留下的APP 端开发人员&#xff0c;也开始陷入了焦虑&#xff0c;开始了思考&#xff0c;未来究竟何去何从&#xff0c;是否再去转到原生&#xff0c;从事原生的开发工作&a…

C语言入门Day_19 初识函数

目录 1.函数的定义 2.函数的调用 3.易错点 4.思维导图 前言&#xff1a; printf()我们已经很熟悉了&#xff0c;它有一个特定的功能&#xff0c;就是在屏幕上输出一行文字。之前的课程我们都称呼printf()为一个功能&#xff0c;实际上ta在编程中有个特定的名字——函数。 …

测试-----selenuim webDriver

文章目录 1.页面导航2.元素定位3. 浏览器操作4.获取元素信息5. 鼠标的操作6. 键盘操作7. 元素等待8.下拉框9.弹出框10.滚动条11.frame处理12.验证码处理&#xff08;cookie&#xff09; 1.页面导航 首先是导入对应的包 :from selenium import webdriver然后实例化:driver web…