基本ライブラリ
デジタルIO
アナログIO
拡張IO
時間
数学
三角関数
乱数
ビットバイト操作
割り込み
シリアル通信
標準ライブラリ
Ethernet
Ethernetサーバー
Ethernetクライアント
サーボモーター
ステッピングモーター
キャラクタ液晶表示
EEPROM
SPI通信
I2C通信(Wire)
メモリカード
メモリカード(File操作)
周期処理(MsTimer2)
時計(RTC)
ユーティリティ
周期処理(タイマー)
周期的な処理を行うためのライブラリです。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() {
}