Menu
CoddyTech

횡단 버튼

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

보행자는 도로를 건너기 위해 신호를 요청할 방법이 필요합니다. 2번 핀의 파란색 버튼은 횡단 버튼입니다. 초록불이 켜져 있을 때 버튼을 누르면 초록불이 즉시 끝나고, 자동차 신호가 노란불로 바뀐 다음 빨간불이 켜집니다.

신호등은 millis()를 사용해 작동하므로, loop()는 초록불 상태를 초당 수천 번 지나가며 시계와 함께 버튼도 매번 확인할 수 있습니다. 다음 두 조건 중 하나라도 참이면 초록불이 끝납니다. 이것이 ||(또는)가 의미하는 것입니다.

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // 노란색으로 변경
  }
  break;

버튼은 2번 핀을 접지에 연결하므로 핀을 INPUT_PULLUP으로 설정합니다. 버튼이 핀을 LOW로 끌어내리기 전까지는 HIGH를 읽습니다.

초록불 상태에서만 버튼을 읽습니다. 노란불과 빨간불일 때는 자동차가 이미 멈추고 있으며, 노란불은 운전자가 멈출 시간을 확보할 수 있도록 1초를 온전히 유지합니다.

challenge icon

챌린지

중급

2번 핀에 횡단보도 버튼을 추가하세요:

  • 2번 핀을 INPUT_PULLUP으로 설정하세요
  • 불빛이 초록색일 때 버튼을 누르면 초록불이 즉시 끝납니다(불빛이 노란색으로 바뀝니다)
  • 버튼을 눌렀는지 여부와 관계없이 노란불과 빨간불은 정해진 시간을 유지합니다

Run을 누르고 초록불이 켜질 때까지 기다린 다음, 파란색 버튼을 누르고 Check를 누르세요.

직접 해보기

// 자동차 신호등
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// 보드 자체의 LED: 컨트롤러의 상태 표시등
const int statusPin = 13;

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);
  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;
  }

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

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

프로젝트의 모든 레슨

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