概要
ESP8266 (以下 WROOM02) のプログラムにあたり、標準ライブラリの使い方まとめ。Ticker編。
はじめに
WROOM02 (Arduino) でコーディングしていると、メッセージループが loop 一つなので、コードが if 文だらけになってしまいますよね。あるある。
定期的な処理をいい感じにやってくれる Ticker というクラスが標準であるので、その使い方まとめです。
使い方
インクルード
#include <Ticker.h>
Mac では、上記の実態は以下にあります。
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/Ticker/Ticker.h
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/Ticker/Ticker.cpp
簡単な例
以下で、
1,000 msec (1秒) 毎に your_loop1 関数
4,000 msec (4秒) 毎に your_loop2 関数
が実行されます。
#include <Ticker.h>
Ticker ticker1;
Ticker ticker2;
void your_loop1() {
Serial.print("Loop1 : ");
Serial.println(millis());
}
void your_loop2() {
Serial.print("Loop2 : ");
Serial.println(millis());
}
void setup() {
Serial.begin(115200);
ticker1.attach_ms(1000, your_loop1);
ticker2.attach_ms(4000, your_loop2);
}
void loop() {
// Do nothing.
}
結果
Loop1 : 17286
Loop1 : 18286
Loop1 : 19285
Loop2 : 20280
Loop1 : 20285
Loop1 : 21285
Loop1 : 22286
Loop1 : 23285
Loop2 : 24280
Loop1 : 24285
Loop1 : 25286
ループを停止する場合は detach を実行します。
ticker1.detach();
ticker2.detach();
1回しか実行しない場合
そもそも、1回しか実行しないなら once 関数が用意されています。
ticker1.once_ms(1000, your_loop1);
パラメータを渡す
パラメータを渡したいなら、template 版 が用意されています。
- 4バイト(おそらくポインタ) しか渡せない。
- パラメータはメモリ上から削除されないようにしないといけない。
(new でヒープに確保するか、あるいは、static をつけておく)
#include <Ticker.h>
Ticker ticker1;
Ticker ticker2;
class Param {
public:
const char* key;
int value;
};
void your_loop(Param* p) {
Serial.print("Loop ");
Serial.print(p->key);
Serial.print(" : ");
Serial.println(p->value);
}
void setup() {
Serial.begin(115200);
static Param p1;
p1.key = "Hello";
p1.value = 200;
static Param p2;
p2.key = "World";
p2.value = 600;
ticker1.attach_ms<Param*>(200, your_loop, &p1);
ticker2.attach_ms<Param*>(600, your_loop, &p2);
}
void loop() {
// Do nothing.
}
結果
Loop Hello : 200
Loop World : 600
Loop Hello : 200
Loop Hello : 200
Loop Hello : 200
Loop World : 600
Loop Hello : 200
秒(float) で指定したい
関数名に _ms が付かない関数 (msec ではなくて 秒で指定する) も用意されてますが、秒が float で指定するのは気持ち悪いので、 msec で指定するほうが好まれるでしょう。
まとめ
Ticker を使えば、loop 関数がすっきりします。
【しかし】Ticker で指定した関数内で通信処理ができないです(2016/01/10)。通信はメインループでしか不可能なのでしょうか?通信できた/通信できない の情報頂けるとありがたいです。
参考
全関数を載せておきます。
繰り返し
void attach(float seconds, callback_t callback)
void attach_ms(uint32_t milliseconds, callback_t callback)
template<typename TArg>
void attach(float seconds, void (*callback)(TArg), TArg arg)
template<typename TArg>
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
一回だけ
void once(float seconds, callback_t callback)
void once_ms(uint32_t milliseconds, callback_t callback)
template<typename TArg>
void once(float seconds, void (*callback)(TArg), TArg arg)
template<typename TArg>
void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
停止
void detach();