
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