基于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;
}
}
}
}
系统创新
本系统将主从机分开,利用从机进行语音识别和温湿度监控,主机进行数据分析。通过蓝牙通信,获取智能手机上的天气数据,很好的解决了微控制器连接网路难题。并且,通过蓝牙连接,用户能够使用手机获得当前的温度信息。语音识别功能,增添了更加丰富的人机交互方式。此外,利用开发板上自带的加速度模块,能够实现彩屏的横竖屏切换。
评测与结论
系统的测试分三个阶段,第一个阶段主要是对硬件的测试。包括原理图,焊接等检测。焊接时,分模块焊接、测试。最后,进行整个模块上电测测。
第二个阶段主要是对软件的测试。软件测试也是先分模块测试,再总的进行测试。
第三个阶段是黑盒测试。我们小组内先进行组内测试。通过后,再请其他同学通过使用,发现其中的问题。再进行改进。
进过测试,第一,第二个阶段的测试比较顺利。第三个阶段的测试出现一些问题,主要是语音识别上的问题。通过不断改变算法,最终得到了很好的效果。