Bài 6. Ngõ vào Digital
Trong bài này, bạn sẽ học cách sử dụng nút nhấn với ngõ vào digital để bật và tắt LED. Cách thức hoạt động của chương trình như sau: Khi bạn nhấn vào 1 nút nhấn, đèn LED bật; nhấn vào nút nhấn khác, đèn LED tắt.
Linh kiện cần thiết
Để thực hành bài tập này, chúng ta cần sử dụng một số linh kiện như sau
STT | Tên linh kiện | SL | Hình ảnh |
1 | LED 5mm | 1 | |
2 | Điện trở 270 Ω | 1 | |
3 | Nút nhấn | 2 | |
4 | Breadboard | 1 | ![]() |
5 | Arduino UNO | 1 | ![]() |
6 | Dây nối dạng cắm | ![]() |
Sơ đồ cắm chân
Nút nhấn có dạng đối xứng, tuy nhiên do cấu trúc của nó nên khi cắm lên breadboard, phải cắm đúng cách thì nút nhấn mới hoạt động được. Và cũng cần phải chú ý rằng, chân âm (chân ngắn hơn) của LED hướng về phía bên phải.
Code Arduino
Nạp sketch sau đây vào board Arduino. Nhấn nút A để bật LED sáng, nhấn nút B để tắt đèn LED.
/* Bài 6 – Ngõ vào Digital */ int ledPin = 5; int buttonApin = 9; int buttonBpin = 8; byte leds = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonApin, INPUT_PULLUP); pinMode(buttonBpin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonApin) == LOW) { digitalWrite(ledPin, HIGH); } if (digitalRead(buttonBpin) == LOW) { digitalWrite(ledPin, LOW); } }
Phần đầu tiên của sketch định kiến ba biến cho ba chân Arduino mà ta sẽ sử dụng. Biến ‘ledPin’ là chân ngõ ra và ‘buttonApin’ là nút nhấn phía trên, ‘buttonBpin’ là nút nhấn phía dưới.
Hàm ‘setup’ sẽ quy định ledPin là OUTPUT, và vì có hai ngõ vào nên ta sẽ đặt pinMode cho nó là ‘INPUT_PULLUP’ như sau:
pinMode(buttonApin, INPUT_PULLUP); pinMode(buttonBpin, INPUT_PULLUP);
Chế độ INPUT_PULLUP nghĩa là chân được đặt làm ngõ vào tín hiệu, tuy nhiên nếu không có sự kiện gì xảy ra, chân đó sẽ được ‘kéo lên’ mức điện áp cao. Nói cách khác, giá trị mặc định của ngõ vào là mức HIGH (mức điện áp cao), và sẽ được kéo xuống mức điện áp LOW (mức thấp) nếu nhấn nút. Đó là lý do tại sao nút nhấn phải được nối vào chân GND. Khi nhấn nút, chân ngõ vào sẽ được nối đến GND, do đó nó không còn mức HIGH mà trả về mức LOW. Chúng ta sẽ ‘bắt’ sự kiện này trong hàm ‘loop’.
void loop() { if (digitalRead(buttonApin) == LOW) { digitalWrite(ledPin, HIGH); } if (digitalRead(buttonBpin) == LOW) { digitalWrite(ledPin, LOW); } }
Trong hàm ‘loop có hai phát biểu ‘if’. Mỗi phát biểu dùng cho một nút nhấn, và sử dụng hàm ‘digitalRead’ với mỗi nút nhấn tương ứng.
Lưu ý rằng, nếu một nút nhấn nào đó bị tác động, ngõ vào tương ứng sẽ là LOW. Do đó, nếu nút nhấn A là LOW, hàm ‘digitalWrite’ sẽ đặt chân ledPin lên mức cao (LED sáng). Tương tự, khi nút nhân B bị tác động, mức LOW sẽ được đưa ra ledPin.
Nút nhấn
Nút nhấn là một linh kiện đơn giản. Khi bạn nhấn nút, hai tiếp điểm sẽ tiếp xúc với nhau do đó, dòng điện có thể chạy qua chúng.
Nút nhấn sử dụng trong bài này có 4 tiếp điểm, có thể sẽ gây ra một số nhầm lẫn nhỏ. Thật sự, chúng chỉ có hai tiếp điểm vì bên trong nó, chân B và C được nối với nhau, tương tự với chân A và D.
Chúng ta có thể làm gì thêm?
Có nhiều thứ để thử với linh kiện này. Đầu tiên, hãy thử ôn lại những gì chúng ta đã học ở bài 5, bằng cách thêm vào một số lệnh để gửi các thông điệp đến Serial Monitor khi mà một nút nhấn nào đó bị tác động.
Hãy nhớ rằng việc hiển thị các thông điệp sẽ sử dụng đoạn lệnh như sau trong hàm ‘loop’
Serial.println("Button A Pressed");
Bạn cũng cần phải khởi động giao tiếp serial trong hàm ‘setup’ bằng những dòng lệnh sau:
while (! Serial); // Wait untilSerial is ready - Leonardo Serial.begin(9600);
Một ví dụ thứ hai bạn có thể làm với nút nhấn là: Khi nhấn nút A, đèn LED sáng, và tự tắt sau 30 giây.
Trả lời