Tìm kiếm mã

Bài 98-4: Làm mờ đèn LED bằng Arduino: Điều khiển độ sáng

Bài 98-4: Làm mờ đèn LED bằng Arduino: Điều khiển độ sáng

Đèn LED có mặt ở khắp mọi nơi — đèn báo, màn hình hiển thị, đèn trang trí — nhưng hầu hết người mới bắt đầu chỉ dừng lại ở việc bật và tắt chúng. Dự án này sẽ tiến thêm một bước: làm đèn LED mờ dần và sáng dần một cách mượt mà bằng khả năng PWM (Điều chế độ rộng xung) tích hợp sẵn của Arduino. Thay vì nhấp nháy đột ngột, bạn sẽ có sự tăng giảm độ sáng dần dần, mô phỏng hiệu ứng mờ dần tự nhiên, hiệu ứng "thở", và khả năng điều khiển tựa tương tự từ một chân kỹ thuật số thuần túy. Đây là một trong những dự án đầu tiên thú vị nhất vì bạn có thể thấy kết quả ngay lập tức, và kỹ thuật tương tự cũng là nền tảng cho việc điều khiển tốc độ động cơ, âm lượng âm thanh và độ sáng đèn nền trong các sản phẩm thực tế.

LED-5mm-green

Khi đã hiểu về cách làm mờ đèn, bạn có thể áp dụng nó vào nhiều ứng dụng thực tế:

  • Tạo đèn báo trạng thái "thở" trên thiết bị, phát sáng nhẹ nhàng thay vì nhấp nháy gây mất tập trung
  • Tự động giảm độ sáng đèn ngủ LED dựa trên ánh sáng môi trường hoặc thời gian trong ngày
  • Điều khiển độ sáng đèn nền trên màn hình LCD hoặc OLED
  • Tạo đèn tạo không khí hoặc đèn trang trí với các chuyển đổi mượt mà giữa các mức độ sáng
  • Mô phỏng đồng hồ báo thức mặt trời mọc chậm, sáng dần để đánh thức bạn một cách tự nhiên
  • Thêm điều khiển tốc độ cho động cơ DC nhỏ hoặc quạt (nguyên lý PWM tương tự cũng được áp dụng)

Hướng dẫn này là một phần của Khóa học Arduino từng bước Robojax, và cụ thể là Dự án 4 trong 10: Làm mờ đèn LED bằng Arduino. Chương trình đầy đủ có sẵn để tải xuống bên dưới bài viết.

Phần cứng và linh kiện

330_ohm_resistor
Điện trở 330 ohm 0.25 watt

Danh sách linh kiện cho dự án này rất tối giản — nếu bạn đã từng làm việc với Arduino trước đây, có thể bạn đã có sẵn mọi thứ cần thiết:

  • 1× Bo mạch Arduino (Uno, Nano, Mega hoặc bất kỳ bo mạch tương thích nào)
  • 1× Đèn LED (5mm hoặc 3mm, bất kỳ màu nào)
  • 1× Điện trở (200Ω đến 1000Ω — khoảng 300Ω đến 1kΩ là phù hợp)
  • Bo mạch thử nghiệm (breadboard) và dây nối DuPont
  • Cáp USB để lập trình và cấp nguồn

Một lưu ý quan trọng về đèn LED: chân dài hơn là cực dương (anode), và chân ngắn hơn — hoặc bên có cạnh phẳng trên vỏ nhựa — là cực âm (cathode). Nếu lắp ngược, đèn LED sẽ không sáng, vì vậy hãy kiểm tra kỹ trước khi cấp nguồn.

Về giá trị điện trở, video giải thích phép tính tại (trong video ở phút 03:49): một đèn LED thông thường giảm khoảng 2V và cần khoảng 10mA dòng điện. Với nguồn 5V, 3V còn lại phải giảm qua điện trở, cho ra R = V/I = 3V / 0.01A = 300Ω. Trong thực tế, bất kỳ giá trị nào từ 300Ω đến 1000Ω đều hoạt động được — giá trị cao hơn chỉ làm đèn LED mờ hơn. Đối với việc làm mờ đèn, điều này thực sự không sao, vì bạn đang thay đổi độ sáng anyway.

Hướng dẫn đấu dây

