반응형
라이브러리
contrem/arduino-timer: Non-blocking library for delaying function calls (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();
}
반응형