毕业设计源码分享:基于STM32的智能桌面天气预报系统

2019-07-21 03:50发布

第一次在正点原子论坛发分享贴。在论坛里学到了很多东西,包括毕业设计作品,也是集成了论坛里两位大神的分享,再加上自己的一些东西组成的。学到很多,却很少写一些东西、很少分享出来。毕业半年多了,在工作中,才发现写东西是一项非常重要的技能。所以,现在也尝试着写一些分享,一来希望自己的分享也可以对别人产生一些帮助,二来也希望可以逐渐增强自己写东西的能力。下面把我的毕业设计作品源码分享出来给有需要的朋友进行参考学习。

源码: 智能桌面天气预报系统.rar (9.76 MB, 下载次数: 131) 2019-3-27 00:43 上传 点击文件名下载附件

作品介绍:
屏幕界面图如下:

主界面 主界面       菜单 菜单        wifi设置界面.png

其中,首页中的99℃,星期八,这不是系统出错,而是我故意设置的初始值,每当开机收到天气数据之后就可以看出有明显的变化。


系统演示视屏如下:

首先,对该作品进行简单的介绍。本系统采用 STM32 单片机为主控芯片, 通过 WiFi模块 GET 天气 API 接口,获取天气预报数据。 控制器把获取到的天气数据通过串口定时发送至
串口屏,结合优美的 GUI 界面,就构成了一套炫丽的桌面天气预报系统。本系统具有触摸屏搜索与语音搜索天气的功能,可以搜索各个城市的天气数据并更新至串口屏显示。 除此之外,本系统还具有如下几个功能: WiFi 配置功能、空气质量检测、收音机功能、语音识别功能、实时显示时间。  系统框图如下:
系统框图 系统框图



既然做的是天气预报,那么天气预报数据从哪来呢?天气数据可以从一些专门做天气预报的网站获取,如心知天气、和风天气等。我选择的是心知天气(https://www.seniverse.com/)。其网站首页如下:




心知天气首页.jpg


我们是通过其API密钥才能获取得到其天气数据,而只有注册的用户才拥有API密钥,所以必须得注册,可以点击右上角进行注册。我们的天气预报数据的格式是怎么样的呢?登录心知天气网站之后,点击菜单导航中的“数据”->“常规数据”即可查看“API文档”。在API文档页面的左侧可看到一些可查看的条目,如:


天气.png

可点击“天气实况”查看其相关说明,可以看到其天气数据格式如下图所示:


天气数据.jpg


这是JSON格式的数据。怎么解析类似这样的数据包得到我们想要的数据呢,在编写单片机程序之前,我们首先要做的应该是编写解析程序,解析程序写好之后,就可以很容易的移植到单片机中使用。这里我使用了一个第三方库——CJSON库尽心解析。首先,我把上图的天气数据拷贝到一个本地的now.txt文件中,然后编写一个程序,读取now.txt里的数据,然后调用CJSON的一些接口进行解析。下面给出解析实况天气与未来三天天气的解析程序:


JSON数据解析.png     now.png     daily.png


解析程序: JSON数据解析程序.rar (157.51 KB, 下载次数: 24) 2019-3-26 23:49 上传 点击文件名下载附件

关于这一部分,我有参考论坛里一位大神的帖子:http://www.openedv.com/thread-229818-1-1.html,一些其他的注意事项可以看这一篇帖子,很详细,包括JSON解析问题及移植的一些问题。在这里特别感谢这位坛友,从他的这篇帖子里我学到了很多。
其次,就是屏幕显示部分。我选用的是串口触摸显示屏,单片机使用串口就可以跟这屏幕进行通信。使用这屏幕的原因就是可以很方便快速的做出很漂亮的界面而且也很容易上手,同时,也减小了我们的MCU的负担,因为与显示相关的都是屏幕本身做了,我们用户MCU要做的就是给屏幕发送字符串数据,或者接收数据。本系统中,还用到了该屏幕自带的键盘,这样就很方便地使用触摸键盘(中文、英文都可以)进行搜索地名,从而搜索天气。

然后,人机对话部分使用的是硬件模块。语音识别模块采用的是LD3320,该芯片已经集成了语音识别的处理器,不需要外接其他的辅助芯片如Flash、 RAM 等。语音识别的过程为:
(1)先预存要识别的关键词,如:
关键词.png
(2)开始识别,如:


开始识别.png


nAsrStatus是用来表示语音识别的状态,不是LD3320芯片内部的状态寄存器。nAsrStatus有几种情况。我们比较关注的是LD_ASR_FOUNDOK状态。LD_ASR_FOUNDOK状态为识别成功,识别成功后将调用“ASRSuccess_Handle”函数进行识别后的操作。


(3)识别成功则执行相应操作,如


识别成功.png

设计识别码0为一级指令码,当一级指令码识别成功后,才能进行二级指令的识别。语音识别成功后,会调用“TTSPlay”函数播报所设定的文本语音,这样每一次的识别与播报就可以达到了一种人机互动的效果。

LD3320只可以预存50条关键词(关键句),我把这些关键词写死在程序里了,这显然就不能灵活的面对各种场景。其实可以通过代码编写一个学习功能,即识别之前首先进行学习一些即将要识别的关键词,然后在进行识别演示,这样就可以应对比较多的场景。
但是,这样还是不够智能,毕竟只能识别已经预存的关键词(关键句),要是没有预存就没办法识别了。所以真正的语音识别应该是在软件算法上下功夫,就像原子哥在(http://www.openedv.com/forum.php ... F%D2%F4%CA%B6%B1%F0)里对另一个使用LD3320的坛友说过:“要是能用STM32来做语音识别就更酷了”。本人小本科,无力去搞软件算法方面的语音识别。

文本合成语音的模块采用的是SYN6288,支持文本直接转化为语音。其与单片机的通信方式为串口通信。向该模块发送以下格式的数据包:
5字节帧头+文本+1字节校验,文本字节数小于等于200字节


即可合成语音。代码如:


TTS.png

调用方式如:[color=rgba(0, 0, 0, 0.5)]TTSPlay(0, "[t3][2]小天正在为您搜索福州天气");

以上就是关于本智能桌面天气预报系统的一些主要部分的介绍。其他如收音机等是本系统的一些附加功能,这里就不展开介绍了,有兴趣的朋友可以查看源码。关于本系统更详细的介绍可查看源码文件夹里的论文:

论文.png





最后,第一次在这发分享帖,真希望原子哥能给个cool



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。