|
本帖最后由 Mr.fan 于 2017-5-10 14:49 编辑
这篇我们会讲如何使用板载的语音模块播放。
需要注意的是目前不支持2G以下的SD卡,这里的2G是指实际容量,所以你只能准备最低4G的SD卡。(有木有感觉很坑,压根用不到这么大的内存却需要占用这么大的内存。。。),而且询问过他们的技术人员才知道,在播放的时候会自动淡入和淡出,并且不能修改,所以在合成较短的语音的时候需要注意一下,最好在语音前面和后面增加一段空白,这样不会导致语音没播放完就播放下一条。
好了切入正题
因为天气有太多种情况,所以我们没法单独播放一段语音达到我们的目的,因此我们需要在语音合成软件中分段合成,然后根据天气情况按照一定的顺序播放,这里为了避免使用太多的if语句来判断,我们可以在语音文件的命名上做些设计,例如“最高气温16摄氏度”这段语音可以命名为 '16th' 然后将获取到的温度数据合成一个和语音文件名称相同的字符串,就能简化很多步骤。
[mw_shl_code=bash,true]
//由于我们获取的为int类型,不能进行字符串的操作,这里先转换一下
sprintf(temperature_low_voice, "%d", temperature_low_day1);
//生成一个字符串
strcat(audio_buffer, "\\voice\\");
strcat(audio_buffer, temperature_high_voice);
strcat(audio_buffer, "th.wav");
//最后的结果为 audio_buffer="\\voice\\16th.wav"
[/mw_shl_code]其他的和这个操作一样这里就不再啰嗦了
下面介绍一下语音模块的操作,主要使用到了两个函数Audio.playFile()播放指定目录下的语音文件 、Audio.getStatus()获取当前的播放状态,更多的信息请移步到官网的wiki查看
[mw_shl_code=bash,true]void audio()
{
strcat (audio_buffer, "\\voice\\");
strcat(audio_buffer, code_voice);
strcat(audio_buffer, ".wav");
Audio.playFile(audio_buffer);
while (Audio.getStatus() != AudioStop);
if (Audio.getStatus() == AudioStop)
{
memset(audio_buffer, '\0', sizeof(audio_buffer));//由于只定义的一个字符串所以每次合成新的之前需要将以前的字符串清空
strcat(audio_buffer, "\\voice\\");
strcat(audio_buffer, temperature_high_voice);
strcat(audio_buffer, "th.wav");
Audio.playFile(audio_buffer);
while (Audio.getStatus() != AudioStop);
if (Audio.getStatus() == AudioStop)
{
memset(audio_buffer, '\0', sizeof(audio_buffer));
strcat(audio_buffer, "\\voice\\");
strcat(audio_buffer, temperature_low_voice);
strcat(audio_buffer, "tl.wav");
Audio.playFile(audio_buffer);
while (Audio.getStatus() != AudioStop);
if (Audio.getStatus() == AudioStop)
{
memset(audio_buffer, '\0', sizeof(audio_buffer));
Audio.playFile(wind_buffer);
while (Audio.getStatus() != AudioStop);
if (Audio.getStatus() == AudioStop)
{
memset(wind_buffer, '\0', sizeof(wind_buffer));
strcat (audio_buffer, "\\voice\\");
strcat(audio_buffer, temperature_voice);
strcat(audio_buffer, "to.wav");
Audio.playFile(audio_buffer);
while(Audio.getStatus() != AudioStop);
if(Audio.getStatus() == AudioStop)
{
memset(audio_buffer, '\0', sizeof(audio_buffer));
strcat (audio_buffer, "\\voice\\");
strcat(audio_buffer, temperature_dth11);
strcat(audio_buffer, "ti.wav");
Audio.playFile(audio_buffer);
while(Audio.getStatus() != AudioStop);
memset(wind_buffer, '\0', sizeof(wind_buffer));
}
}
}
}
}
}[/mw_shl_code]最后说一下,由于测试空间大小的限制,就没有增加人体红外模块,DTH11模块好像不兼容板子获取的数据有误,但是在源码里面没有去除(不是太影响使用),大家可以自己删去或者使用其他的温湿度模块,反正也不是太难。
整个项目到这就完成了,最后在这里感谢一下firefly免费提供的板子,也要感谢一下技术人员的耐心指导。
完整演示视频
源码下载:
http://pan.baidu.com/s/1bpoyh0F
|
|