Menu
CoddyTech

millis()를 이용한 신호등

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

각 delay(3000) 동안 보드는 다른 작업을 하지 않으므로, 다음 단계에서 추가할 횡단보도 버튼을 감지할 수 없습니다. 타이밍 처리는 millis()로 옮깁니다.

신호등은 상태 머신입니다. 항상 하나의 상태(초록, 노랑 또는 빨강)에 있으며, 해당 상태가 충분히 오래 지속되면 다음 상태로 이동합니다. enum으로 상태에 이름을 붙이고, 변수 하나에는 현재 상태를 저장하며, 다른 변수 하나에는 상태가 시작된 시각을 저장합니다.

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

첫 번째 상태는 초록이므로 setup()에서 초록불을 켭니다. loop()가 실행될 때마다 switch가 현재 상태가 충분히 오래 지속되었는지 확인하고, 그때만 다음 상태로 이동해 신호등을 바꿉니다.

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

아무것도 기다리지 않으므로 loop()는 다른 작업을 할 수 있습니다. 상태 표시등으로 이를 확인해 보세요. 보드에 내장된 LED인 13번 핀을 500ms마다 깜박이게 합니다.

challenge icon

챌린지

중급

delay() 없이 타이밍을 다시 작성하세요:

  • 초록불은 3000 ms, 노란불은 1000 ms, 빨간불은 3000 ms 동안 유지하세요
  • 세 상태에 enum을 사용하고, switch와 millis()를 사용하세요
  • setup()에서 초록불을 켜고, 상태가 바뀔 때만 showLight()를 호출하세요
  • 항상 500 ms마다 13번 핀을 깜박이세요(500 ms 켜짐, 500 ms 꺼짐)

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

직접 해보기

// 자동차 신호등
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// 신호등 하나를 켜고 나머지 두 개는 끕니다.
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);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
quiz icon실력 점검

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

프로젝트의 모든 레슨

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