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
Mạch có thể chạy được như sau:
Đ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Ω.
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ếuthờ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 |