用ESP8266播放音乐

简介: 最近我们做一个项目需要在ESP8266中播放一段音乐,当时一下就傻了,ESP8266可是没有D/A输出的! 一开始我们直接买了一块D/A解码的板子然后接上一个小功放来播放,但效果令人失望。

最近我们做一个项目需要在ESP8266中播放一段音乐,当时一下就傻了,ESP8266可是没有D/A输出的! 一开始我们直接买了一块D/A解码的板子然后接上一个小功放来播放,但效果令人失望。声音小不说其声音有很大的干扰噪声。而且这种做法无疑是难以产品化的,一个D/A解码再加一个功放那成本已经直接飙升了。

几经努力我们终于找到了一个非常实用的方案,根本不需要增加任何的附加硬件就以直接播放mp3!

这都归功于ESP8266Audio这个库,将喇叭直接接到一个数字输出口就可以直接播放MP3了,为了能有更大的功率加个普通三极管就可以完美推动一个小功率喇叭正常动作了。

 2N3904 (NPN)
                            +---------+
                            |         |     +-|
                            | E  B  C |    / S|
                            +-|--|--|-+    | P|
                              |  |  +------+ E|
                              |  |         | A|
ESP8266-GND ------------------+  |  +------+ K| 
                                 |  |      | E|
ESP8266-I2SOUT (Rx) -------------+  |      \ R|
                                    |       +-|
USB 5V -----------------------------+

这里我会放一个最简单的示例来展示一下怎么来使用这个库。

首先这个示例要使用SPIFFS来存储音乐文件,关于SPIFFS的具体用法可以参考我以前发表的SPIFFS的使用一文。

将ESP8266Audio这个库安装好以后,要先引用以下几个头文件:

#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

这个库使用起来非常简单。首先是初始化

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;

void setup()
{
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/test.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

然后在主循环函数中判断文件是否已经播放完成

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

以下是全部代码:

#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup()
{
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/jamonit.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

参考阅读

相关文章
|
6天前
|
IDE 搜索推荐 编译器
使用esp8266使用小爱同学实现开灯与关灯操作
使用esp8266使用小爱同学实现开灯与关灯操作
|
6天前
esp32s3实现openmv
esp32s3实现openmv
|
物联网 开发者
Wifi-nodeMCU-esp8266 固件库下载与调试工具介绍 | 学习笔记
快速学习 Wifi-nodeMCU-esp8266 固件库下载与调试工具介绍
938 0
Wifi-nodeMCU-esp8266 固件库下载与调试工具介绍 | 学习笔记
|
6天前
|
内存技术
esp8266-01s烧录AT固件方法以及遇到的问题总结
esp8266-01s烧录AT固件方法以及遇到的问题总结
|
6天前
|
语音技术
esp32+1.3寸屏幕语音交互
esp32+1.3寸屏幕语音交互
95 0
esp32+1.3寸屏幕语音交互
|
9月前
|
传感器
STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯
STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯
|
9月前
|
网络协议 网络架构
|
9月前
|
数据安全/隐私保护
Esp8266+阿里云+STM32点灯(二)
Esp8266+阿里云+STM32点灯(二)
|
9月前
|
开发工具
Esp8266+阿里云+STM32点灯(一)
Esp8266+阿里云+STM32点灯(一)