Menu
CoddyTech

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:.

challenge icon

Thử thách

Trung bình

Thê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);
    }
  }
}
quiz iconTự kiểm tra

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