# 计算机挑战赛 **Repository Path**: JeckXu666/computer-challenge ## Basic Information - **Project Name**: 计算机挑战赛 - **Description**: 计算机能力挑战赛源码 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 3 - **Created**: 2021-01-09 - **Last Updated**: 2024-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: stm32, UCOS, RTOS ## README # 计算机挑战赛 #### 介绍 计算机能力挑战赛源码 虽然这次比赛很狗,但也学到不少,让我知道再好的程序也需要包装 # 一、赛题 ## 1. 设计目标 设计制作一款可以**人机交互**、具备**移动互联**功能的智能车载终端系统。 ## 2. 基本要求 1. 车载娱乐播放 (1)读取储存在SD卡中的音乐文件,并通过扬声器播放出来。 (2)以TFT彩屏作为显示终端,显示当前的音乐文件信息,歌曲名、进度条、音量、码率等。 (3)实现歌曲播放控制,具有"上一首"、"下一首"、"暂停"等基本操作功能。 2. 车载仪表显示 (4)以TFT彩屏作为显示终端,显示照明灯的状态(开/关)、继电器的状态(开/闭);显示水温(单位摄氏度)、油位(无单位,数值一般为占满量程的比例)、车速(单位千米/小时)信息。 (5)水温来自于温度传感器、油位来自于滑动变阻器、车速来自于旋转的步进电机测速;水温数据、油位数据、车速数据每隔2秒动态刷新;采用合理方式调整水温、油位信号变化,以产生可见动态变化效果。 (6)设计按键模拟油门给出"加速"、"减速"、"停车"等输入指令,控制步进电机做相应动作,并将车速及运行状态"加速/减速/停车"显示于TFT屏。 ## 3. 扩展要求 (1)可以实现音频文件的录制功能,不通过第三方的导入功能,直接录制并存储音频。 (2)实现歌曲播放控制的更多操作,例如生成播放列表、设置循环模式(单曲、顺序、随机)等。 (3)模拟实现汽车"黑匣子"功能:当某一按键按下时,系统记录当前时刻的仪表信息(如水温、油位、车速及运转状态、照明灯与继电器状态等),并存储于EEPROM硬件中;关机后重新开机能够复现前次的各类信息。 ## 4. 发挥要求 1. 移动互联功能 (1)通过以太网或WIFI网络方式,与移动互联模块(手机或平板)之间进行车内仪表数据的上传。 (2)编制安卓或苹果APP,实现与车内仪表类似的界面显示。 2. 智能语音控制 (3)通过语音识别实现对硬件设备的控制,例如说出"打开照明灯"、"关闭继电器"等,可直接转换为对应的输出设备动作。 # 二、分析 在拿到题目的时候,首先浏览了一遍题目,第一感觉: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219155533655.jpg) 这什么鬼、题目量也太大了吧,裸机手撸死翘翘好吧,所以果断选择uCos来作为调度系统,进行多任务管理。虽然任务量很大,但对处理器的要求并不是很高,只是逻辑布置很麻烦,所以我计划使用STM32F103ZET6来做这个。 然后开始逐步分解题目内容,从基本要求开始做,一点一点增加任务,完成项目,下面开始讲解基本任务: ## 1. 基本要求-车载娱乐播放 第一点要求读取SD卡音乐文件,并且播放,这里的技术要点主要是建立一个FAFT文件系统,挂载SD卡,读取我们指定的音乐目录下的音乐文件,然后通过解码播放,这里选择VS1053模块来做解码,接一个扬声器播放。 TFT显示信息直接使用LCD就行,使用极其方便,初始化一下,直接调用API就行,这里我一开始想使用EMWIN来做界面,但考虑到直接使用这些不是熟练,故放弃使用EMWIN做界面。关于显示歌曲的信息,因为直接使用的VS1053,可以直接通过寄存器发送读取对应信息的指令,之后读取对应返回值进行处理就行,这部分代码在正点原子战舰的例程里面有给出,代码封装的风格很好,读一遍基本可以理解,然后就能调用。关于音乐切换其实就是在mp3初始化时,把所有音乐的文件路径存储到一个字符串链表里面,播放不同音乐就是根据链表重新选择一下文件路径,然后再进入死循环播放就行了,音乐暂停,在UCOS里面直接使用挂起任务就可以完成,需要继续播放则使用任务恢复API就可以完成恢复。 ![VS1053模块](https://img-blog.csdnimg.cn/20201219225623712.png) ## 2. 基本要求-车载仪表显示 仪表显示因为没有使用emwin界面工具,用单纯的纯手画图方式设计一个好看界面太占据内存,并且效率不高,实现意义不大,故直接使用最传统的方式----显示文字法,节省内存,提高效率(就是丑了点~) 温度采集使用DS18B20来采集温度信息,单总线结合GPIO模拟协议进行写入和读取,电机速率采集则使用红外对管测速,通过外部中断配合定时测量一段时间内转动码盘上经过的孔的数量,从而计算出速率,加速减速通过改变步进电机脉冲之间的时间。 DS18B20: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219225825495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Mzk2Njcy,size_16,color_FFFFFF,t_70) 测速模块: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219225905103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Mzk2Njcy,size_16,color_FFFFFF,t_70) ## 3. 扩展要求-音频录制 音频的录制和mp3播放使用的同一个模块,故在使用音频播放时需要创重新初始化vs1053同时需要重新配置mp3播放的功能,录音的使用和mp3其实差不了多少,正点原子关于这个模块有较详细的叙述,后面我也简单的写一下。 ## 4. 扩展要求-歌曲列表 歌曲列表的显示其实就是轮询SD卡音乐文件夹下各个音乐的信息,然后将音乐名称打印出来,每次切换音乐都重新打印,可以刷新列表,关于切换音乐,顺序播放切换音乐就是对链表切花时位移一个,单曲位移为0,使播放原地踏步,随机播放呢,我使用的UCOS内部产生32位随机数的API然后除以最大音乐数目取余数,相当于在所有音乐之中随机播放音乐。 ## 5. 扩展要求-汽车黑匣子 黑匣子这个难度不是很大,IIC连接EEPROM存储信息就行了,但是跑着uCos上可能会出一些问题,尤其在使用正点原子的ucos延时时会出现这个问题,正点原子ucos代码us级延时误差挺大,我文中会给出解决方法。 EEPROM模块: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219230052602.png) ## 6. 发挥要求-移动互联功能 移动互联网功能就是一个上云功能,at指令配好,了解一下MQTT协议就能完成,然后就可以传输数据上云了(公网云),我们这使用的是阿里云平台,因为他有个快速制作app界面的功能,所以使用起来很方便,也能做出题目要求的界面效果,所以使用阿里云。 ESP8266模块: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219230211181.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Mzk2Njcy,size_16,color_FFFFFF,t_70) ## 7. 发挥要求-智能语音控制 语音识别直接配置完整的模块,写入识别信息,模块自带匹配功能,识别之后执行对应的指令,配置过程很简单,直接使用源码没有问题! LD3320语音识别模块: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219230637783.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Mzk2Njcy,size_16,color_FFFFFF,t_70)