⏱️
バックグラウンド処理用 MsTimer2 の使い方
ライブラリ
標準では入っていないので別途インストールする。
MsTimer2 を使わない書き方
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
static int count = 0;
if (count < 5) {
digitalWrite(LED_BUILTIN, count & 1);
}
count++;
delay(1000 * 0.5);
}
MsTimer2 を使った書き方
#include <DebugLog.h>
#include <MsTimer2.h>
void callback() {
static int count = 0;
digitalWrite(LED_BUILTIN, count & 1);
PRINTLN(millis());
count++;
if (count >= 5) {
MsTimer2::stop();
}
}
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
MsTimer2::set(1000 * 0.5, callback);
MsTimer2::start();
}
void loop() {
}
set で登録して start で開始し stop で停止する。メインの処理とは分離して処理を走らせることができる。
最初に呼ばれるタイミングは?
callback が最初に呼ばれるのは start の実行直後なのか、それとも指定した時間が経過したあとなのかが気になった。
シリアルモニターには次のように表示されるので、
498
998
1498
1998
2498
指定した時間が経過したあとに呼ばれていることがわかる。JavaScript の setInterval に近い。
複数指定できない
試すと最後に指定した関数しか呼び出せなかった。登録できるコールバック関数はあくまで一つのみのようだ。
なお ATmega328P のハードウェアタイマー 0, 1, 2 のうちの 2 を使っている。0, 1 は Arduino がライブラリで利用している。
干渉する場合がある
- GPIO 3, 11 を使う
-
tone()
を使う
場合にタイマー2が干渉するらしい。
参照
こちらではライブラリを使わない方法を紹介している。
Discussion