Posted at

ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (Ticker編)

More than 3 years have passed since last update.


概要

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();