Arduino schematic for two LEDs see saw
Sơ đồ Arduino cho hai đèn LED bập bênh
Arduino wiring for two LEDs see saw
Đấu dây Arduino cho hai đèn LED bập bênh

Việc đấu dây đơn giản nhất có thể. Cực dương của đèn LED kết nối qua điện trở đến một chân hỗ trợ PWM trên Arduino — trong dự án này là chân 3. Cực âm kết nối với chân GND.

Tại sao lại là chân 3? Bởi vì không phải tất cả các chân Arduino đều hỗ trợ PWM. Trên hầu hết các bo mạch Arduino, các chân hỗ trợ PWM được đánh dấu bằng ký hiệu dấu ngã (~) — thường là các chân 3, 5, 6, 9, 10 và 11 trên Uno. Nếu bạn sử dụng chân không hỗ trợ PWM, analogWrite() sẽ không tạo ra đầu ra biến đổi; đèn LED sẽ chỉ bật hoặc tắt.

Kết nối mạch như sau:

  1. Cắm đèn LED vào breadboard, chú ý chân nào là cực dương (dài hơn) và chân nào là cực âm (ngắn hơn/bên phẳng).
  2. Kết nối cực dương của đèn LED với chân 3 của Arduino thông qua điện trở.
  3. Kết nối cực âm của đèn LED với chân GND của Arduino.
  4. Cắm Arduino vào máy tính qua USB.

Giải thích mã nguồn

Sketch cho dự án này dựa trên ví dụ "Fade" cổ điển của Arduino, với một vài điều chỉnh. Thay vì giải thích từng dòng, hãy tập trung vào những phần bạn sẽ muốn điều chỉnh cho các thí nghiệm của riêng mình.

Các biến người dùng có thể cấu hình

Ở đầu mã nguồn, ba biến kiểm soát toàn bộ hành vi:

int led = 3;           // chân PWM mà đèn LED được kết nối
int brightness = 0;    // độ sáng của đèn LED
int fadeAmount = 3;    // số điểm để làm mờ đèn LED
  • led — Biến này xác định chân mà đèn LED được kết nối. Mặc định là chân 3, nhưng bạn có thể đổi sang bất kỳ chân nào hỗ trợ PWM (được đánh dấu bằng dấu ~ trên bo mạch của bạn). Nếu bạn chuyển đèn LED sang chân khác, hãy cập nhật giá trị này cho phù hợp.
  • brightness — Đây là mức độ sáng hiện tại, từ 0 (tắt) đến 255 (độ sáng tối đa). Mã bắt đầu ở 0, nhưng bạn có thể bắt đầu ở bất kỳ giá trị nào trong khoảng đó.
  • fadeAmount — Đây là biến thú vị nhất để thử nghiệm. Nó điều khiển số bước độ sáng được thực hiện mỗi chu kỳ. Một giá trị nhỏ như 3 tạo ra hiệu ứng mờ dần chậm rãi, từ từ. Một giá trị lớn hơn như 20 làm đèn LED mờ đi và sáng lên rất nhanh. Video minh họa điều này tại (trong video tại 22:37) — thay đổi từ 5 thành 20 làm hiệu ứng nhanh hơn đáng kể.

Cách hiệu ứng mờ dần hoạt động

Phần cốt lõi của hiệu ứng mờ dần nằm ở hai dòng bên trong loop():

analogWrite(led, brightness);
brightness = brightness + fadeAmount;

Mỗi lần lặp qua vòng lặp, giá trị độ sáng hiện tại được ghi ra đèn LED bằng analogWrite(), sau đó độ sáng được tăng thêm fadeAmount. Hàm analogWrite() sử dụng PWM để mô phỏng điện áp analog — nó bật và tắt chân rất nhanh, và tỷ lệ giữa thời gian bật và thời gian tắt quyết định độ sáng cảm nhận được.

Khi độ sáng đạt đến 0 hoặc 255, mã sẽ đảo chiều bằng cách đổi dấu của fadeAmount:

if (brightness <= 0 || brightness >= 255) {
  fadeAmount = -fadeAmount;
}

Đây là điều làm cho đèn LED sáng dần lên, rồi mờ dần đi, rồi lại sáng lên — một chu kỳ "thở" liên tục. Lệnh delay(30) ở cuối vòng lặp điều khiển tốc độ tổng thể của hiệu ứng. Độ trễ ngắn hơn làm hiệu ứng mờ dần nhanh hơn; độ trễ dài hơn làm chậm lại.

