LED: tính điện trở hạn dòng, nối nhiều LED và trộn màu LED RGB bằng ESP32
Cấu tạo LED, cách nhận biết chân, điện áp thuận theo màu, cách tính điện trở hạn dòng, nối nhiều LED nối tiếp và song song, LED RGB cathode chung, anode chung, trộn màu bằng PWM của ESP32.
LED (diode phát quang) có lẽ là linh kiện người mới dùng sớm nhất và cũng làm hỏng nhiều nhất, vì quên điện trở hạn dòng. LED là một diode nên dòng tăng vọt khi điện áp vượt ngưỡng; muốn LED sáng ổn định và bền phải giới hạn dòng. Bài viết giải thích cấu tạo LED, điện áp thuận theo màu, cách tính điện trở hạn dòng, cách nối nhiều LED đúng, giới hạn dòng của chân GPIO, LED RGB cathode chung và anode chung, rồi làm thí nghiệm trộn màu LED RGB bằng PWM của ESP32.
1. Cấu tạo LED

- LED là một tiếp giáp p-n làm từ vật liệu bán dẫn đặc biệt (GaAsP, InGaN…). Khi dòng chạy thuận, electron và lỗ trống gặp nhau ở tiếp giáp và giải phóng năng lượng dưới dạng ánh sáng. Màu ánh sáng do vật liệu quyết định; LED trắng thường là LED xanh dương phủ lớp bột huỳnh quang.
- Chip LED rất nhỏ (khoảng 0,3 mm), nằm trong cốc phản xạ trên khung chân cathode; một dây vàng mảnh nối chip với chân anode. Vỏ nhựa đúc làm thấu kính.
- Nhận biết chân: chân dài là anode (+); phía có mặt vát trên vành và khung kim loại lớn bên trong là cathode (−). Thử nhanh bằng thang diode của đồng hồ vạn năng: LED sáng mờ khi que đỏ ở anode.

2. Tính điện trở hạn dòng

Điện trở nối tiếp với LED nhận phần điện áp còn lại sau khi trừ điện áp thuận Uf của LED, nên theo định luật Ohm: R = (U − Uf) / I.
- Uf lấy theo datasheet, hoặc theo bảng điển hình: đỏ, vàng khoảng 2 V; xanh dương, trắng khoảng 3 V.
- Dòng I: LED 5 mm thông thường chịu tối đa khoảng 20 mA, nhưng 5–10 mA đã đủ sáng để làm đèn báo; LED hiện đại hiệu suất cao sáng rõ ngay ở 1–2 mA.
- Chọn giá trị điện trở E12 lớn hơn gần nhất với số tính được, để dòng không vượt mức dự kiến. Kiểm tra công suất điện trở: P = I² × R, thường chỉ vài chục mW.
- Không có điện trở, LED nối thẳng vào 5 V sẽ lấy dòng rất lớn (chỉ bị giới hạn bởi điện trở trong của nguồn và của dây), sáng chói rồi hỏng trong tích tắc.
Với nguồn 3,3 V của ESP32, LED xanh dương hay trắng (Uf khoảng 3 V) chỉ còn khoảng 0,3 V cho điện trở: dòng phụ thuộc nhiều vào Uf thật của từng con và LED có thể sáng mờ. Khi cần LED trắng sáng rõ, cấp từ 5 V qua transistor (bài 19).
3. Nối nhiều LED

