Tín hiệu đi bộ và còi báo
Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 4 trên 24.
Người đi bộ có đèn riêng: đèn đỏ ở chân 7 (chờ) và đèn xanh ở chân 6 (đi). Khi đèn xe màu đỏ, người đi bộ thấy đèn xanh; thời gian còn lại, họ thấy đèn đỏ.
Tín hiệu đi bộ chỉ thay đổi ở hai thời điểm: khi đèn xe chuyển sang đỏ và khi đèn xe chuyển khỏi màu đỏ. Viết một hàm để điều khiển đèn đi bộ rồi gọi hàm ở hai chỗ đó:
void showWalk(bool walk) {
if (walk) {
digitalWrite(walkRedPin, LOW);
digitalWrite(walkGreenPin, HIGH);
} else {
digitalWrite(walkGreenPin, LOW);
digitalWrite(walkRedPin, HIGH);
}
}Các chỗ sang đường cũng phát tiếng bíp khi có thể sang đường an toàn, dành cho những người không nhìn thấy đèn. tone() có thể nhận số thứ ba để chỉ thời lượng phát: tone(buzzerPin, 1000, 100) phát âm thanh 1000 Hz trong 100 ms rồi tự dừng. Bản phác thảo không chờ âm thanh phát xong.
Để phát tiếng bíp cứ mỗi 500 ms chỉ trong lúc đèn đỏ, hãy đặt bộ hẹn giờ millis() thứ ba bên trong case RED:.
Thử thách
Trung bìnhThêm tín hiệu dành cho người đi bộ và còi báo:
- đèn đỏ dành cho người đi bộ nối với chân 7 và đèn xanh dành cho người đi bộ nối với chân 6, cả hai đều là đầu ra
- khi đèn dành cho xe đang đỏ: bật đèn xanh dành cho người đi bộ, tắt đèn đỏ dành cho người đi bộ và phát tiếng bíp 100 ms ở tần số 1000 Hz tại chân 8 mỗi 500 ms
- trong thời gian còn lại: bật đèn đỏ dành cho người đi bộ, tắt đèn xanh dành cho người đi bộ, không phát âm thanh
Nhấn Run, rồi nhấn Check.
Tự làm thử
// Đè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;
// Nút bấm qua đường
const int buttonPin = 2;
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);
pinMode(buttonPin, INPUT_PULLUP);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
// Nhấn nút qua đường sẽ khiến đèn xanh kết thúc sớm.
if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
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 hoạt động ra sao.
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
1Đèn giao thông
Chu kỳ đèn giao thôngĐèn giao thông dùng millis()Nút qua đườngTín hiệu đi bộ và còi báoTự luyện tập: Playground Arduino