ESP32 教學 34/55 - 用 RGB LED 同旋鈕整顏色漸變 | SunFounder 嘅 ESP32 IoT 學習套件
喺呢個教學入面,我哋會用一粒RGB LED整一個顏色漸變效果,效果會根據可變電阻(旋鈕)嘅位置而調整。呢個項目用咗ESP32微控制器,佢內置Wi-Fi同藍牙功能,令到佢成為物聯網項目嘅一個多用途選擇。透過轉動可變電阻,我哋可以平滑噉喺唔同顏色之間過渡,同時展示RGB LED嘅功能同埋讀取可變電阻模擬值嘅能力。

呢個項目好啱用嚟學習PWM(脈衝寬度調製)同埋點樣用微控制器控制模擬裝置。成個教學入面,我哋會討論需要嘅硬件零件、接線指示,同埋提供程式碼片段幫你實現呢個項目。如果想睇更視覺化嘅解釋,記得睇吓相關嘅影片(影片喺02:15嘅位置)。
硬件解釋
呢個項目用到嘅主要零件包括ESP32微控制器、一粒RGB LED同一個可變電阻。ESP32係一粒好強大嘅微控制器,可以處理各種任務,包括無線通訊,令到佢好適合用喺物聯網應用。RGB LED由三粒獨立嘅LED(紅、綠、藍)組成,可以混合出好多唔同顏色。可變電阻就係一個可調節嘅電阻,會根據佢嘅位置提供一個可變嘅電壓輸出。
RGB LED可以用兩種方式連接:共陽極或者共陰極。喺呢個項目入面,我哋會用共陽極配置,即係將所有陽極一齊連去正電壓,等我哋可以用PWM獨立控制每粒LED嘅亮度。可變電阻會連去ESP32嘅一個模擬輸入,用嚟讀取佢嘅位置,再相應噉調整RGB數值。
數據表詳細資料
| 製造商 | SunFounder |
|---|---|
| 零件編號 | RGB LED |
| 邏輯/IO電壓 | 3.3 V |
| 供電電壓 | 5 V |
| 輸出電流(每通道) | 20 mA |
| 峰值電流(每通道) | 30 mA |
| PWM頻率指引 | 5 kHz |
| 輸入邏輯閾值 | 0.3 V(低)/ 2.7 V(高) |
| 電壓降 / RDS(on) / 飽和 | 1.8 V(典型值) |
| 熱限制 | 工作溫度:-40°C 至 +85°C |
| 封裝 | 通孔 |
| 備註 / 變體 | 共陽極配置 |
- 每個LED通道用一個220歐姆電阻嚟限制電流。
- 確保RGB LED嘅供電電壓正確(5V)。
- 將共陽極連去正電壓供應。
- 用PWM控制每粒LED顏色嘅亮度。
- 小心可變電阻嘅連接,避免浮動輸入。
- 上載程式碼之前,確認ESP32已經正確供電。
接線指示
要將RGB LED同可變電阻接去ESP32,首先將RGB LED嘅共陽極引腳連去ESP32嘅3.3V電源引腳。RGB LED嘅紅、綠、藍引腳會分別連去引腳27、26同25。記得喺每粒LED顏色引腳度串聯一個220歐姆電阻嚟限制電流同保護LED。
跟住,將可變電阻接去ESP32,方法係將左邊引腳連去3.3V電源引腳,右邊引腳連去接地,中間引腳連去ESP32嘅14。呢個配置令到ESP32可以讀取可變電阻嘅模擬電壓,用嚟根據佢嘅位置調整RGB LED嘅顏色。
程式碼示例同講解
喺setup函數入面,我哋定義RGB LED同可變電阻嘅引腳,同時初始化PWM設定。以下程式碼片段顯示咗我哋點樣設定RGB LED引腳:
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
void setup() {
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}
喺呢個片段入面,我哋定義紅、綠、藍LED嘅引腳,並將佢哋連去有指定頻率同解析度嘅PWM通道。
loop函數會讀取可變電阻嘅數值,然後將佢轉換成色相值,再用嚟決定RGB數值。以下摘錄展示咗呢個過程:
void loop() {
int knobValue = analogRead(KNOB_PIN);
float hueValue = (float)knobValue / 4095.0;
int hue = (int)(hueValue * 360);
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
setColor(red, green, blue);
}呢段代碼讀取電位器嘅模擬值,將佢標準化,然後計算對應嘅色相。之後佢會呼叫HUEtoRGB函數將色相轉換成RGB值,再將呢啲值傳俾setColor函數去更新LED。
示範/預期效果
完成接線同埋上載代碼之後,你應該可以擰個電位器嚟平滑噉改變RGB LED嘅顏色。當你轉動個旋鈕,LED會根據由旋鈕位置計算出嚟嘅色相值,喺唔同顏色之間過渡。如果LED冇著或者行為異常,檢查吓接線,確保電位器正確連接(喺影片10:45位置)。
影片時間戳
- 00:00 開始
- 2:11 項目介紹
- 4:31 RGB LED
- 8:18 RGB顏色
- 12:18 接線講解
- 17:59 Arduino代碼講解
- 24:12 喺Arduino IDE度選擇ESP32開發板同COM埠
- 25:54 示範
// Define RGB LED pins
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
// Define PWM frequency and resolution
const int freq = 5000;
const int resolution = 8;
// Define the pin for the knob
#define KNOB_PIN 14
void setup() {
Serial.begin(115200);
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}
void loop() {
// Read the value of the knob
int knobValue = analogRead(KNOB_PIN);
Serial.println(knobValue);
// Normalize the knob value to the range 0-1
float hueValue = (float)knobValue / 4095.0;
// Convert the normalized value to a HUE value (0-360)
int hue = (int)(hueValue * 360);
// Convert the HUE value to RGB values
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
// Update the RGB LED with the new color values
setColor(red, green, blue);
}
void setColor(int red, int green, int blue) {
ledcWrite(redPin, red);
ledcWrite(greenPin, green);
ledcWrite(bluePin, blue);
}
// Convert a HUE value to RGB values
void HUEtoRGB(int hue, int* red, int* green, int* blue) {
float h = (float)hue / 60.0;
float c = 1.0;
float x = c * (1.0 - fabs(fmod(h, 2.0) - 1.0));
float r, g, b;
if (h < 1.0) {
r = c;
g = x;
b = 0;
} else if (h < 2.0) {
r = x;
g = c;
b = 0;
} else if (h < 3.0) {
r = 0;
g = c;
b = x;
} else if (h < 4.0) {
r = 0;
g = x;
b = c;
} else if (h < 5.0) {
r = x;
g = 0;
b = c;
} else {
r = c;
g = 0;
b = x;
}
float m = 1.0 - c;
*red = (int)((r + m) * 255);
*green = (int)((g + m) * 255);
*blue = (int)((b + m) * 255);
}
Common Course Links
Common Course Files
資源與參考資料
-
文件记录ESP32 Tutorial 34/55 - SunFounder doc page for color gradientdocs.sunfounder.com
文件📁
冇文件可用。