本項目將在Arduino IDE環境下,利用ESP32產生的PWM信號控制多個LED。項目所需物料如下:
ESP32 DOIT DEVKIT V1板
3x 5mm LED
3x 330歐姆電阻器
面包板
跳線若干
ESP32帶一個包含16通道LED PWM控制器,可配置以產生不同特性的PWM信號。項目開始之前需要先安裝Arduino IDE,連接妥當后就可以把ESP32 DOIT DEVKIT V1板用作LED PWM控制器了。
使用Arduino IDE進行LED調光的步驟如下:
1. 從0 to 15選擇PWM channel。
2. 設置PWM頻率,LED頻率選擇5000Hz較好。
3. 選擇信號的占空比:,其分表率范圍1-16bits。本項目使用8bit,這樣可控制的LED亮度等級值為0-255。
4. 指定信號出現的GPIO or GPIOs:其函數為ledcAttachPin(GPIO, channel)。該函數具有兩個變量,第一個GPIO用來輸出信號,第二個表示產生信號的通道。
5. 使用PWM控制LED亮度,函數為ledcWrite(channel, dutycycle)。其中,第一個變量產生PWM信號,第一個變量是占空比。
一個LED調光控制
點亮一個LED并調光時,應將LED連接于GPIO 16引腳。
ESP32 DEVKIT V1模塊有30個GPIOs,只要能用作輸出,就可用作PWM引腳以連接LED。
請打開并拷入如下代碼:
const int ledPin = 16;
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
?ledcSetup(ledChannel, freq, resolution);
?
?ledcAttachPin(ledPin, ledChannel);}
void loop(){
?for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){ ??
? ?ledcWrite(ledChannel, dutyCycle);
? ?delay(15);
?}
?for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
? ?ledcWrite(ledChannel, dutyCycle); ??
? ?delay(15);
?}}
這些代碼的含義是,設定的PWM信號頻率為5000Hz,選擇通道 0 來產生信號,信號的分辨率為8bits。
當然,也可以設置為其他參數,獲得不同的PWM信號,例如:
const int freq = 5000;?
const int ledChannel = 0;?
const int resolution = 8;
接下來,選擇信號的GPIO引腳,函數為ledcAttachPin(ledPin, ledChannel); 增加LED亮度的占空比為0-255,
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
? ?ledcWrite(ledChannel, dutyCycle);
? ?delay(15);?
}
然后,從255-0自減,就降低了LED的亮度。
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
? ?ledcWrite(ledChannel, dutyCycle);
? ?delay(15);
}
調節LED亮度,須使用 ledcWrite() 函數。該函數有兩個參數:產生信號的通道、duty cycle。注意,這里的 ledcWrite() 函數中產生信號的變量是通道,而不是GPIO。
?把代碼上傳到 ESP32,確定板子和COM端口選擇正確,再對照下單路,就可以測試調光效果了。
多個LED調光控制
也可以從相同通道的不同GPIO取得同樣的信號,這需要將這些GPIOs連接到 setup() 的相同通道。以下我們對上述操作稍作改動,來通過相同通道的相同PWN信號對3個LED進行調光控制。
我們的目標是通過30 GPIOs的ESP32 DEVKIT V1模塊來控制三個LED。
首先,將下列代碼拷貝到Arduino IDE中。
// the number of the LED pin
const int ledPin = 16; ?
const int ledPin2 = 17;?
const int ledPin3 = 5; ?
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
?// configure LED PWM functionalitites
?ledcSetup(ledChannel, freq, resolution);
?
?// attach the channel to the GPIO to be controlled
?ledcAttachPin(ledPin, ledChannel);
?ledcAttachPin(ledPin2, ledChannel);
?ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
?// increase the LED brightness
?for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){ ??
? ?// changing the LED brightness with PWM
? ?ledcWrite(ledChannel, dutyCycle);
? ?delay(15);
?}
?// decrease the LED brightness
?for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
? ?// changing the LED brightness with PWM
? ?ledcWrite(ledChannel, dutyCycle); ??
? ?delay(15);
?}
}
這些代碼在前面基礎上有一些改動:為兩個新的LED增加了多個變量,具體參考 GPIO 17 和 GPIO 5。
const int ledPin2 = 17; // 17 corresponds to GPIO17?
const int ledPin3 = 5; ?// 5 corresponds to GPIO5
然后,在 setup() 中,添加如下兩行代碼,將這兩個 GPIOs 指派給通道0。這表示,在兩個GPIO的通道0上產生了相同個信號。
ledcAttachPin(ledPin2, ledChannel);?
ledcAttachPin(ledPin3, ledChannel);
把修改后的代碼上傳到 ESP32,確定板子和COM端口選擇正確后,就可以測試者三個LED調光效果了。
?由于所有GPIOs 輸出了相同PWM信號,所有三個LED亮度的增加與減少是同時進行的,這樣就產生了一個非常美妙的同步效果。
本項目演示了如何在Arduino IDE環境下,使用ESP32的LED PWM控制器進行調光控制。通過設置正確的信號屬性,這種方法可用來控制其他PWM輸出,如馬達、LED 呼吸燈等。
審核編輯:湯梓紅
評論
查看更多