본문 바로가기
ESP32/ESP32

ESP32 Timer 구현하기 - millis()함수 사용하기

by 빈이쥬 2024. 10. 16.

esp32에서 millis()함수를 사용하여 LED를 제어해보겠습니다.

 

타이머 소개

delay() 함수는 코드의 실행을 일정 시간 동안 멈추는 함수로, 그 동안에는 다른 작업을 할 수 없습니다.

예를 들어, delay(1000)을 사용하면 1초 동안 코드의 실행이 멈춥니다.

하지만 millis() 함수를 사용하면 현재 프로그램이 시작된 이후 흐른 시간을 기록하여, 정해진 시간 동안에도 다른 작업을 처리할 수 있습니다.

 

delay() 함수

delay(milliseconds);

delay(1000)일때 1초간 멈춥니다 1000 = 1초

delay함수는 작업이 완료될때까지 프로그램이 다른 작업을 수행할 수 없습니다. 

 

 

대부분의 프로젝트에서는 delay()을 사용하는 대신 millis()를 사용해야 합니다.

millis() 함수

처음 시작된 이후로 경과한 밀리초 수를 반환합니다.

millis()

 

그 기능이 유용한 이유는? 코드를 차단하지 않고도 얼마나 많은 시간이 지났는지 쉽게 확인할 수 있기 때문입니다.

 

millis()로 LED 깜박이기

회로도

 

 

코드

const int ledPin =  16;      // LED가 연결된 핀 번호

// 변수는 변경될 수 있습니다
int ledState = LOW;             // LED 상태를 저장하는 변수

// 시간 값을 저장하는 변수는 일반적으로 "unsigned long"을 사용하는 것이 좋습니다
// int로 저장하기엔 값이 너무 커질 수 있기 때문입니다
unsigned long previousMillis = 0;        // LED가 마지막으로 업데이트된 시간을 저장하는 변수

const long interval = 1000;           // LED가 깜빡이는 간격 (밀리초 단위)

void setup() {
  // 디지털 핀을 출력 모드로 설정:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // LED를 깜빡일 시간인지 확인합니다.
  // 현재 시간과 LED를 마지막으로 깜빡인 시간의 차이가
  // LED가 깜빡이는 간격(interval 변수)보다 큰지 확인합니다.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // LED를 마지막으로 깜빡인 시간을 저장
    previousMillis = currentMillis;

    // LED가 꺼져 있으면 켜고, 켜져 있으면 끕니다:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // 변수 ledState에 따라 LED를 설정
    digitalWrite(ledPin, ledState);
  }
}

코드 작동 방식

핵심 개념:

millis() 함수는 마이크로컨트롤러가 켜진 후 흐른 시간을 밀리초(1/1000초) 단위로 반환합니다. 이 코드는 delay() 함수를 사용하지 않고, 정해진 시간 간격마다 다른 작업을 중단하지 않고도 특정 작업을 반복할 수 있게 해줍니다.

if (currentMillis - previousMillis >= interval) {
  previousMillis = currentMillis;
  // LED 깜빡이기 등의 작업이 여기에서 수행됨
}

 

 

1. currentMillis와 previousMillis 변수

  • currentMillis: millis() 함수를 호출해 현재 시간을 얻습니다.
  • previousMillis: 마지막으로 LED가 깜빡였을 때의 시간을 저장하는 변수입니다.

2. currentMillis - previousMillis

이 부분은 현재 시간과 마지막으로 LED가 깜빡인 시간의 차이를 계산합니다. 이 차이가 간격(interval)보다 크거나 같은지를 확인합니다. 즉, LED가 깜빡여야 할 시간이 되었는지 확인하는 과정입니다.

  • 예를 들어, interval이 1000ms(1초)라면, 현재 시간이 마지막으로 LED가 깜빡인 시간보다 1000ms 이상 지났을 때 LED를 다시 깜빡입니다.

3. 조건이 충족되면 (if 문이 참이면)

  • previousMillis 값을 현재 시간인 currentMillis로 업데이트합니다. 즉, LED가 깜빡인 시간을 현재 시간으로 갱신합니다.
  • 이 과정을 통해 1초마다 반복적으로 LED가 깜빡이게 됩니다.

예시 흐름:

  1. 프로그램이 시작되면 previousMillis는 0입니다.
  2. millis()로 얻은 currentMillis가 1000ms가 지나면, currentMillis - previousMillis는 1000이 되므로 if 조건이 참이 됩니다.
  3. LED가 깜빡이고, previousMillis는 1000ms로 업데이트됩니다.
  4. 이후 currentMillis가 다시 1000ms 더 지나서 2000ms가 되면, 이번에도 currentMillis - previousMillis는 1000이 되어 조건이 다시 충족됩니다.
  5. 이 과정을 반복하면서 LED는 일정한 간격(여기서는 1초)마다 깜빡입니다.