メインコンテンツに移動

周期処理(タイマー)

周期処理(タイマー)

周期的な処理を行うためのライブラリです。3タイプのライブラリが用意されています。

  • 1ms周期固定で1関数を実行する。
  • 指定周期で1関数を実行する。(MsTimer2)
  • 指定周期で複数の周期関数を実行する。ただし、Loop関数の周期に影響されます。

MsTimer2は、ArduinoのPlaygroundに掲載されているものとと同様の文法で使用可能です。MsTimer2を使用するためには、#include <MsTimer2.h>を記述してください。

attachIntervalTimerHandler

概要
1ms間隔で実行したい関数を登録します。
文法
attachIntervalTimerHandler(void(*)(unsigned long) function)
パラメータ
function: 関数名
戻り値
なし
注意
タイマー処理(function)内はデフォルトでは割り込み禁止で実行されます。割り込みを伴う処理はinterrupts()で割り込み許可してください。

detachIntervalTimerHandler

概要
1msインターバル関数の登録を解除します。
文法
detachIntervalTimerHandler()
パラメータ
なし
戻り値
なし

MsTimer2::set

概要
指定した周期間隔(ms)で処理する関数を登録します。
文法
MsTimer2::set(unsigned long ms, void (*function)())
MsTimer2::set(float ms, void (*function)())
パラメータ
ms: 周期(ms)。0.01msから指定可能
function: 関数名
戻り値
なし
注意
タイマー処理(function)内はデフォルトでは割り込み禁止で実行されます。割り込みを伴う処理はinterrupts()で割り込み許可してください。

MsTimer2::start

概要
setしたタイマーをスタートします。
文法
MsTimer2::start()
パラメータ
なし
戻り値
なし

MsTimer2::stop

概要
タイマーをストップします。
文法
MsTimer2::stop()
パラメータ
なし
戻り値
なし

attachCyclicHandler

概要
指定した周期間隔(ms)で処理する関数を登録します。関数呼び出し時にシステム開始からの時間(ms)が引数として取得できます。
文法
attachCyclicHandler(unsigned char number, void(*)(unsigned long) function, unsigned int time)
パラメータ
number: 0~7(関数の識別番号)
function: 関数名
time: 周期(ms)
戻り値
なし
注意
loop関数内で処理されるため、loop周期よりも短い間隔を指定しても正しく実行されません。

detachCyclicHandler

概要
周期関数の登録を解除します。
文法
detachCyclicHandler(unsigned char number)
パラメータ
number: 0~7(関数の識別番号)
戻り値
なし

サンプルプログラム

1ms周期関数とMsTimer2を使ったサンプルです。


#include <Arduino.h>
#include <MsTimer2.h>
void using_mstimer2() {
  static boolean output = HIGH;
 
  digitalWrite(PIN_LED0, output);
  output = !output;
}
 
// this function is called every 1ms.
void using_intervaltimer(unsigned long ms){
  static boolean output = HIGH;
  static unsigned long time;
 
  if((ms - time) > 1000){
      interrupts(); // to allow USB operation
      Serial.println(ms);
      time = ms;
      digitalWrite(PIN_LED1, output);
      output = !output;
  }
}
 
void setup() {
    pinMode(PIN_LED0, OUTPUT);
    pinMode(PIN_LED1, OUTPUT);
    Serial.begin(9600);
 
  MsTimer2::set(500, using_mstimer2); // 500ms period
  MsTimer2::start();
 
  attachIntervalTimerHandler(using_intervaltimer);
}
 
void loop() {
}