Menu
CoddyTech

보행 신호와 부저

Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 4번째.

보행자에게는 전용 신호등이 있습니다. 7번 핀의 빨간불(대기)과 6번 핀의 초록불(보행)입니다. 자동차 신호가 빨간불일 때 보행자에게는 초록불이 켜지고, 나머지 시간에는 빨간불이 켜집니다.

보행 신호는 두 순간에만 바뀝니다. 자동차 신호가 빨간불로 바뀔 때와 빨간불에서 벗어날 때입니다. 보행 신호등을 제어하는 함수를 작성하고 이 두 곳에서 호출하세요.

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

또한 건널목에서는 안전하게 건널 수 있는 동안, 신호등을 볼 수 없는 사람들을 위해 소리도 울립니다. tone()은 세 번째 숫자를 받을 수 있는데, 이는 소리를 재생할 시간입니다. tone(buzzerPin, 1000, 100)은 1000 Hz 소리를 100 ms 동안 재생한 다음 자동으로 멈춥니다. 스케치는 이 소리가 끝날 때까지 기다리지 않습니다.

빨간불일 때만 500 ms마다 소리를 울리려면, case RED: 안에 세 번째 millis() 타이머를 넣으세요.

challenge icon

챌린지

중급

보행 신호와 부저를 추가하세요:

  • 보행자용 빨간불은 핀 7, 초록불은 핀 6에 연결하고, 둘 다 출력으로 설정합니다
  • 차량 신호가 빨간색일 때: 보행자용 초록불을 켜고 빨간불을 끄며, 핀 8에서 1000 Hz의 100 ms 부저음을 500 ms마다 울립니다
  • 나머지 시간에는 보행자용 빨간불을 켜고 초록불을 끄며, 소리는 내지 않습니다

Run을 누른 다음 Check를 누르세요.

직접 해보기

// 차량용 신호등
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// 보드 자체의 LED: 컨트롤러의 상태 표시등
const int statusPin = 13;
// 횡단 버튼
const int buttonPin = 2;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // 현재 신호등이 켜진 시점

bool statusOn = false;
unsigned long lastBlink = 0;

// 신호등 하나를 켜고 나머지 두 개는 끕니다.
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:
      // 횡단 버튼을 누르면 녹색 신호가 일찍 끝납니다.
      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;
  }

  // 상태 표시등은 차량용 신호등의 동작과 관계없이 500 ms마다 깜박입니다.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

프로젝트의 모든 레슨

직접 연습해 보세요: Arduino 플레이그라운드