Thử nghiệm với các giá trị

Hai biến cho bạn khả năng kiểm soát hiệu ứng hình ảnh nhiều nhất:

  • Tăng fadeAmount để hiệu ứng mờ dần nhanh hơn, rõ rệt hơn. Hãy thử 10 hoặc 20.
  • Giảm fadeAmount để có hiệu ứng "thở" chậm rãi, nhẹ nhàng. Hãy thử 1 hoặc 2.
  • Điều chỉnh giá trị delay() để thay đổi nhịp độ. Độ trễ nhỏ hơn làm toàn bộ chu kỳ nhanh hơn; độ trễ lớn hơn kéo dài nó ra.

Kết hợp fadeAmount nhỏ với độ trễ ngắn tạo ra hiệu ứng mờ dần cực kỳ mượt mà, gần như tự nhiên — rất phù hợp cho đèn chiếu sáng tạo không gian. fadeAmount lớn với độ trễ ngắn tạo ra hiệu ứng nhấp nháy nhanh.

Trình diễn dự án trực tiếp

Sau khi tải mã lên, bạn sẽ thấy đèn LED sáng dần từ tắt đến độ sáng tối đa, rồi mờ trở lại, lặp lại vô hạn. Video cho thấy hành vi mặc định tại (trong video tại 22:25) — hiệu ứng mờ dần mượt mà ở tốc độ vừa phải.

Khi fadeAmount được đổi thành 20, đèn LED mờ đi và sáng lên rất nhanh — gần như nhấp nháy. Khi đặt thành 3, hiệu ứng mờ dần mất nhiều thời gian hơn rõ rệt, tạo ra sự chuyển đổi nhẹ nhàng, từ từ. Điều này được minh họa rõ ràng trong video tại (trong video tại 23:02).

Điểm hay của dự án này là bạn có thể thấy ngay hiệu ứng của những thay đổi trong mã — không cần thay đổi dây nối, chỉ cần sửa các biến và tải lên lại. Vòng phản hồi nhanh này khiến nó trở thành cách tuyệt vời để xây dựng trực giác về cách PWM và thời gian tương tác với nhau.

Nếu bạn muốn phát triển thêm bằng cách kích hoạt hiệu ứng mờ dần bằng nút nhấn thay vì để nó chạy liên tục, điều đó được đề cập trong một hướng dẫn riêng — xem phần dự án liên quan bên dưới.

Các dự án liên quan từ video này

Các chương

  • [00:00] Tổng quan về 10 dự án đèn LED Arduino
  • [01:22] Giới thiệu khóa học và các linh kiện cần thiết
  • [02:29] Tìm hiểu về đèn LED: ký hiệu, cực tính và các loại
  • [03:49] Tính giá trị điện trở cho đèn LED bằng định luật Ohm
  • [05:53] Dự án 1: Bật và tắt đèn LED
  • [12:43] Dự án 2: Điều khiển đèn LED bằng nút nhấn
  • [17:13] Dự án 3: Bật/tắt đèn LED toggle bằng nút nhấn
  • [20:12] Dự án 4: Làm mờ đèn LED — hướng dẫn mã
  • [22:25] Trình diễn hiệu ứng mờ dần và điều chỉnh tốc độ mờ
  • [23:20] Dự án 5: Làm mờ đèn LED bằng kích hoạt nút nhấn
  • [27:32] Dự án 6: Hiệu ứng đèn LED bập bênh
  • [30:47] Dự án 7: Đèn chạy với 5 đèn LED
  • [36:41] Dự án 8: Đèn chạy điều khiển bằng nút nhấn
  • [42:25] Dự án 9: Đồng hồ đo mức điện áp LED với biến trở
  • [49:25] Dự án 10: Đèn giao thông Arduino

Hình ảnh

Arduino wiring for LED  with resistor
Arduino wiring for LED with resistor
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for two LEDs see saw
Arduino wiring for two LEDs see saw
Arduino schematic for two LEDs see saw
Arduino schematic for two LEDs see saw
LED-5mm-green
LED-5mm-green
330_ohm_resistor
330_ohm_resistor
936-Lessson 98-LED-4: Arduino code to fade the LED light
Ngôn ngữ: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

Tập tin📁

Thư viện Arduino (tệp nén)

Hướng dẫn Sử dụng