Menu
CoddyTech

enum으로 상태에 이름 붙이기

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

0, 1, 2로 번호를 매긴 모드도 작동하지만, if (mode == 2)만으로는 2가 무엇을 의미하는지 알 수 없습니다. enum을 사용하면 각 숫자에 이름을 붙일 수 있습니다:

enum State { READY, RUNNING, DONE };
State state = READY;

첫 번째 줄은 유일한 값으로 READY, RUNNING, DONE을 갖는 새 형식인 State를 만듭니다. 내부적으로는 여전히 0, 1, 2이지만, 이름을 통해 각각의 의미를 알 수 있습니다. 두 번째 줄은 해당 형식의 변수를 만듭니다.

enum과 switch는 서로 잘 맞습니다. 상태마다 case를 하나씩 두면 됩니다.

switch (state) {
  case READY:
    // READY가 하는 일과 다음 상태로 전환되는 시점
    break;
  case RUNNING:
    // ...
    break;
}

새 상태로 이동하려면 state를 설정하고 시작된 시점을 기억합니다: state = DONE; stateStart = millis();. 그러면 각 상태가 millis() - stateStart를 사용해 스스로 시간을 잽니다. 이런 방식으로 스케치를 작성하는 것을 상태 머신이라고 합니다.

challenge icon

챌린지

중급

기계에는 세 가지 상태가 있습니다. READY 상태는 이미 작성되어 있습니다. 초록색 LED가 켜지고 버튼을 누르면 기계가 시작됩니다. 나머지 두 가지 경우를 추가하세요:

  • RUNNING: 노란색 LED가 켜집니다. 2000 ms 후에 LED를 끄고 DONE으로 이동합니다.
  • DONE: 빨간색 LED가 켜집니다. 1000 ms 후에 LED를 끄고 READY로 돌아갑니다.

상태가 변경될 때마다 stateStart를 저장하세요. Run을 누르고, 버튼을 누른 다음 Check를 누르세요.

직접 해보기

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // 현재 상태가 시작된 시점

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

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

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // case RUNNING 추가: 노란색 LED를 켜고, 2000 ms 후 끈 다음 DONE으로 전환

    // case DONE 추가: 빨간색 LED를 켜고, 1000 ms 후 끈 다음 READY로 돌아가기
  }
}
quiz icon실력 점검

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

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

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