LoginSignup
44
44

More than 5 years have passed since last update.

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

Posted at

概要

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
44