신호등 상태 머신
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가 그 작업입니다.
챌린지
중급핀 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, 그다음 다시 초록색
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
delay 없이 타이밍 제어하기의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드