ESP-WROOM-02 で定期的に処理させる

ときどきインターネットに気象情報を取りにいったり、センサーの値を取得したり、クラウドに保存したいとき、つまりタイマーで定期的に処理をしたい場合、Tickerを使います。

Ticker による割り込み処理では、ネットワーク通信、シリアル通信、ファイル読み書きなど、いわゆるブロッキング I/O に属する処理はできません

これらを定期的に実行するには、Ticker の割り込みでフラグだけ立てて、 loop 処理内でフラグに応じて通信や読み書き処理を行って、終わったらフラグを落とすようにします。
原始的ですね…。

#include <Ticker.h>

Ticker ticker;
bool readyForTicker = false;

void setReadyForTicker() {
  // フラグを立てるだけ
  readyForTicker = true;
}

void doBlockingIO() {
  // TODO 定期的に行いたい通信とかファイル読み書き

  // フラグを落とす
  readyForTicker = false;
}

void setup() {
  // 60 秒ごとに setReadyForTicker() を呼び出す
  ticker.attach(60, setReadyForTicker);
  // ミリ秒単位も指定出来ます
  // ticker.attach_ms(60000, setReadyForTicker);
}

void loop() {
  if (readyForTicker) {
    doBlockingIO();
  }
}

ミリ秒、秒単位の割り込みができます。
マイクロ秒単位の割り込みは別の方法になりますので別投稿で…。

フラグ管理が面倒なので GitHub – Toshik/TickerScheduler: Simple scheduler for ESP8266 Arduino based on Ticker に任せるのも良さそうです。

#include <TickerScheduler.h>

// 管理したい ticker の数を指定
TickerScheduler ts(1);

void doBlockingIO() {
  // TODO 定期的に行いたい通信とかファイル読み書き

}

void setup() {
  // タスク ID 0 として 60 秒ごとに doBlockingIO() を呼び出しする
  ts.add(0, 60000, doBlockingIO, true);
}

void loop() {
  ts.update();
}

スッキリです。

Arduino IDE 1.6.8
ESP8266 core for Arduino 2.1.0