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를 사용해 스스로 시간을 잽니다. 이런 방식으로 스케치를 작성하는 것을 상태 머신이라고 합니다.
챌린지
중급기계에는 세 가지 상태가 있습니다. 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로 돌아가기
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
delay 없이 타이밍 제어하기의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드