Đèn trung thu nhấp nháy với ESP32 và pin 18650: dự án STEM cho học sinh
Làm đèn ông sao trung thu với ESP32, 3 LED và mô đun pin 18650: 4 hiệu ứng chạy vòng, thở, lung linh, chạm cán đổi hiệu ứng, PWM, cách làm vỏ đèn và an toàn với pin.
Mùa Trung thu là dịp tuyệt vời cho một dự án STEM: tự làm chiếc đèn ông sao biết nhấp nháy, "thở" và lung linh như ngọn nến, đổi hiệu ứng chỉ bằng một cái chạm tay vào cán đèn. Bài viết hướng dẫn làm đèn trung thu với ESP32, 3 đèn LED và mô đun pin 18650. Đèn LED gần như không tỏa nhiệt nên an toàn hơn nhiều so với thắp nến trong đèn giấy.
Qua dự án, học sinh học được cách điều khiển độ sáng bằng PWM, cách dùng hàm cos để làm hiệu ứng mượt, số ngẫu nhiên để giả lập ánh nến, và cách cấp nguồn bằng pin cho một thiết bị di động.
1. Chuẩn bị
- Một mạch ESP32 DevKit V1 và dây USB nạp code.
- Một mô đun pin Lithium-ion 18650 có mạch sạc, bảo vệ và ngõ ra 5 V, cùng một viên pin 18650 có mạch bảo vệ.
- Dây cắm test board, có thể thêm breadboard để thử trước khi lắp vào đèn.
- 3 đèn LED 5 mm (đỏ, vàng, xanh lá) và 3 điện trở 220 Ω.
- Vật liệu làm đèn: que tre hoặc bìa cứng, giấy bóng kính màu, keo dán, một hộp nhỏ đựng mạch.
2. Nối dây

- LED: đỏ ở D25, vàng ở D26, xanh lá ở D27. Mỗi LED nối tiếp một điện trở 220 Ω, chân dài về phía chân ESP32, chân ngắn về GND.
- Nút chạm: một dây ở D4, đầu kia dán vào miếng giấy bạc quấn quanh cán đèn.
- Nguồn: ngõ ra 5 V của mô đun pin nối chân VIN, ngõ GND nối chân GND của ESP32. Mạch ổn áp trên ESP32 hạ 5 V xuống 3,3 V cho chip.
- Khi cắm cáp USB để nạp chương trình, tháo dây VIN ra khỏi mô đun pin để hai nguồn không nối chung.
3. Chương trình 4 hiệu ứng
// PYWORLD.VN - ESP32 DevKit V1: đèn trung thu 3 LED với 4 hiệu ứng, chạy bằng pin 18650
// LED đỏ D25, vàng D26, xanh lá D27 (mỗi LED nối tiếp điện trở 220 ohm xuống GND)
// Chạm dây ở D4 để đổi hiệu ứng: chạy vòng, thở, lung linh, tắt
const int SO_LED = 3;
const int CHAN_LED[SO_LED] = {25, 26, 27};
const int CHAN_CHAM = 4;
const char* TEN_HIEU_UNG[] = {"Chay vong", "Tho", "Lung linh", "Tat"};
const int SO_HIEU_UNG = 4;
int hieuUng = 0;
uint32_t giaTriNen = 1;
bool dangCham = false;
void sang(int led, int doSang) { // doSang: 0..255
ledcWrite(CHAN_LED[led], doSang);
}
bool vuaCham() {
uint32_t v = touchRead(CHAN_CHAM);
float lech = ((float)v - (float)giaTriNen) / giaTriNen;
if (lech < 0) lech = -lech;
bool cham = lech > 0.30;
bool moi = cham && !dangCham;
dangCham = cham;
return moi;
}
void chayVong(unsigned long t) { // mỗi LED sáng 300 ms, lần lượt
int dangSang = (t / 300) % SO_LED;
for (int i = 0; i < SO_LED; i++) sang(i, i == dangSang ? 255 : 0);
}
void tho(unsigned long t) { // sáng dần rồi tối dần trong 3 giây, ba LED lệch pha nhau
for (int i = 0; i < SO_LED; i++) {
float goc = 2 * PI * ((t + i * 1000) % 3000) / 3000.0;
sang(i, (int)(127.5 * (1 - cos(goc))));
}
}
void lungLinh() { // như ngọn nến: độ sáng đổi ngẫu nhiên quanh mức cao
for (int i = 0; i < SO_LED; i++) sang(i, random(120, 256));
}
void setup() {
Serial.begin(115200);
setCpuFrequencyMhz(80); // giảm tốc độ chip để tiết kiệm pin
for (int i = 0; i < SO_LED; i++) ledcAttach(CHAN_LED[i], 5000, 8);
delay(500);
uint32_t tong = 0;
for (int i = 0; i < 30; i++) { // lúc khởi động không chạm dây D4
tong += touchRead(CHAN_CHAM);
delay(2);
}
giaTriNen = tong / 30;
if (giaTriNen == 0) giaTriNen = 1;
Serial.println("Den trung thu: cham day D4 de doi hieu ung");
}
void loop() {
if (vuaCham()) {
hieuUng = (hieuUng + 1) % SO_HIEU_UNG;
Serial.printf("Hieu ung: %s\n", TEN_HIEU_UNG[hieuUng]);
}
unsigned long t = millis();
if (hieuUng == 0) chayVong(t);
else if (hieuUng == 1) tho(t);
else if (hieuUng == 2) lungLinh();
else for (int i = 0; i < SO_LED; i++) sang(i, 0);
delay(hieuUng == 2 ? 80 : 20);
}
Nạp chương trình, mở Serial Monitor (115200 baud). Mỗi lần chạm vào dây D4, đèn đổi sang hiệu ứng tiếp theo: chạy vòng, thở, lung linh, tắt, rồi lại chạy vòng. Lúc cấp điện, đừng chạm vào dây D4 để chương trình đo đúng giá trị nền.
4. Ba hiệu ứng hoạt động thế nào?

