Menu
CoddyTech

지연 없이 깜박이기

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

delay()는 전체 스케치를 멈춥니다. 깜박임을 위해 500 ms 동안 기다리는 동안에는 loop()의 다른 어떤 코드도 실행되지 않습니다. 그 시간에 버튼을 눌러도 기다림이 끝날 때까지 감지되지 않습니다.

해결 방법은 기다리지 않는 것입니다. loop()가 계속해서 매우 빠르게 실행되도록 하고, 매번 현재 시각과 LED 상태가 마지막으로 바뀐 시각을 비교합니다. 500 ms가 지날 때까지 아무것도 하지 않습니다. 그런 다음 LED 상태를 바꾸고 새로운 시각을 저장합니다.

const unsigned long interval = 500;
unsigned long previousMillis = 0;   // LED가 마지막으로 바뀐 시점

void loop() {
  unsigned long now = millis();
  if (now - previousMillis >= interval) {
    previousMillis = now;           // 이 시점을 기억한다
    // 여기서 LED를 전환한다
  }
  // 여기에 있는 다른 코드는 모두 초당 수천 번 실행된다
}

now - previousMillis는 마지막으로 상태가 바뀐 후 경과한 시간입니다. LED 상태를 바꾸려면 상태를 변수에 저장합니다. int redState = LOW;처럼 설정한 다음 if/else로 상태를 반전시키고 digitalWrite(redLed, redState);로 씁니다.

previousMillis를 업데이트하는 것을 잊으면 첫 500 ms가 지난 후 조건이 계속 참으로 유지되므로, LED 상태가 매 루프마다 바뀌어 반쯤 켜진 것처럼 보입니다.

challenge icon

챌린지

중급

노란색 LED는 버튼을 따라야 하지만, 빨간색 LED의 delay() 호출이 루프를 멈추기 때문에 늦게 반응합니다. 빨간색 LED의 깜박임을 millis()를 사용하도록 다시 작성하세요:

  • 버튼 부분은 그대로 두세요
  • 500 ms마다 13번 핀의 빨간색 LED를 켜고 끄세요
  • 어디에도 delay()를 사용하지 마세요

Run을 누르고 버튼을 누른 채 두 LED를 지켜본 다음, Check를 누르세요.

직접 해보기

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

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

void loop() {
  // 노란색 LED는 버튼 상태에 따라 동작합니다. 이 부분은 그대로 두세요.
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(yellowLed, HIGH);
  } else {
    digitalWrite(yellowLed, LOW);
  }

  // 빨간색 LED는 깜박이지만, 각 delay() 호출은 위 코드의 실행을
  // 0.5초 동안 멈춥니다. 이 부분을 millis()를 사용하도록 다시 작성하세요.
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
}
quiz icon실력 점검

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

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

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