Arduino - 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ế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
Top comments (0)