ESP-12F 網路電台收音機

學習如何學習!

設備與材料

個人電腦 × 1
ESP12F × 1
MAX98357A 模組 × 1
麵包板 × 1
連接線 若干

實體接線圖

MAX98357A

ESP8266 系列的處理器內部沒有 DAC(Digital to Analog Converter) 數位類比轉換器功能,因此選擇了MAX98357A 模組來處理數位類比轉換,因為 MAX98357A 是使用 I2S 協定來傳送資料,因此只要3支控制腳就能控制它。

MAX98357A 是一款 I2S 單聲道串列數位轉類比D類放大器模組,最大輸出功率3.2W(4Ω喇叭,工作電壓5V時),工作電壓2.5V ~ 5.5V,I2S 取樣頻率 8kHz ~ 96kHz。

模組接腳說明
LRC左右聲道時脈
BCLK時脈輸入
DIN數位串列輸入
GAIN放大增益設定
SD接地 ⟹ 關閉模組
空腳( 0.16V~0.77V ) ⟹ (左聲+右聲/2) 輸出
0.77V ~ 1.4V ⟹ 右聲道輸出
>1.4V ⟹ 左聲道輸出
GND接地
VIN電源 2.5V~5.5V
SD接腳內部電路

MAX 98357A GAIN 放大增益設定

放大增益(Gain)Gain 接腳
15 dB經由 100kΩ 電阻接地
12 dB直接接地
9 dB空接(內定)
6 dB直接接到Vin
3 dB經由 100kΩ 電阻接到 Vin

I2S

I2S 是一種音訊資料傳輸協定,由 philips 制定。該協定由至少三條資料線組成:

1、BCLK(bit clock):位元時脈,作用傳輸同步使用,時脈頻率 = 採樣率 * 每通道位數 * 通道數。

2、WS(word select):字元選擇、FS(frame Sync):框同步或 LRCLK(left-right clock,LRCLK):欄位(聲道)選擇。用來切換左右聲道資料,0 表示左聲道,1表示右聲道。
3、SD(Serial data):串列資料,但也可稱為SDATA, SDIN, SDOUT,DACDAT, ADCDAT..等

開發環境

使用 Arduino IDE 安裝 ESP8266開發板,如果不知道如何安裝ESP8266開發板,可以參考 “準備你的 ESP12E/F 開發工具” ,安裝開發板之後,記得開發板選擇 “NodeMCU 1.0(ESP-12E Module)” ,CPU Frequency 記得調到 160MHz ,如下圖

安裝ESP8266Audio 程式庫,選擇 Arduino IDE 中的 “草稿碼” ->”匯入程式庫” ->”管理程式庫” 輸入 ESP8266Audio 會出現如下圖,按 “安裝” 即可

範例程式

/*
 *  ESP-12F 網路電台收音機 I2S
 *  開發工具 Arduino IDE 必需自行加入ESP12F 開發板
 *  開發板 ESP12F(ESP8266)+MAX98357A   
 *  連接 wifi 後會連上網路電台的網址,進行收音 
 *  只支援 mp3 格式的網路電台
 *  MAX98357A   ESP12F
 *  Vin         5V  
 *  GND         G
 *  SD          空腳
 *  GAIN        G 
 *  DIN         RX
 *  BCLK        D8
 *  LRC         D4
 *  https://www.block.tw/blog
 */
 
#include <ESP8266WiFi.h>
#include "AudioFileSourceICYStream.h"   //MP3 網路串流處理
#include "AudioFileSourceBuffer.h"      //暫存處理
#include "AudioGeneratorMP3.h"          //MP3解碼
#include "AudioOutputI2S.h"             //I2S 音樂輸出

// 請將 ESP12F CPU 設定 為 160MHz

// WIFI SSID 與 密碼
const char *SSID = "yourSSID";
const char *PASSWORD = "你的wifi密碼";

/****************************************************************** 
 *  網路電台網址
 ******************************************************************/
//const char *URL = "http://vis.media-ice.musicradio.com/CapitalMP3"; 
//const char *URL="http://jazz.streamr.ru/jazz-64.mp3";
const char *URL="http://fm971.cityfm.tw:8080/971.mp3";  //台南知音
//const char *URL="http://fm929.cityfm.tw:8080/929.mp3";  //城市廣播
//const char *URL="http://fm983.cityfm.tw:8080/983.mp3";  //大苗栗廣播
//const char *URL="http://fm901.cityfm.tw:8080/901.mp3";  //台北健康

AudioGeneratorMP3 *mp3;           //MP3解碼
AudioFileSourceICYStream *file;   //MP3網路串流
AudioFileSourceBuffer *buff;      //暫存空間  
AudioOutputI2S *out;              //I2S 音樂輸出
void setup()
{
  Serial.begin(115200);
  delay(1000);
  Serial.println("WiFi連線中");
  WiFi.disconnect();
  WiFi.softAPdisconnect(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);

  //連上 wifi
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("...WiFi 連線中");
    delay(1000);
  }
  Serial.println("WiFi 已連線");  
  startPlay();  //開始收音
}

void loop(){
  static int lastms = 0;
  if (mp3->isRunning()) {
    if (millis() - lastms > 10000) {
      lastms = millis();
       Serial.printf("已執行 %d 秒...\n", lastms/1000);
       Serial.flush();
    }
    if (!mp3->loop()) mp3->stop();
  } else {
    Serial.printf("電台通訊中斷,重新連接中\n");    
    stopPlay();
    startPlay();    
  }
}

void stopPlay(){
  if (mp3) {
    mp3->stop();
    delete mp3;
    mp3 = NULL;
  }
  if (buff) {
    buff->close();
    delete buff;
    buff = NULL;
  }
  if (file) {
    file->close();
    delete file;
    file = NULL;
  }
}

void  startPlay(){
  file = new AudioFileSourceICYStream(URL);     //網路電台串流檔案
  //暫存空間 8k 暫存時間相當短,只要網路不順聲音就斷斷續續
  buff = new AudioFileSourceBuffer(file, 1024*8); 
  out = new AudioOutputI2S(); //I2S 串流音樂輸出
  //怕吵到人 測試用0.05  音量調整 0~4.0 喇叭 4Ω 板子的增益 6dB
  out->SetGain(0.05);
  mp3 = new AudioGeneratorMP3();    //mp3解碼  
  mp3->begin(buff, out);
}

功能

1、請你加入按鈕功能作為音量調整
2、請你加入按鈕功能作為電台選擇


入門
知識
語法
流程
函式
實習

發佈留言