M5StackをIoT機器として利用する場合、センサ値の取得やLEDの点滅など、一定間隔で処理を繰り返したい場面は多くあります。
周期的な処理はどうやればいいのかな?
UIFlowでは、Timerモジュールを使って「一定間隔で関数を自動実行」することが可能。
本記事では、「タイマーコールバック関数」を使った処理の実装方法を解説していきます。
タイマー処理とは?
タイマーの役割
M5Stackを使った開発では、一定間隔で何かの処理を繰り返したいという場面がよくあります。
たとえば、
- センサの値を100msごとに取得したい
- LEDを1秒毎に点滅させたい
- ログデータを5秒毎に保存したい
このような定期的な処理を実現するために便利なのがタイマーコールバック関数という関数を使った処理です。
UIFlow2でのタイマー処理の仕組み
UIFlow2ではTimerモジュールを使って、一定の間隔で自動的に関数を呼び出すことができます。
このときに呼び出される関数は、コールバック関数と呼ばれるものです。
マイコン開発では、ハードウェア割り込み処理(ISR)という方法で、一定周期の処理を実現することがあります。
UIFlow2では、より扱いやすい方法でこれを実現するために、タイマーコールバック関数(ソフトウェア割り込み)という処理で、タイマーが一定時間毎に関数を呼び出すことが可能です。
UIFlow2におけるTimerモジュールの使い方
ここでは、M5Stack AtomS3でタイマーコールバック関数を使う方法について説明します。
Timerモジュールの追加方法

デフォルトの状態では、タイマーコールバック関数を使えないため、タイマーモジュールの追加をしていきます。
step
1HardwareのResourceを追加
画面左のResourcesエリアのHardwareをクリックします。

step
2Hardwareダイアログの中のTimerを選択
Hardwareのモジュール追加ダイアログが表示します。
Timerを選択してConfirmをクリック。

step
3Timerモジュールが追加される
以上の操作で、コマンドパレットのHardwartセクションの中に、Timerが追加されます。

Timerコールバック関数の使い方
次に、Timerコールバック関数の使い方について説明します。
Setupブロック


このブロックで、Timerを定義します。
Timer0 〜 Timer3 中から選択します。

Timerのモードと周期を設定します。
modeには次の2種類あります。
- PERIODIC : 繰り返し実行
- ONE SHOT : 1回実行
通常は、PERIODIC(繰り返し実行)を選択します。
period には、周期的に実行する関数の実行周期[msec]を設定します。
タイマーコールバック関数の実例
タイマーコールバック関数を使って、一定周期処理の実例を紹介します。
1秒毎にカウントアップするタイマーを作ってみます。


実行結果

コールバック関数実例の説明
画面表示

カウント値の画面表示のために、ラベルを配置します。
lbl_count : カウント値表示用のラベル
Setupブロック

タイマーコールバック関数用の設定をします。
- タイマー:timer0
- mode :PERIODIC
- period:1000msec

カウント値保存用の変数 count を定義して、初期値:0 を設定します。

Loopブロック

変数 count の値を ラベル lbl_count に表示します。
100msecのスリープを入れて、100msec毎に表示を更新します。
Callback関数

コールバック関数です。
今回は、この関数が呼び出されると変数 count に1を足します。
1秒ごとにコールバック関数が呼び出されるので、1秒のカウントアップタイマーとして動作します。
タイマーコールバック関数のまとめ
UIFlow2では、タイマーモジュールのコールバック関数を使うことで、一定間隔で処理を繰り返す周期的な動作を簡単に実装できます。
これは、M5StackをIoT機器として活用するうえで、とても便利な仕組みです。
ぜひ、さまざまな場面でタイマーコールバック関数を活用してみましょう。