基于STM32智能环境系统

news2025/1/10 21:15:25

摘要 

     本系统采用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.coloradmin.cn/o/1002783.html

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

相关文章

《信息系统项目管理师教程(第4版)》第19章 配置与变更管理 知识点整理 xmind思维导图

已上传xmind思维导图&#xff0c;需要可下载 一、配置管理 基于配置库的变更控制(经常考) 二、变更管理

华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第4期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、数据结构第2天、滑动窗口第3天、贪心算法第4天、二分查找第5天、分治递归第6天、深度优先搜索dfs算法第7天、宽度优选算法&#xff0c;回溯法 六…

Mybatis-Plus 使用教程

01-Mybatis-Plus介绍 1.1 什么是mybatis-plus 官网: 简介 | MyBatis-Plus MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 1.2 官方愿景 1.3 特性 无侵入&…

伪谱法地震波场数值模拟

本文实现内容 各向同性介质波动方程伪谱法波场求解。各项异性介质(VTI、HTI)介质伪谱法波场求解。实现了衰减边界条件、拓展周期边界法。一种波场模拟的数据存储格式.sfd&#xff0c;提供二进制或文本输入输出。对波场模拟得到的存储数据进行.gif绘制、.png绘制、地震剖面绘制…

MyBatis核心配置文件解析: 一步步深入理解mybatis-config.xml

&#x1f600;前言 在进行MyBatis项目开发时&#xff0c;合理和高效的配置是确保项目顺利进行的基础。其中&#xff0c;mybatis-config.xml配置文件扮演着极其重要的角色&#xff0c;它包含了MyBatis运行时的各种必要配置信息&#xff0c;如数据库连接属性、事务管理器配置、别…

vector容器的详解与分析

简介&#xff1a; vector容器在高级语言中运用非常广泛&#xff0c;此容器可看成C语言中的动态数组结构用来存储一系列数据&#xff0c;它不仅支持C语言数组中的所有使用方式&#xff0c;还支持vector在C中还有更高级的使用。在C往后的高级运用时&#xff0c;通常把一些常用的操…

基于Java web的医院分诊管理系统文档

摘要 医院分诊管理系统是适应时代发展的需要&#xff0c;提高管理的效率而开发设计的&#xff0c;有效的减少了患者排队取号的时间&#xff0c;增加了医生的工作效率。通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享&#xff0c;及时为医院领导及各部…

报错处理:Redis无法连接

报错环境&#xff1a; Linux Redis 具体报错&#xff1a; redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused. 排错思路&#xff1a; 当尝试连接Redis服务时&#xff0c;如果出现连接拒绝的错误&#xff0c;可能是由于Redis服务…

修正能力是智能的关键之一

智能包括事前预测、事中干预和事后反馈。这些方面相互关联&#xff0c;共同构成了一个完整的智能系统。 事前预测&#xff1a;智能系统可以通过分析数据、模式识别和机器学习等方法&#xff0c;进行事前预测。它可以根据已有的信息和历史数据&#xff0c;推测未来可能发生的情况…

csdn如何删除已发布的博客内容

首先&#xff0c;将鼠标移动到自己的头像&#xff0c;会显示内容管理 点击内容管理进入下方界面&#xff0c;选择文章&#xff0c;在想要删除的文章的后边的浏览旁边有三个点&#xff0c;点击后选择删除&#xff0c;删除后回到主页面刷新页面&#xff0c;会发现已发布的文章已经…

饲料添加剂 微生物 植物乳杆菌 学习记录

声明 本文是学习GB 7300.502-2023 饲料添加剂 第5部分&#xff1a;微生物 植物乳杆菌. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了饲料添加剂植物乳杆菌的技术要求、采样、检验规则、标签、包装、运输、贮存和保质 期&#…

K8S 二进制部署

一、准备规划二、操作系统初始化配置2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap2.4 根据规划设置主机名2.5 在master添加hosts2.6 调整内核参数 三、部署 docker引擎四、部署 etcd 集群4.1 准备签发证书环境4.2 生成Etcd证书4.3 创建用于存放 etcd 配置文件&#xff0c;命令文…

Java“牵手”淘宝商品列表页数据采集+商品价格数据排序,商品销量排序数据采集方法

采集场景 在淘宝首页&#xff08;https://s.taobao.com/&#xff09;输入关键词搜索&#xff0c;采集搜索后得到的商品列表页数据。示例中关键词为【耐克】&#xff0c;可根据需求进行更换&#xff0c;同时支持自动批量输入多个关键词。 采集字段 采集字段包括关键字文本值…

js如何实现一个简单的节流函数?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现简单的节流函数⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入…

模电课设:用Multisim简析三极管与场效应管放大电路

1 课设内容 1&#xff09;利用Multisim搭建基于晶体三极管的放大电路&#xff1b; 2&#xff09;利用Multisim搭建基于场效应管的放大电路&#xff1b; 2 模型搭建 我们首先要认清放大电路的概念。它指的是把输入微弱的电信号的功率放大&#xff0c;因为在多数情况下&#xf…

改善客户体验应该从哪几个方面入手?

在为客户提供良好使用体验的同时&#xff0c;还在针对性的为他们制定个性化服务&#xff0c;大多数公司都知道提供良好的客户体验的重要性&#xff0c;&#xff0c;那么如何为客户提供最佳的体验呢&#xff1f; 为客户提供最佳的体验需要从以下几方面入手&#xff1a; 了解客…

IP175G参考资料和引脚图

特性 5端口嵌入式10/100PHY开关控制器 支持5100BaseTX(IP175G)或4100BaseTX(85nm)技术&#xff0c;只需要3.3V单通道 1FX(IP175GH) 支持1KMAC地址表项 448K位包缓冲存储器 100MPHY支持IEEE8023az全双工 10MPHY只支持10BaseTe 支持自动MDI-MDIX功能 电源管理工具(PWMT)…

电工-PN结的工作原理

如果将PN结加正向电压&#xff0c;即P区接正极&#xff0c;N区接负极&#xff0c;如右图所示。由于外加电压的电场方向和PN结内电场方向相反。在外电场的作用下&#xff0c;内电场将会被削弱&#xff0c;使得阻挡层变窄&#xff0c;扩散运动因此增强。这样多数载流子将在外电场…

ADASAPA场景设计分享

相信大家都对于ADAS与APA这两个车机功能都不陌生&#xff0c;对其场景设计过程可能并不是很清楚。今天小怿就跟大家分享一下自己的设计心得。 首先&#xff0c;我们来看一下ADAS和APA的定义&#xff0c;以便我们更好地了解其功能和应用场景。 ADAS定义 ADAS的全称叫Advanced …

【开发工具】使用瑞萨CS+ for CC创建lib和使用lib

首先使用CS新建一个library工程 然后在工程中添加lib所需文件 文件准备好就可以编译了 在文件夹中可以找到生成的lib文件 直接在要使用的工程中加入lib就可以编译使用了