Nút qua đường
Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 3 trên 24.
Người đi bộ cần một cách để xin sang đường. Nút màu xanh dương ở chân 2 là nút sang đường: nhấn nút khi đèn xanh đang bật sẽ kết thúc đèn xanh ngay lập tức, để xe chuyển sang đèn vàng rồi đèn đỏ.
Vì đèn chạy dựa trên millis(), loop() đi qua trạng thái đèn xanh hàng nghìn lần mỗi giây và có thể đọc nút mỗi lần, cũng như đọc đồng hồ. Đèn xanh kết thúc khi một trong hai điều kiện đúng, đó là ý nghĩa của || (hoặc):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// chuyển sang màu vàng
}
break;Nút nối chân 2 với đất, vì vậy hãy đặt chân này thành INPUT_PULLUP: chân sẽ đọc HIGH cho đến khi nút kéo nó xuống LOW.
Chỉ trạng thái đèn xanh mới đọc nút. Khi đèn vàng và đèn đỏ bật, xe đã bắt đầu dừng, còn đèn vàng vẫn sáng đủ một giây để người lái có thời gian dừng lại.
Thử thách
Trung bìnhThêm nút băng qua đường vào chân 2:
- đặt chân 2 thành
INPUT_PULLUP - khi đèn xanh, nhấn nút sẽ kết thúc đèn xanh ngay lập tức (đèn chuyển sang màu vàng)
- đèn vàng và đỏ vẫn giữ nguyên thời gian, dù có nhấn nút hay không
Nhấn Chạy, chờ đèn xanh, nhấn nút màu xanh dương, rồi nhấn Kiểm tra.
Tự làm thử
// Các đèn tín hiệu cho xe
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Đèn LED trên bo mạch: đèn báo trạng thái của bộ điều khiển
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // thời điểm đèn hiện tại bật sáng
bool statusOn = false;
unsigned long lastBlink = 0;
// Bật một đèn và tắt hai đèn còn lại.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// Đèn báo trạng thái nhấp nháy mỗi 500 ms, bất kể các đèn tín hiệu cho xe đang làm gì.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Dự án
Tự luyện tập: Playground Arduino