- Nối tiếp: các LED cùng một dòng, Uf cộng lại. Nguồn phải lớn hơn tổng Uf: ba LED trắng (khoảng 9 V) dùng được với nguồn 12 V, không dùng được với 5 V. Ít tốn điện nhất vì chỉ một điện trở.
- Song song: mỗi LED (hoặc mỗi chuỗi nối tiếp) phải có điện trở riêng. Hai LED cùng loại vẫn có Uf lệch nhau vài chục mV; dùng chung một điện trở thì LED Uf thấp hơn nhận phần lớn dòng, sáng không đều và hỏng trước.
- Dải LED 12 V bán sẵn đã có điện trở trên dải (mỗi cụm 3 LED nối tiếp một điện trở); chỉ cần cấp đúng 12 V.
4. LED nối với chân GPIO và chỉnh độ sáng
- Chân GPIO của ESP32 nên chỉ cấp khoảng 10–20 mA mỗi chân và tổng các chân cũng có giới hạn. Một LED báo 5 mA cắm thẳng vào GPIO qua điện trở là ổn; nhiều LED hoặc LED công suất phải dùng transistor, MOSFET (bài 19, 20).
- Muốn chỉnh độ sáng, không đổi điện áp mà dùng PWM: bật tắt LED rất nhanh (vài kHz), độ rộng xung càng lớn LED càng sáng; mắt thấy độ sáng trung bình. ESP32 có bộ LEDC tạo PWM trên hầu hết các chân.
5. LED RGB

- LED RGB là ba LED đỏ, xanh lá, xanh dương chung một vỏ, có 4 chân. Chân dài nhất là chân chung: loại cathode chung nối chân chung xuống GND, loại anode chung nối chân chung lên nguồn.
- Mỗi màu cần một điện trở riêng; màu đỏ có Uf thấp hơn nên thường dùng điện trở lớn hơn hai màu còn lại để độ sáng cân hơn.
- Trộn ba màu với độ sáng khác nhau ra hầu hết các màu: đỏ + xanh lá = vàng, đỏ + xanh dương = tím, cả ba = trắng (gần đúng, vì mắt nhạy với ba màu không bằng nhau).
6. Thí nghiệm: trộn màu LED RGB bằng ESP32
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Một LED RGB 5 mm cathode chung (loại anode chung cũng được, sửa một hằng số trong chương trình), điện trở 150 Ω và hai điện trở 100 Ω.

