ESP32, IOT物聯網

【ESP32】第十七篇:LM386聲音感測器模組實作動感聲控節奏燈

一、 實驗說明:打造智慧動感聲控音樂節奏燈!

在創客互動專題與智慧居家情境中,聲音感知與燈光互動是非常受歡迎的應用範例。不論是跟隨音樂律動閃爍的氣氛燈、聲控開關,或是會隨聲音跳舞的機器人,都離不開靈敏的聲音檢測模組。

本實驗米羅將帶大家使用 ESP32 開發板 搭配 LM386 聲音感測器模組 與 多顆 LED 燈。LM386 模組內建音頻放大晶片,能精準捕捉環境中細微的聲音強度變化。當聲音類比訊號超過設定的閾值時,ESP32 便會驅動 LED 陣列隨音樂拍子閃爍,輕鬆打造炫酷的動感聲控節奏燈!

 

二、 實驗材料準備清單

本篇實作 ESP32 聲控音樂節奏燈專案所需的硬體元件如下:

  • ESP32 開發板

  • 麵包板 (Breadboard)

  • LM386 聲音感測器模組

  • 直插式 LED 燈(可挑選不同顏色增添視覺效果)

  • 220Ω 限流電阻

  • 麵包板跳線 若干

  • USB 傳輸線

 

⭐  一次備齊創客工具!

歡迎直接購買米羅科技的 ESP32 物聯網應用學習套件,免去東奔西跑湊零件的煩惱。內含 LM386 聲音感測器、各式 LED 燈及豐富基礎元件,是學校教學與專案開發的最佳首選!

 

三、 核心知識:LM386 聲音感測器工作原理與接線

1. LM386 聲音感測器模組簡介

傳統的聲音感測器通常只能簡單判斷「有無聲音」(數位訊號輸出),而 LM386 聲音感測器模組 採用了 LM386 音頻功率放大 IC,配合駐極體麥克風(Mic),能將接收到的微弱聲波訊號進行放大處理。透過類比輸出腳位(AO),ESP32 能讀取到更細緻的聲壓電壓變化,非常適合做音樂韻律與聲控互動。

 

2. 模組電位器靈敏度調節

LM386 模組板載設有可變電阻(電位器),旋轉它可以調整麥克風的放大增益與靈敏度,以適應不同噪音程度的環境背景音。

 

3. ESP32 與各模組接線對照表

元件名稱 元件針腳 / 標記 連接至 ESP32 腳位 腳位功能說明
LM386 聲音感測器 VCC 5V / VIN 電源輸入(建議 5V 供電以獲得最佳放大效果)
LM386 聲音感測器 GND GND 電源接地端
LM386 聲音感測器 AO (Analog Out) GPIO 36 (VP) ADC1 通道,讀取聲音強度類比電壓
LED 陣列 1~5 正極 (長腳) GPIO 16, 17, 5, 18, 19 數位輸出腳,送出高電位點亮 LED(需串接 220Ω 電阻)
LED 陣列 1~5 負極 (短腳) GND 電源接地端

 

四、 實作實驗程式碼:聲音採樣與 LED 律動觸發

請將以下程式碼複製到 Arduino IDE 中並上傳至 ESP32 開發板:

1. 範例程式碼

程式:

// 定義 LED 陣列腳位
int led_1 =16; 
int led_2 =17;
int led_3 =5;
int led_4 =18;
int led_5 =19;
int microphone = 36; //LM386聲音感測器AO信號腳 連接到ESP32 GPIO36 

void setup()
{
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(led_3, OUTPUT);
  pinMode(led_4, OUTPUT);
  pinMode(led_5, OUTPUT);
  pinMode(microphone, INPUT);
  Serial.begin(9600);
}
void loop()
{
  int val=analogRead(microphone);  // 儲存聲音讀取值的變數
  Serial.println(val);
  if (val>1200){
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);
    digitalWrite(led_4, HIGH);
    digitalWrite(led_5, HIGH);
  }else if (val>900){
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);
    digitalWrite(led_4, LOW);
    digitalWrite(led_5, LOW);
  }else if (val>600){
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);
    digitalWrite(led_4, LOW);
    digitalWrite(led_5, LOW);
  }else if (val>300){
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, LOW);
    digitalWrite(led_4, LOW);
    digitalWrite(led_5, LOW);
  }else if (val>10){
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, LOW);
    digitalWrite(led_3, LOW);
    digitalWrite(led_4, LOW);
    digitalWrite(led_5, LOW);
  }else{
    digitalWrite(led_1, LOW);
    digitalWrite(led_2, LOW);
    digitalWrite(led_3, LOW);
    digitalWrite(led_4, LOW);
    digitalWrite(led_5, LOW);
  }
  delay(100);
}

 

2. 燒錄與操作測試

  1. 點擊 Arduino IDE 的 「上傳 (Upload)」 按鈕將程式碼上傳至 ESP32。

  2. 開啟 「序列埠監控視窗 (Serial Monitor)」(鮑率設為 9600)。

  3. 經由LM386聲音感測器感知類比值的變化進行調控LED的明暗。然後再播放個快節奏的舞曲,這時LED將會隨著音樂的韻律節奏進行閃爍變化。

 

五、 初學者常見卡關問題與排錯指南(Troubleshooting)

1. LED 一直常亮或完全不亮?

  • 閾值需要微調:每個環境的背景噪音大小不同,請先開啟序列埠監控視窗觀察平時的聲音數值,並將程式碼中的 1200 調整為比平時背景音高出約 300~500 的數值。

  • 調整電位器:用小螺絲起子旋轉 LM386 模組上的藍色可變電阻,微調麥克風靈敏度。

2. 為什麼拍手有反應,播放音樂時 LED 卻反應很慢?

  • 採樣延遲過長:請確認 loop() 尾端採樣延遲 delay() 不要設得太大(建議設定在 10~50 ms 之間),才能及時捕捉到音樂拍子的瞬態高音。

3. LED 燈未加限流電阻會怎樣?

  • 防止過流損壞:ESP32 的 GPIO 引腳承受電流有限,接 LED 時務必串接 220Ω 電阻,避免過大電流燒毀 ESP32 腳位或 LED 燈泡。

 

六、 結語與下一篇教學

恭喜你!成功掌握了使用 LM386 聲音感測器模組搭配 ESP32 實作聲控音樂節奏燈的技巧。這套機制能進一步擴充為更豐富的專題,例如依據音量高低依序點亮不同數量 LED 的「等化器音量條(VU Meter)」!

 

ESP32 教學系列|延伸閱讀與章節導覽

相關文章