ESP32, IOT物聯網

【ESP32教學】第八篇:PWM呼吸燈原理與LED燈光亮度調控實作

一、 實驗說明:什麼是 PWM 脈衝寬度調變?

在先前的教學中,我們學過數位輸出只有 HIGH(3.3V 全亮)和 LOW(0V 全滅)兩種狀態。但如果我們想讓 LED 燈維持在「半亮」的狀態,或是讓燈光像呼吸一樣滑順地由暗變亮、再由亮變暗,該怎麼做呢?

這時候就需要用到 PWM(Pulse Width Modulation,脈衝寬度調變) 技術!

PWM 是一種利用高頻率切換開關,來「模擬類比輸出」的技術。它透過極快的速度切換高低電位,藉由調整高電位在一個週期內所佔的時間比例(稱為佔空比 Duty Cycle),來改變輸出給元件的平均電壓。本實驗我們將利用 ESP32 的 PWM 功能,使用大家最熟悉的 analogWrite() 函式來實作最經典的 LED 呼吸燈 專案!

 

二、 實驗材料準備清單

本篇實作呼吸燈專案所需的硬體元件如下:

  • ESP32 開發板

  • 麵包板 (Breadboard)

  •  LED 發光二極體

  • 220Ω 或 330Ω 電阻

  • 杜邦跳線

  • USB 傳輸線

🛒 一次備齊創客工具! 歡迎直接購買米羅科技的 ESP32 物聯網應用學習套件,免去東奔西跑湊零件的煩惱。內含電阻、LED 燈及各類核心感測器,是學校課堂教學與個人專案開發的最佳首選!

 

三、 核心知識:用 analogWrite() 輕鬆搞定 PWM 亮度

 1. 搞懂佔空比(Duty Cycle)與數值範圍

在使用 analogWrite(pin, value) 調控亮度時,value 代表 PWM 的數值:

  • 預設範圍為 0 ~ 255(8-bit 解析度,共 256 個等級)。

  • 數值 0:代表佔空比 0%(LED 完全熄滅)。

  • 數值 127:代表佔空比 50%(LED 呈現柔和的半亮狀態)。

  • 數值 255:代表佔空比 100%(LED 全亮)。

PWM(Pulse Width Modulation) 波形圖

PWM 佔空比越長,輸出功率就越高。現在我們了解了這種關係,我們可以使用 PWM 來控制 LED 的亮度或直流馬達的速度等。

 

2. 腳位選擇極具彈性

與傳統 Arduino 固定只有幾個特定腳位支援 PWM 不同,ESP32 幾乎所有的通用 GPIO 腳位都可以直接套用 analogWrite() 輸出 PWM

 

四、 實作實驗程式碼:analogWrite() 呼吸燈調控

1.安裝 ESP32 AnalogWrite 程式庫

  • 在 Arduino 整合環境功能表點選 草稿碼 / 匯入程式庫 / 管理程式庫。
  • 在右上方搜尋框輸入「ESP32 AnalogWrite」,下方會列出所有符合條件的程式庫,不同程式庫使用的程式碼並不相同。此處點   選「ESP32 AnalogWrite」,該項目右下角會出現「安裝」鈕,按「安裝」鈕開始安裝。

2.請將以下程式碼複製到 Arduino IDE 中並上傳:

▼注意:假如使用下列程式碼發生編譯錯誤,則表示您目前安裝的ESP32函式庫較為新版,請務必將「#include <analogWrite.h>」這一行移除並重新編譯,則可編譯成功並正常運行。

程式:

#include <analogWrite.h>  
int ledpin=15; //ESP32 GPIO15

void setup() {
  pinMode(ledpin,OUTPUT);
}

void loop() {
  for (int i = 0; i < 255; i++) { //LED 從滅到亮
    analogWrite(ledpin,i); 
    delay(10); 
  } 
  for (int i = 255; i > -1; i--) { //LED 從亮到滅
    analogWrite(ledpin,i);
    delay(10);
  }
}

 

3. 燒錄與操作測試

  1. 點擊 Arduino IDE 的 [上傳 (Upload)] 按鈕。

  2. 上傳完畢後,觀察麵包板上的 LED 燈,你會發現它開始像呼吸一般,非常滑順地進行「由暗轉亮、再由亮轉暗」的循環,代表你的 analogWrite() 燈光亮度調控實驗成功了!

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

  • Q:程式上傳成功,但 LED 還是一閃一閃的,沒有滑順漸變的感覺?

    • 延時調整:請檢查 for 迴圈中的 delay(5);。如果這個延時設定得太長(例如寫成 500ms),漸變過程就會變成明顯的階梯式閃爍;如果設定太短,呼吸速度則會快到肉眼難以察覺。

  • Q:為什麼可以在 ESP32 上直接使用 analogWrite()?

    • ESP32 在較新版的 Arduino 函式庫中,官方已經將 analogWrite() 自動封裝並對接到內部的 LEDC 硬體模組,因此我們不需要像以前一樣寫繁瑣的通道設定,直接用最經典的 analogWrite() 即可!

 

六、 結語與下一篇教學

恭喜你!學會了用 analogWrite() 模擬類比輸出並調控燈光亮度,這意味著你已經解鎖了更進階的硬體控制能力。相同的原理,只要把 LED 燈換成直流馬達擴大晶片,就能控制馬達轉速;或是換成 RGB 三色燈,就能調配出上萬種色彩!下一篇教學,我們將帶大家認識更多精彩的物聯網專題實作!

👉 上一篇回顧【ESP32教學】第七篇:類比輸入(ADC)與光線感測器控制光感小夜燈實作

👉 下一篇預告【ESP32教學】第九篇:LCD 1602 I2C顯示模組接線與文字顯示實作 

 

 

 

 

 

相關文章