Arduino
IoT
ESP8266
ArduinoIDE
ESP-WROOM-02

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

More than 1 year has 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();