Skip to content

Chớp tắt bóng LED

Chớp tắt bóng LED

Kiến thức

LED là chữ viết tắt của Light Emitting Diodes, nó là bóng bán dẫn có thể phát sáng với màu sắc khác nhau tùy thuộc vào chất liệu bán dẫn. Để điều khiển được bóng LED cần cung cấp mức điện áp chênh lệch giữa cực âm và cực dương của bóng LED cao hơn mức điện áp Vf (datasheet), thường là 3.2VDC, và dòng điện nhỏ hơn mức chịu đựng của nó, thường là 15mA.

Chúng ta có thể hiểu rõ hơn cách hoạt động của LED tại đường dẫn www.youtube.com/watch?v=BH9LI973H8w

led symbol
Hình 1. Ký hiệu LED trên mạch điện. (Anode +, Cathode -)

Mạch có thể chạy được như sau:

led
Hình 2. Hình ảnh 1 mạch điện đơn giản của LED
Điện trở giúp hạn chế dòng điện qua LED, để nó ở trạng thái hoạt động bình thường.

Đấu nối

Kết nối LED với board Arduino Uno tại chân số 13 thông qua một điện trở 330Ω.

led pin
Hình 3. Hình ảnh kết nối LED với board Arduino Uno

Sử dụng cable USB type B để cấp nguồn và nạp chương trình cho board Arduino Uno. Mở phần mềm Arduino IDE để tạo sketch và viết source code.

Có 2 phương pháp để điều khiển chớp, tắt LED được giới thiệu ở mục này đó là dùng hàm delay() hoặc dùng định thời với hàm millis().

Mã nguồn chớp tắt dùng Delay

Cách hoạt động chương trình được giải thích trong source code.

#define pinLed  13 // Định nghĩa pinLed là chân số 13.

void setup()      // Hàm setup() được gọi 1 lần duy nhất khi bật nguồn hoặc reset board
{
  pinMode(pinLed, OUTPUT);    // Cấu hình chân pinLed  là ngõ ra.
}

void loop() { // Hàm loop() sẽ được gọi liên tục khi chương trình hoạt động.

  digitalWrite(pinLed, HIGH); // Bật Led (HIGH - có nghĩa là mức điện áp 5VDC)
  delay(1000);                // Chờ 1000 mili giây  = 1s
  digitalWrite(pinLed, LOW);  // Tắt Led (LOW có nghĩa là mức điện áp 0VDC)
  delay(1000);                // Chờ 1000 mili giây  = 1s
}

Mã nguồn chớp tắt dùng định thời

Khi thực hiện chương trình có sử dụng hàm delay(), vi điều khiển phải chờ cho đến khi hết thời gian delay mới thực hiện các tác vụ khác, thời gian delay nhỏ thì không sao, tuy nhiên nếu giá trị này lớn sẽ làm ảnh hưởng đến các tác vụ khác khi chạy cùng thời điểm, làm tăng độ trễ khi thực thi chương trình hoặc làm cho chương trình chạy không chính xác, việc dùng định thời với hàm millis() sẽ khắc phục tình trạng này.

#define pinLed  13     // Định nghĩa pinLed là chân số 13.

int ledState = LOW;   // khai báo biến lưu trạng thái của LED
unsigned long previousMillis = 0;
const long interval = 1000;

void setup()
{
  pinMode(pinLed, OUTPUT);
}

void loop()
{
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW)
      ledState = HIGH;  // Đổi trạng thái
    else
      ledState = LOW;   // Đổi trạng thái
    digitalWrite(pinLed, ledState);
  }
}

Giải thích code

  • Biến ledState nhằm lưu trữ trạng thái của LED tại thời điểm hiện tại.

  • Biến interval là giá trị của 1 bước thời gian tính theo ms.

  • Lúc đầu giá trị previousMillis = 0; hàm millis() đã bắt đầu hoạt động và đếm thời gian, nó trả về số mili giây từ khi board được cấp nguồn hoặc reset board.

  • Lệnh currentMillis = millis() sẽ gán giá trị của biến curentMillis bằng với giá trị hiện tại của hàm millis() trả về. Nếu thời gian hiện tại - thời gian bắt đầu > interval, chương trình sẽ thực hiện 2 việc:

  • previousMillis = curentMillis nhằm reset giá trị đếm, để bắt đầu tính lại thời gian (chú ý rằng millis() vẫn tiếp tục chạy và biến curentMillis vẫn đang được gán giá trị của hàm millis()).

  • Đổi trạng thái của LED (nếu đang mức LOW thì chuyển sang HIGH).

Việc bật tắt LED chỉ thực hiện khi currentMillis – previousMillis >= interval, trong khoảng thời gian khác thì ta có thể thực thi các tác vụ khác của chương trình.
Chúng ta có thể tìm hiểu chi tiết về hàm millis() tại đường dẫn garretlab.web.fc2.com/en/arduino/inside/arduino/wiring.c/millis.html

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *