포스트

아두이노 Delay와 millis

프로젝트를 구현하던 중, 구조에서 문제가 발생했다

매 초 온습도 센서를 통해 데이터를 체크하고,

5분 간격으로 NTP 서버에 시간 정보를, Openweather에서 날씨 정보를 얻어오는 프로젝트였다

간단한 구조라 delay()로 구현하였는데, 시간을 출력하는 부분에서 미세하게 오차가 발생했다

delay

  • delay 함수는 가장 쉽게 사용할 수 있는 명령 지연 함수
  • 프로그램 실행을 중단 시키기 때문에, 그 시간동안 다른 작업을 할 수 없음(Blocking)
  • 짧은 시간동안의 지연이 필요한 경우 사용
  • 동시에 다른 작업을 수행할 수 없으므로, 단일 작업 구현에 사용
  • 시간 지연이 정확하지 않을 수 있음
  • CPU가 대기하면서 전력을 소비하기 때문에, 전력 소모량이 높음
1
2
3
4
5
6
7
8
9
10
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // LED 켜기
  delay(1000);                       // 1초 대기
  digitalWrite(LED_BUILTIN, LOW);    // LED 끄기
  delay(1000);                       // 1초 대기
}

millis

  • 아두이노가 실행된 후 경과 시간을 밀리초 단위로 반환하는 함수
  • 프로그램의 실행을 중단하지 않음
  • 비동기식 타이머로 여러 작업을 병행할 수 있음
  • 일정 주기로 특정 작업을 수행하는데 유용함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
unsigned long previousMillis = 0; 
const long interval = 1000;  // 1초 간격

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis(); // 실행 경과 시간을 받아옴

  if (currentMillis - previousMillis >= interval) { // 현재 시간과 이전 시간을 비교하여 간격을 초과했는지 체크
    previousMillis = currentMillis;  // 이전 시간을 현재 시간으로 갱신

    // LED 상태 토글
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}

최대한 millis를 이용해 시간 차이를 이용해 구현하고, delay 사용을 지양할 것

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.