最近我们做一个项目需要在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);
}
}
参考阅读