Menu
CoddyTech

신호등 상태 머신

Coddy Arduino 여정의 delay 없이 타이밍 제어하기 섹션에 포함된 레슨. 18개 중 10번째.

신호등은 상태 머신입니다. 항상 한 가지 상태(초록색, 노란색 또는 빨간색)에 있으며, 각 상태는 정해진 시간 동안 지속되고, 다음에 어떤 상태로 넘어갈지 알고 있습니다.

  • GREEN: 초록불 켜짐; 2초 후 YELLOW로 이동
  • YELLOW: 노란불 켜짐; 1초 후 RED로 이동
  • RED: 빨간불 켜짐; 2초 후 GREEN으로 이동

각 줄은 하나의 case가 됩니다.

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

delay(2000)를 사용해도 신호등은 작동하지만, 다른 작업은 실행할 수 없습니다. millis()를 사용하면 loop()를 한 번 실행하는 데 마이크로초밖에 걸리지 않으므로 보드는 다른 작업을 할 시간이 생깁니다. 여기서는 컨트롤러가 작동 중임을 보여 주기 위해 내내 깜박이는 상태 LED가 그 작업입니다.

challenge icon

챌린지

중급

핀 13의 상태 LED는 이미 깜박이고 있으며, enum과 lightStart도 준비되어 있습니다. 신호등을 각 불빛마다 하나의 case가 있는 switch (light)로 작성하세요:

  • 초록불 2 s, 노란불 1 s, 빨간불 2 s, 그리고 다시 초록불
  • setLights()를 사용해 한 번에 LED 하나씩 켜기
  • delay()를 사용하지 않아 상태 LED가 계속 깜박이도록 하기

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

직접 해보기

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // 보드 자체의 LED

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

unsigned long statusPrevious = 0;
int statusState = LOW;

void setup() {
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(statusLed, OUTPUT);
}

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

void loop() {
  unsigned long now = millis();

  // 컨트롤러가 작동 중임을 보여 주기 위해 상태 LED가 250 ms마다 켜졌다 꺼진다
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // 신호등: 각 신호에 하나의 case가 있는 switch (light)
  // 초록색 2 s, 노란색 1 s, 빨간색 2 s, 그다음 다시 초록색
}
quiz icon실력 점검

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

delay 없이 타이밍 제어하기의 모든 레슨

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