BRD_ARIA

TWELITE ARIA - トワイライトアリア を用い、センサー値の取得を行います。

アクトの機能

  • TWELITE ARIA - トワイライトアリア を用い、センサー値の取得を行います。

  • コイン電池で動作させるための、スリープ機能を利用します。

アクトの使い方

必要なTWELITE

役割

アクトの解説

インクルード

TWELITE ARIA<ARIA>のボードビヘイビアをインクルードします。

setup()

最初に変数などの初期化を行います。ここではステートマシンstepの初期化を行っています。

最初にボードサポート <ARIA> を登録します。ボードサポートの初期化時にセンサーやDIOの初期化が行われます。

つづいて、インタラクティブモード関連の初期化と読出しを行います。

ここではsetオブジェクトの取得、アプリ名の反映、デフォルトのアプリケーションIDと通信チャネルの反映、設定メニューで不要項目の削除を行います。

次にSETピンの状態を読み出します。このサンプルはスリープによる間欠動作を行うため、+++入力によるインタラクティブモード遷移は出来ません。替わりに起動時のSETピン=LO状態でインタラクティブモードに遷移します。このときSETTINGS::open_at_start()を指定していますが、これはsetup()を終了後速やかにインタラクティブモード画面に遷移する指定です。

最後に.reload()を実行して設定値をEEPROMから読み出します。設定値を各変数にコピーしています。

このアクトではもっぱら無線パケットを送信しますので、TWENET の設定では動作中に受信回路をオープンにする指定(TWENET::rx_when_idle())は含めません。

続いてLEDの設定を行います。ここでは 10ms おきに ON/OFF の点滅の設定をします(スリープを行い起床時間が短いアプリケーションでは、起床中は点灯するという設定とほぼ同じ意味合いになります)。

loop()

loop()は、SM_SIMPLEステートマシンstepを用いた制御を行っています。スリープ復帰からセンサー値取得、無線パケット送信、送信完了待ち、スリープといった一連の流れを簡潔に表現するためです。ループの戦闘ではbrdオブジェクトを取得しています。

case STATE::INTERACTIVE:

インタラクティブモード中にメインループが動作するのは都合が悪いため、この状態に固定します。

case STATE::INIT:

センサーのデータ取得を開始します。

case STATE::SENSOR:

ボード上のセンサーは .sns_SHT4x という名前でアクセスでき、このオブジェクトに操作を行います。センサーの完了待ちを行います。まだセンサーの取得が終わっていない場合(.available()false)はセンサーに対して時間経過のイベント(.process_ev(E_EVENT_TICK_TIMER))を送付します。

センサーがavailableになった時点で、センサー値を取得し、STATE_TXに遷移します。

温湿度センサーは以下のように取得できます。

  • .get_temp_cent() : int16_t : 1℃を100とした温度 (25.6 ℃なら 2560)

  • .get_temp() : float : float値 (25.6 ℃なら 25.6)

  • .get_humid_dmil() : int16_t : 1%を100とした湿度 (56.8%なら 5680)

  • .get_temp() : float : float値 (56.8%なら 56.8)

case STATE::TX:

送信手続きについては他のアクトのサンプルと同様です。ここでは、再送1回、再送遅延を最小にする設定になっています。

パケットのペイロード部に識別子のFOURCHARSとセンサーデータを格納します。得られた値のうち温度値は int16_t ですが、送信パケットのデータ構造は符号なしで格納するため、uint16_tにキャストしています。

送信要求を行います。送信要求が成功したら送信完了街の準備を行います。完了イベントを待つために.clear_flag()、万が一のときのタイムアウトをset_timeout(100)を指定します。パラメータの100の単位はミリ秒[ms]です。

case STATE::TX_WAIT_COMP:

ここではタイムアウトの判定、送信完了イベントの判定を行います。

STATE::GO_SLEEP:

sleepNow()の処理を行います。

on_tx_comp()

送信完了時に呼び出されるシステムイベントです。ここでは.set_flag()により完了としています。

sleepNow()

スリープに入る手続きをまとめています。

スリープ前に.on_sleep(false)によりステートマシンの状態を初期化します。パラメータのfalseはスリープ復帰後STATE::INIT(=0)から始めます。

ここでは、起床までの時間を乱数により 1750ms から 2250ms の間に設定しています。これにより他の同じような周期で送信するデバイスのパケットとの連続的な衝突を避けます。

周期が完全に一致すると、互いのパケットで衝突が起き通信が困難になります。通常は時間の経過とともにタイマー周期が互いにずれるため、しばらくすると通信が回復し、また時間がたつと衝突が起きるという繰り返しになります。

8,9行目では、スリープに入るまえに磁気センサーのDIOピンの割り込み設定をします。pinMode()を用います。2番めのパラメータはPIN_MODE::WAKE_FALLINGを指定しています。これはHIGHからLOWへピンの状態が変化したときに起床する設定です。

11,12行目、この例ではシリアルポートからの出力を待ってスリープに入ります。通常は消費エネルギーを最小化したいため、スリープ前のシリアルポートの出力は最小限(または無し)にします。

12行目、スリープに入るには the_twelite.sleep() を呼びます。この呼び出しの中で、ボード上のハードウェアのスリープ前の手続きなどが行われます。たとえばLEDは消灯します。

パラメータとしてスリープ時間をmsで指定しています。

wakeup()

スリープから復帰し起床すると wakeup() が呼び出されます。そのあとloop() が都度呼び出されます。wakeup()の前に、UARTなどの各ペリフェラルやボード上のデバイスのウェイクアップ処理が行われます。例えばLEDの点灯制御を再始動します。

最終更新