Fireduino语音天气播报(三)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5858|回复: 6

Fireduino语音天气播报(三)

[复制链接]
发表于 2017-5-10 14:49 | 显示全部楼层 |阅读模式
本帖最后由 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





 楼主| 发表于 2018-2-22 10:45 | 显示全部楼层
oliver.k 发表于 2018-2-21 16:48
大佬百度云盘打不开

这块板子坏了。。。最后改成mega2560+esp8266了
https://github.com/FanMLei/Weather_Station这个是Fireduino版本的
https://github.com/FanMLei/SmartHome mega版本的,天气那一部分在WiFi.c那个文件里面你自己改改
老铁点个star啊(手动滑稽)
发表于 2017-5-10 20:38 | 显示全部楼层
谢谢分享,温度是从网络获取?还是传感器?
 楼主| 发表于 2017-5-10 22:42 | 显示全部楼层
suoma 发表于 2017-5-10 20:38
谢谢分享,温度是从网络获取?还是传感器?

天气信息是从网上获取的,但是室内温度是通过传感器得到的,但是我得传感器有些问题所以目前是室内温度的数据是错误的,其他的并不影响
发表于 2018-2-21 16:48 | 显示全部楼层
本帖最后由 oliver.k 于 2018-2-21 16:52 编辑

大佬百度云盘打不开
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 01:51 , Processed in 0.284985 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表