Với dòng khoảng 5–9 mA mỗi màu ở 3,3 V, ba chân GPIO nằm trong mức an toàn. Thứ tự chân LED RGB phổ biến: R, chung (dài nhất), G, B; nếu màu không đúng thì hoán đổi dây theo màu quan sát được.
Chương trình
/*
PYWORLD.VN - Trộn màu LED RGB bằng PWM của ESP32: tự đổi qua 7 màu, hoặc gõ "r,g,b" (0-255) để chọn màu
LED RGB cathode chung: chân chung -> GND; R qua 150 Ω vào GPIO25, G qua 100 Ω vào GPIO26, B qua 100 Ω vào GPIO27
LED anode chung: chân chung -> 3V3 và đặt ANODE_CHUNG = true
*/
#define CHAN_R 25
#define CHAN_G 26
#define CHAN_B 27
const bool ANODE_CHUNG = false; // LED anode chung: mức thấp mới sáng nên phải đảo độ rộng xung
const uint32_t TAN_SO_PWM = 5000; // Hz, đủ cao để mắt không thấy nhấp nháy
const uint8_t DO_PHAN_GIAI = 8; // 8 bit: độ rộng xung từ 0 đến 255
struct Mau {
const char *ten;
uint8_t r, g, b;
};
// Bảng màu mẫu; xanh lá và xanh dương thường sáng hơn đỏ nên giá trị nhỏ hơn cho màu trộn cân
const Mau BANG_MAU[] = {
{"DO", 255, 0, 0}, {"CAM", 255, 60, 0}, {"VANG", 255, 150, 0}, {"LUC", 0, 255, 0},
{"LAM", 0, 0, 255}, {"TIM", 180, 0, 255}, {"TRANG", 255, 200, 170},
};
const int SO_MAU = sizeof(BANG_MAU) / sizeof(BANG_MAU[0]);
bool tuDoiMau = true;
int chiSo = 0;
uint32_t lanDoiCuoi = 0;
String dongNhan = "";
void datMau(uint8_t r, uint8_t g, uint8_t b) {
if (ANODE_CHUNG) {
r = 255 - r;
g = 255 - g;
b = 255 - b;
}
ledcWrite(CHAN_R, r);
ledcWrite(CHAN_G, g);
ledcWrite(CHAN_B, b);
}
// Xử lý một dòng lệnh: "r,g,b" chọn màu cố định, "c" quay lại tự đổi màu
void xuLyLenh(const String &lenh) {
int r, g, b;
if (lenh == "c") {
tuDoiMau = true;
Serial.println("Quay lai che do tu doi mau");
} else if (sscanf(lenh.c_str(), "%d,%d,%d", &r, &g, &b) == 3) {
tuDoiMau = false;
r = constrain(r, 0, 255);
g = constrain(g, 0, 255);
b = constrain(b, 0, 255);
datMau(r, g, b);
Serial.printf("Mau tu chon: R=%d G=%d B=%d\n", r, g, b);
} else {
Serial.println("Lenh khong hop le. Vi du: 255,80,0 hoac c");
}
}
void setup() {
Serial.begin(115200);
ledcAttach(CHAN_R, TAN_SO_PWM, DO_PHAN_GIAI);
ledcAttach(CHAN_G, TAN_SO_PWM, DO_PHAN_GIAI);
ledcAttach(CHAN_B, TAN_SO_PWM, DO_PHAN_GIAI);
datMau(0, 0, 0);
delay(300);
Serial.println("LED RGB: tu doi 7 mau. Go r,g,b (0-255) de chon mau, go c de tu doi lai");
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
if (dongNhan.length() > 0) {
xuLyLenh(dongNhan);
dongNhan = "";
}
} else {
dongNhan += c;
}
}
if (tuDoiMau && millis() - lanDoiCuoi > 1500) {
lanDoiCuoi = millis();
const Mau &m = BANG_MAU[chiSo];
datMau(m.r, m.g, m.b);
Serial.printf("Mau %-5s R=%3u G=%3u B=%3u\n", m.ten, m.r, m.g, m.b);
chiSo = (chiSo + 1) % SO_MAU;
}
}
ledcAttach(chân, 5000, 8)gắn một kênh PWM 5 kHz, độ phân giải 8 bit cho mỗi chân;ledcWrite(chân, 0…255)đặt độ rộng xung, tức độ sáng của màu đó.- Bảng
BANG_MAUchứa 7 màu mẫu; chương trình đổi màu mỗi 1,5 giây. Màu vàng, cam dùng ít xanh lá hơn đỏ vì xanh lá trông sáng hơn với mắt. - Gõ một dòng dạng
255,80,120vào Serial Monitor (chọn chế độ gửi kèm xuống dòng) để đặt màu tùy ý; gõcđể quay lại tự đổi màu. - LED anode chung: đặt
ANODE_CHUNG = true, chương trình đảo độ rộng xung vì chân GPIO ở mức thấp thì màu đó mới sáng.
Kết quả mong đợi

LED đổi màu theo bảng; nhìn qua một tờ giấy mỏng sẽ thấy màu trộn đều hơn vì ba chip nằm cách nhau một chút. Màu trắng có thể ngả xanh hoặc hồng tùy LED; chỉnh lại giá trị của màu TRANG trong bảng cho vừa mắt.
7. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| LED không sáng | Cắm ngược chân; LED RGB loại anode chung nhưng nối chân chung xuống GND | Đảo chiều LED; xác định loại LED bằng thang diode |
| Màu sai | Nhầm thứ tự chân màu | Hoán đổi dây theo màu quan sát được |
| Màu xanh dương rất mờ | Uf của LED xanh gần 3,3 V | Giảm điện trở màu xanh (tối thiểu khoảng 47 Ω) hoặc cấp 5 V qua transistor |
| Gõ lệnh không có phản ứng | Serial Monitor không gửi ký tự xuống dòng | Chọn "New Line" hoặc "Both NL & CR" ở ô cuối dòng |
8. Xem thêm
- PWM trên ESP32: điều chỉnh độ sáng LED.
- Đèn nhấp nháy và mã Morse với ESP32.
- Đèn trung thu nhấp nháy với ESP32 và pin 18650.
- Bài tiếp theo của loạt điện tử căn bản: diode zener, Schottky và cầu chỉnh lưu.
Xem thêm