Hướng dẫn ESP32 34/55 - Gradient màu với đèn LED RGB và núm xoay | Bộ học IoT ESP32 của SunFounder
Trong hướng dẫn này, chúng ta sẽ tạo hiệu ứng chuyển màu gradient bằng đèn LED RGB điều chỉnh dựa trên vị trí của chiết áp (núm xoay). Dự án sử dụng vi điều khiển ESP32, cung cấp khả năng Wi-Fi và Bluetooth tích hợp, khiến nó trở thành lựa chọn linh hoạt cho các dự án IoT. Bằng cách xoay chiết áp, chúng ta có thể chuyển đổi mượt mà giữa các màu sắc khác nhau, thể hiện cả chức năng của đèn LED RGB và khả năng đọc giá trị analog từ chiết áp.

Dự án này lý tưởng để tìm hiểu về PWM (Điều chế độ rộng xung) và cách điều khiển các thiết bị analog bằng vi điều khiển. Trong suốt hướng dẫn này, chúng ta sẽ thảo luận về các linh kiện phần cứng cần thiết, hướng dẫn đấu dây và cung cấp các đoạn mã để giúp bạn triển khai dự án. Để có phần giải thích trực quan hơn, hãy xem video liên quan (trong video ở phút 02:15).
Giải thích phần cứng
Các linh kiện chính được sử dụng trong dự án này bao gồm vi điều khiển ESP32, đèn LED RGB và chiết áp. ESP32 là một vi điều khiển mạnh mẽ có thể xử lý nhiều tác vụ khác nhau, bao gồm cả truyền thông không dây, khiến nó phù hợp cho các ứng dụng IoT. Đèn LED RGB bao gồm ba đèn LED riêng lẻ (đỏ, xanh lá và xanh dương) có thể được trộn để tạo ra nhiều màu sắc. Chiết áp hoạt động như một điện trở có thể điều chỉnh, cung cấp điện áp đầu ra thay đổi dựa trên vị trí của nó.
Đèn LED RGB có thể được kết nối theo hai cấu hình: cực dương chung hoặc cực âm chung. Trong dự án này, chúng ta sẽ sử dụng cấu hình cực dương chung, trong đó tất cả các cực dương được nối với nhau vào điện áp dương, cho phép chúng ta điều khiển độ sáng của từng đèn LED riêng lẻ bằng PWM. Chiết áp sẽ được kết nối với một đầu vào analog trên ESP32 để đọc vị trí của nó và điều chỉnh các giá trị RGB tương ứng.
Chi tiết datasheet
| Nhà sản xuất | SunFounder |
|---|---|
| Số bộ phận | Đèn LED RGB |
| Điện áp logic/IO | 3,3 V |
| Điện áp nguồn | 5 V |
| Dòng điện đầu ra (mỗi kênh) | 20 mA |
| Dòng điện đỉnh (mỗi kênh) | 30 mA |
| Hướng dẫn tần số PWM | 5 kHz |
| Ngưỡng logic đầu vào | 0,3 V (thấp) / 2,7 V (cao) |
| Sụt áp / RDS(on) / bão hòa | 1,8 V (điển hình) |
| Giới hạn nhiệt | Nhiệt độ hoạt động: -40°C đến +85°C |
| Kiểu đóng gói | Xuyên lỗ |
| Ghi chú / biến thể | Cấu hình cực dương chung |
- Sử dụng điện trở 220 Ohm cho mỗi kênh LED để giới hạn dòng điện.
- Đảm bảo điện áp nguồn cung cấp phù hợp (5V) cho đèn LED RGB.
- Kết nối cực dương chung với nguồn điện áp dương.
- Sử dụng PWM để điều khiển độ sáng của từng màu LED.
- Cẩn thận với kết nối của chiết áp để tránh đầu vào trôi nổi.
- Xác minh rằng ESP32 được cấp nguồn chính xác trước khi tải mã lên.
Hướng dẫn đấu dây
Để đấu dây đèn LED RGB và chiết áp với ESP32, hãy bắt đầu bằng cách kết nối chân cực dương chung của đèn LED RGB với chân nguồn 3.3V trên ESP32. Các chân đỏ, xanh lá và xanh dương của đèn LED RGB sẽ được kết nối tương ứng với các chân 27, 26 và 25. Đảm bảo đặt một điện trở 220 Ohm nối tiếp với mỗi chân màu LED để giới hạn dòng điện và bảo vệ đèn LED.
Tiếp theo, kết nối chiết áp với ESP32 bằng cách nối chân bên trái với chân nguồn 3.3V, chân bên phải với đất và chân giữa với chân 14 trên ESP32. Cấu hình này cho phép ESP32 đọc điện áp analog từ chiết áp, điện áp này sẽ được sử dụng để điều chỉnh màu của đèn LED RGB dựa trên vị trí của nó.
Ví dụ mã & hướng dẫn chi tiết
Trong hàm setup, chúng ta định nghĩa các chân cho đèn LED RGB và chiết áp, cũng như khởi tạo các cài đặt PWM. Đoạn mã sau đây cho thấy cách chúng ta thiết lập các chân đèn LED RGB:
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);
}
Trong đoạn mã này, chúng ta định nghĩa các chân cho đèn LED đỏ, xanh lá và xanh dương, và gắn chúng vào các kênh PWM với tần số và độ phân giải đã xác định.
Hàm loop đọc giá trị của chiết áp và chuyển đổi nó thành giá trị hue, sau đó được sử dụng để xác định các giá trị RGB. Đoạn trích sau đây minh họa quá trình này:
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);
}Đoạn mã này đọc giá trị analog từ chiết áp, chuẩn hóa nó và tính toán màu sắc (hue) tương ứng. Sau đó, nó gọi hàm HUEtoRGB để chuyển đổi màu sắc thành các giá trị RGB, được truyền vào hàm setColor để cập nhật đèn LED.
Trình diễn / Điều gì sẽ xảy ra
Sau khi hoàn tất việc nối dây và tải mã lên, bạn sẽ có thể xoay chiết áp để thay đổi màu sắc của đèn LED RGB một cách mượt mà. Khi bạn xoay núm, đèn LED sẽ chuyển qua nhiều màu sắc khác nhau dựa trên giá trị màu sắc được tính từ vị trí núm. Nếu đèn LED không sáng hoặc hoạt động bất thường, hãy kiểm tra lại việc nối dây và đảm bảo rằng chiết áp được kết nối đúng cách (trong video tại 10:45).
Mốc thời gian trong video
- 00:00 Bắt đầu
- 2:11 Giới thiệu về dự án
- 4:31 Đèn LED RGB
- 8:18 Màu RGB
- 12:18 Giải thích cách nối dây
- 17:59 Giải thích mã Arduino
- 24:12 Chọn bo mạch ESP32 và cổng COM trong Arduino IDE
- 25:54 Trình diễn
// 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
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 34/55- SunFounder doc page for Color Gradientdocs.sunfounder.com
Tập tin📁
Không có tệp nào khả dụng.