Menu
CoddyTech

버튼으로 모드 순환하기

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를 설정합니다.

challenge icon

챌린지

중급

버튼과 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;
  }
}
quiz icon실력 점검

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

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

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