⏱️

バックグラウンド処理用 MsTimer2 の使い方

2023/05/22に公開

ライブラリ

https://playground.arduino.cc/Main/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が干渉するらしい。

参照

https://garchiving.com/how-to-use-timer-interrupt-with-arduino/

こちらではライブラリを使わない方法を紹介している。

Discussion