반응형

라이브러리

contrem/arduino-timer: Non-blocking library for delaying function calls (github.com)

 

GitHub - contrem/arduino-timer: Non-blocking library for delaying function calls

Non-blocking library for delaying function calls. Contribute to contrem/arduino-timer development by creating an account on GitHub.

github.com

 

사용 방법

라이브러리 인클루드

#include <arduino-timer.h>

 

타이머 인스턴스 선언

// 자동 유형으로 timer 인스턴스를 만듭니다.
auto timer = timer_create_default(); // 기본 설정으로 타이머 만들기

// 또는 아래와 같이 Timer 생성자로 만들 수 있습니다.
Timer<> default_timer; // 위와 같음
Timer<10> timer; // 밀리초를 사용하는 10개의 태스크를 생성합니다.
Timer<10, micros> timer; // 마이크로초를 사용하는 10개의 태스크를 생성합니다.
Timer<10, micros, int> timer; // int형의 인수를 사용하는 마이크로초 태스크를 10개 생성합니다.

 

루프 함수에서 타이머 호출

void loop() {
    timer.tick();
}

 

타이머가 만료될 때 실행할 콜백 함수 정의

bool function_to_call(void *argument) {
    return true; // true: 반복 실행, false: 정지
}

 

지연 시간 단위로 콜백 함수 호출

timer.in(delay, function_to_call);
timer.in(delay, function_to_call, argument);

 

특정 시간에 콜백 함수 호출

timer.at(time, function_to_call);
timer.at(time, function_to_call, argument);

 

매 인터벌 시간마다 콜백 함수 호출

timer.every(interval, function_to_call);
timer.every(interval, function_to_call, argument);

 

태스크 취소

auto task = timer.in(delay, function_to_call);
timer.cancel(task);

 

태스크 전부 취소

timer.cancel();

 

타이머 활성화 상태

if (timer.empty())
{
}

 

활성화된 태스크 개수

auto active_tasks = timer.size();

 

람다식 사용

timer.in(1000, [](void*) -> bool { return false; });
timer.in(1000, [](void *argument) -> bool { return argument; }, argument);

 

다음 태스크까지의 틱 수

auto ticks = timer.ticks();

void loop {
    auto ticks = timer.tick();
}

 

내부 틱 산 방지

void loop {
    timer.tick<void>();
}

 

예제 소스 코드

#include <arduino-timer.h>

auto timer = timer_create_default(); // 기본 설정 타이머 ms
Timer<1, micros, const char *> u_timer; // 태스크 1개인 마이크로초 타이머 1us = 1/1000ms
Timer<16, millis, const char *> t_timer; // 태스크 16개인 밀리초 타이머 1ms = 1/1000s

bool toggle_led(void *) {
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // LED 반전
  return true; // 타이머 반복
}

bool print_message(const char *m) {
  Serial.print("메시지 출력: ");
  Serial.println(m);
  return true; // 타이머 반복
}

size_t repeat_count = 1;
bool repeat_x_times(void *opaque) {
  size_t limit = (size_t)opaque;

  Serial.print("반복 횟수: ");
  Serial.print(repeat_count);
  Serial.print("/");
  Serial.println(limit);

  return ++repeat_count <= limit; // 제한에 도달한 후 이 작업 제거
}

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT); // LED핀 출력 설정

  // 500ms마다 토글_led 함수를 호출합니다.
  timer.every(500, toggle_led);

  // 1000ms마다 반복_x_times 함수를 호출합니다.
  timer.every(1000, repeat_x_times, (void *)10);

  // 1000ms마다 print_message 함수를 호출합니다.
  // 인수 문자열을 전달합니다.
  t_timer.every(1000, print_message, "매초 호출됨");

  // 5s 후에 print_message 함수를 호출합니다.
  t_timer.in(5000, print_message, "5초 지연됨");

  // print_message 함수 호출 + 10초
  t_timer.at(millis() + 10000, print_message, "millis()+10초에 호출 됨");

  // 500ms마다 토글_led 함수를 호출합니다.
  auto task = timer.every(500, toggle_led);
  timer.cancel(task); // 이 작업은 이제 취소되었으며 실행되지 않습니다.

  // 2s 후에 print_message 함수를 호출합니다.
  u_timer.in(2000000, print_message, "2000000us 지연됨");

  if (!u_timer.in(5000, print_message, "출력되지 않음")) {
    /* 동시 작업 슬롯이 1개만 있는 u_timer를 생성했기 때문에 실패합니다. */
    Serial.println("타이머가 가득 차서 이벤트 추가 실패");
  }
}

void loop() {
  // 타이머 틱 실행
  timer.tick();
  t_timer.tick();
  u_timer.tick();
}

 

반응형

관련글