버튼으로 모드 순환하기
Coddy Arduino 여정의 delay 없이 타이밍 제어하기 섹션에 포함된 레슨. 18개 중 11번째.
많은 기기에는 모드를 순환하는 버튼이 하나 있습니다. 자전거 라이트는 꺼짐, 켜짐, 깜박임, 빠르게 깜박임을 거쳐 다시 꺼집니다. 이것은 시계가 아니라 버튼을 눌렀을 때 다음 상태로 이동하는 상태 머신입니다.
단계를 별도의 함수에 넣으세요. 현재 모드에 대한 switch가 다음 모드를 설정하고, 마지막 모드에서는 처음으로 돌아갑니다.
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... 이런 식으로 계속해서 FAST가 다시 OFF로 돌아갈 때까지
}
}스케치는 버튼을 누를 때마다 nextMode()를 한 번 호출합니다. 입력 섹션에서 배운 방식으로 버튼의 디바운싱을 처리하세요. 판독값이 바뀌면 그에 따라 동작한 다음, 접점이 안정될 때까지 20 ms 기다립니다. mode를 사용하는 두 번째 switch가 LED를 설정합니다.
챌린지
중급버튼과 LED 코드는 이미 작성되어 있습니다. 버튼을 누를 때마다 다음 모드로 이동하고 모드 이름을 출력하도록 nextMode()를 작성하세요: OFF, ON, BLINK, FAST, 다시 OFF.
Run을 누르고, 버튼을 몇 번 누른 다음 Check를 누르세요.
직접 해보기
const int ledPin = 13;
const int buttonPin = 2;
enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;
bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// 다음 모드로 전환하고 모드 이름을 출력합니다.
void nextMode() {
// 모드마다 하나의 case: 다음 모드를 설정하고 이름을 출력한 뒤 break
}
// interval ms마다 LED의 상태를 전환합니다.
void blinkEvery(unsigned long interval) {
unsigned long now = millis();
if (now - blinkPrevious >= interval) {
blinkPrevious = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
void loop() {
// 1. 버튼을 누르면 (디바운싱 처리 후) nextMode()를 호출합니다
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // 접점이 안정되도록 기다립니다
}
// 2. 모드에 따라 LED의 동작이 결정됩니다
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
delay 없이 타이밍 제어하기의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드