- PWM điều khiển độ sáng:
ledcWrite(chân, độ sáng)bật tắt LED 5.000 lần mỗi giây; độ sáng 0–255 là tỉ lệ thời gian bật. Mắt người không thấy nhấp nháy mà chỉ thấy đèn sáng mạnh hay yếu. - Chạy vòng:
(t / 300) % 3cho biết LED nào đang tới lượt: cứ 300 ms đổi một lần, lặp lại 0, 1, 2. - Thở:
127.5 × (1 − cos(góc))đi mượt từ 0 lên 255 rồi về 0 trong 3 giây. Ba LED lệch nhau 1 giây nên ánh sáng "lượn" quanh đèn. Đây là dịp tốt để học sinh lớn thấy hàm lượng giác dùng vào việc thật. - Lung linh: cứ 80 ms, mỗi LED nhận một độ sáng ngẫu nhiên từ 120 đến 255, giống ngọn nến bị gió thổi nhẹ.
- Tiết kiệm pin:
setCpuFrequencyMhz(80)giảm tốc độ chip từ 240 xuống 80 MHz; hiệu ứng ánh sáng không cần chạy nhanh hơn thế.
Đèn sáng được bao lâu? Ước tính với pin 2.000–3.000 mAh, mạch tiêu thụ khoảng 40–60 mA, mạch tăng áp hiệu suất khoảng 85 %: đèn sáng khoảng 20–45 giờ. Đây là số ước tính, cho trẻ tự đo bằng cách ghi giờ bật và giờ đèn tắt.
5. Làm vỏ đèn ông sao

- Làm khung ngôi sao 5 cánh bằng que tre hoặc cắt từ bìa cứng.
- Dán giấy bóng kính màu hoặc giấy pơ-luya lên khung. Giấy mỏng, sáng màu giúp ánh LED lan đều.
- Đặt mạch ESP32, LED và mô đun pin vào một hộp nhỏ ở giữa đèn. Hướng LED ra các cánh sao.
- Đưa dây cảm ứng ra ngoài, quấn giấy bạc ở cán cầm: cầm vào cán là có thể đổi hiệu ứng.
- Thử từng hiệu ứng trong phòng tối, chỉnh vị trí LED cho đẹp.
6. An toàn với pin 18650
- Pin 18650 có dung lượng lớn: nếu chập hai cực, pin nóng rất nhanh và có thể cháy. Luôn để pin nằm chắc trong mô đun, lắp đúng cực.
- Người lớn sạc pin; không để đèn giấy đang sạc mà không có người trông.
- Không thắp nến chung với mạch điện trong đèn giấy.
- Che kín mạch, không mang đèn ra mưa.
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ý |
|---|---|---|
| Một LED không sáng | Cắm ngược chiều LED | Xoay ngược LED: chân dài về phía chân ESP32 |
| Chạy bằng USB được, chạy bằng pin thì không | Nối 5 V vào chân 3V3 thay vì VIN; pin hết | Nối đúng chân VIN; sạc pin, xem đèn báo của mô đun |
| Hiệu ứng tự đổi liên tục | Lúc cấp điện đang chạm dây D4 | Bỏ tay ra, bấm nút EN để khởi động lại |
| Chạm cán không đổi hiệu ứng | Giấy bạc không tiếp xúc tốt với dây | Kẹp chặt đầu dây vào giấy bạc, hoặc chạm thẳng vào đầu dây |
8. Gợi ý cho phụ huynh và giáo viên
- Kết hợp truyền thống và công nghệ: kể cho trẻ nghe về đèn ông sao, đèn kéo quân ngày xưa, rồi so sánh với chiếc đèn "biết lập trình".
- Chia việc: học sinh nhỏ làm vỏ đèn và trang trí; học sinh lớn nối mạch và sửa chương trình (thêm hiệu ứng mới, đổi tốc độ chạy vòng).
- Thử thách: thêm hiệu ứng thứ năm, ví dụ ba LED cùng nháy theo nhịp trống; hoặc thêm LED cho từng cánh sao.
- Thời lượng: 2–3 buổi 45 phút: nối mạch và chạy chương trình; làm vỏ đèn; lắp ráp và trình diễn trong đêm Trung thu ở lớp.
Xem thêm