天天看點

用ESP8266播放音樂

最近我們做一個項目需要在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);
  }
}
           

參考閱讀