一、前期准备
Arduino版本请使用2.0之前版本,否则无法使用SPIFFS上传。
Esp8266开发版本请更新到2.7.4及以上,否则会出现编译错误。
删除C盘Arduino15\libraries里的SD和WIFI。这里是因为他会提示使用多个库导致编译错误,后来试了多种方法解决,后来就编译成功了。但撰写本文已经是好几天之后了,记得不是很清楚了。如有疑问,可以评论区讨论。
你需要安装ESP8266FS,因为这样才可以进行SPIFFS上传。选择 ESP8266FS-0.5.0.zip 下载地址)下载,解压复制ESP8266FS到Arduino IDE安装目录tools下。
Arduino库:ESP8266Audio
频率设置为:160MHz
二、库的作者的示例
#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);
}
}
下面开始解析例子(因作者水平有限且该函数库几乎没有详细的中文解析,如有错误,敬请指正)
1、头文件
#include "AudioFileSourceSPIFFS.h"
包含 "AudioFileSourceSPIFFS.h" 从而使用AudioFileSourceSPIFFS类来创建一个对象。
AudioFileSourceSPIFFS *file;
该变量类型的作用为:Reads a file from the SPIFFS filesystem,显而易见,读取SPIFFS中的文件。
#include "AudioGeneratorMP3.h"
包含 “AudioGeneratorMP3.h" 从而使用AudioGeneratorMP3类创建一个对象。
AudioGeneratorMP3 *mp3;
作用为:Reads and plays MP3 format files (.MP3) using a ported libMAD library. 使用移植的libMAD库读取和播放MP3格式的文件。
#include "AudioOutputI2SNoDAC.h"
AudioOutputI2SNoDAC *out;
作用为:没有DAC的情况下,直接播放音乐。注意,使用此接口,您可能需要断开Rx引脚与驱动器的连接以执行串行上载。而且,只有单声道输出。使用此头文件下的电路连接如下图:
2N3904 (NPN)
+---------+
| | +-|
| E B C | / S|
+-|--|--|-+ | P|
| | +------+ E|
| | | A|
ESP8266-GND ------------------+ | +------+ K|
| | | E|
ESP8266-I2SOUT (Rx) -----/\/\/\--+ | \ R|
| +-|
USB 5V -----------------------------+
You may also want to add a 220uF cap from USB5V to GND just to help filter out any voltage droop during high volume playback.
注意:基极与Rx间需要连接1个1K欧姆的电阻,NPN的型号为2N3904。也可以在USB 5V 和 GND之间连接一个220uF的电容。、
2、初始化
void setup()
{
Serial.begin(115200);
delay(1000);
// SPIFFS初始化
SPIFFS.begin();
// 选择要播放的mp3文件
file = new AudioFileSourceSPIFFS("/jamonit.mp3");
// 播放的方式
out = new AudioOutputI2SNoDAC();
// 播放的文件类型
mp3 = new AudioGeneratorMP3();
// mp3初始化
mp3->begin(file, out);
}
3、主函数
void loop()
{
// 执行isRunning(),并且判断是否在播放
if (mp3->isRunning())
{
// 判断是否在循环播放,是的话loop()回return false,所以 !false = true
if (!mp3->loop())
// 停止播放
mp3->stop();
}
else {
Serial.printf("MP3 done\n");
delay(1000);
}
}
这里的mp3的成员函数,可以在源代码里自行查询分析。