セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-11-14 現在

TWELITE と通信するスケッチの解説

MWings ライブラリに同梱された TWELITE SPOT の基本的なサンプルスケッチの解説
TWELITE NET だけを使用し、無線 LAN を使わない簡単なサンプルスケッチを解説します。

1 - 超簡単!標準アプリのデータを取得・操作

超簡単!標準アプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

1.1 - 超簡単!標準アプリのデータを取得・操作

最新版
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_twelite からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-11行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号
RX1_PINTWELITE の RX1 ピンが接続されているピンの番号
TX1_PINTWELITE の TX1 ピンが接続されているピンの番号

TWELITE 設定の定義

13-14行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

19-21行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

24-27行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

29-49行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });

上記のイベントは、超簡単!標準アプリからのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppTwelitePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Timestampパケットのタイムスタンプ
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Digital Inputデジタル入力の状態
Analog Inputアナログ入力の状態

TWELITE のデータの更新

55行目では、Twelite.update() を呼び出しています。

    Twelite.update();

相手先の出力ポートの操作

超簡単!標準アプリの入力ポートの状態を取得するだけでなく、超簡単!標準アプリの出力ポートを操作してみましょう。

ここでは、TWELITE SPOT が受信した際の LQI(無線通信品質)に基づき、相手端末が TWELITE SPOT に近づいた際に、相手端末のデジタル出力ポートを点灯させてみます。

スケッチの改変

改変内容

はじめに、16行目へ下記のコードを追加します。

AppTweliteCommand command;

上記のコードでは、送信するコマンドの内容を格納する AppTweliteCommand を作成しています。

次に、52-54行目へ下記のコードを追加します。

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);

上記のコードでは、AppTweliteCommand を操作し、Twelite.send() でコマンドを送信しています。

これでスケッチの改変は終了です。改変後のコードを示します。

// Monitor example for TWELITE SPOT: Receive data from and send data to App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

AppTweliteCommand command;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

動作確認

子機の TWELITE DIP の DO1 ピンと VCC ピンの間に LED と電流制限抵抗を接続してください。

改変したスケッチを書き込むと、TWELITE DIP が TWELITE SPOT に近づいた際(=通信品質がよいとき)に LED が点灯します。

1.2 - 超簡単!標準アプリのデータを取得・操作

v1.0.1
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_twelite からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

16-18行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

21-23行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

26-46行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });

上記のイベントは、超簡単!標準アプリからのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppTwelitePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Timestampパケットのタイムスタンプ
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Digital Inputデジタル入力の状態
Analog Inputアナログ入力の状態

TWELITE のデータの更新

52行目では、Twelite.update() を呼び出しています。

    Twelite.update();

相手先の出力ポートの操作

超簡単!標準アプリの入力ポートの状態を取得するだけでなく、超簡単!標準アプリの出力ポートを操作してみましょう。

ここでは、TWELITE SPOT が受信した際の LQI(無線通信品質)に基づき、相手端末が TWELITE SPOT に近づいた際に、相手端末のデジタル出力ポートを点灯させてみます。

スケッチの改変

改変内容

はじめに、13行目へ下記のコードを追加します。

AppTweliteCommand command;

上記のコードでは、送信するコマンドの内容を格納する AppTweliteCommand を作成しています。

次に、49-51行目へ下記のコードを追加します。

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);

上記のコードでは、AppTweliteCommand を操作し、Twelite.send() でコマンドを送信しています。

これでスケッチの改変は終了です。改変後のコードを示します。

// Monitor example for TWELITE SPOT: Receive data from and send data to App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

AppTweliteCommand command;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

動作確認

子機の TWELITE DIP の DO1 ピンと VCC ピンの間に LED と電流制限抵抗を接続してください。

改変したスケッチを書き込むと、TWELITE DIP が TWELITE SPOT に近づいた際(=通信品質がよいとき)に LED が点灯します。

1.3 - 超簡単!標準アプリのデータを取得・操作

v1.3.1
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_twelite からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

16-18行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

21-23行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

26-46行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });

上記のイベントは、超簡単!標準アプリからのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppTwelitePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Timestampパケットのタイムスタンプ
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Digital Inputデジタル入力の状態
Analog Inputアナログ入力の状態

TWELITE のデータの更新

52行目では、Twelite.update() を呼び出しています。

    Twelite.update();

相手先の出力ポートの操作

超簡単!標準アプリの入力ポートの状態を取得するだけでなく、超簡単!標準アプリの出力ポートを操作してみましょう。

ここでは、TWELITE SPOT が受信した際の LQI(無線通信品質)に基づき、相手端末が TWELITE SPOT に近づいた際に、相手端末のデジタル出力ポートを点灯させてみます。

スケッチの改変

改変内容

はじめに、13行目へ下記のコードを追加します。

AppTweliteCommand command;

上記のコードでは、送信するコマンドの内容を格納する AppTweliteCommand を作成しています。

次に、49-51行目へ下記のコードを追加します。

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);

上記のコードでは、AppTweliteCommand を操作し、Twelite.send() でコマンドを送信しています。

これでスケッチの改変は終了です。改変後のコードを示します。

// Monitor example for TWELITE SPOT: Receive data from and send data to App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

AppTweliteCommand command;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

動作確認

子機の TWELITE DIP の DO1 ピンと VCC ピンの間に LED と電流制限抵抗を接続してください。

改変したスケッチを書き込むと、TWELITE DIP が TWELITE SPOT に近づいた際(=通信品質がよいとき)に LED が点灯します。

2 - キューアプリのデータを取得

キューアプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

2.1 - キューアプリのデータを取得

最新版
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_cue からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_CUE (CUE Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printAccelEvent(const uint8_t event);
void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_CUE
    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printAccelEvent(const uint8_t event)
{
    switch (event) {
    case 0x01: { Serial.print("Dice (1)"); break; }
    case 0x02: { Serial.print("Dice (2)"); break; }
    case 0x03: { Serial.print("Dice (3)"); break; }
    case 0x04: { Serial.print("Dice (4)"); break; }
    case 0x05: { Serial.print("Dice (5)"); break; }
    case 0x06: { Serial.print("Dice (6)"); break; }
    case 0x08: { Serial.print("Shake"); break; }
    case 0x10: { Serial.print("Move"); break; }
    default: break;
    }
    Serial.println("");
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or Not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-11行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号
RX1_PINTWELITE の RX1 ピンが接続されているピンの番号
TX1_PINTWELITE の TX1 ピンが接続されているピンの番号

TWELITE 設定の定義

13-14行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

22-24行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

27-29行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

32-52行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、キューアプリ(TWELITE CUE モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppCuePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Accel Event加速度センサーの状態
Accel X AxisX 軸加速度(1サンプル目)
Accel Y AxisY 軸加速度(1サンプル目)
Accel Z AxisZ 軸加速度(1サンプル目)
Magnet State磁気センサーの状態
加速度センサーの状態

出力される加速度センサーの状態は以下の通りです。

  • Dice (1) - Dice (6) サイコロの目(姿勢)を検知した。
  • Shake 揺さぶるような動きを検知した。
  • Move ゆっくりとした動きを検知した。
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

58行目では、Twelite.update() を呼び出しています。

    Twelite.update();

2.2 - キューアプリのデータを取得

v1.0.1
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_cue からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_CUE (CUE Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printAccelEvent(const uint8_t event);
void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_CUE
    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printAccelEvent(const uint8_t event)
{
    switch (event) {
    case 0x01: { Serial.print("Dice (1)"); break; }
    case 0x02: { Serial.print("Dice (2)"); break; }
    case 0x03: { Serial.print("Dice (3)"); break; }
    case 0x04: { Serial.print("Dice (4)"); break; }
    case 0x05: { Serial.print("Dice (5)"); break; }
    case 0x06: { Serial.print("Dice (6)"); break; }
    case 0x08: { Serial.print("Shake"); break; }
    case 0x10: { Serial.print("Move"); break; }
    default: break;
    }
    Serial.println("");
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or Not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

19-21行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

24-26行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

29-49行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、キューアプリ(TWELITE CUE モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppCuePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Accel Event加速度センサーの状態
Accel X AxisX 軸加速度(1サンプル目)
Accel Y AxisY 軸加速度(1サンプル目)
Accel Z AxisZ 軸加速度(1サンプル目)
Magnet State磁気センサーの状態
加速度センサーの状態

出力される加速度センサーの状態は以下の通りです。

  • Dice (1) - Dice (6) サイコロの目(姿勢)を検知した。
  • Shake 揺さぶるような動きを検知した。
  • Move ゆっくりとした動きを検知した。
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

55行目では、Twelite.update() を呼び出しています。

    Twelite.update();

2.3 - キューアプリのデータを取得

v1.1.3
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_cue からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_CUE (CUE Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printAccelEvent(const uint8_t event);
void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_CUE
    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printAccelEvent(const uint8_t event)
{
    switch (event) {
    case 0x01: { Serial.print("Dice (1)"); break; }
    case 0x02: { Serial.print("Dice (2)"); break; }
    case 0x03: { Serial.print("Dice (3)"); break; }
    case 0x04: { Serial.print("Dice (4)"); break; }
    case 0x05: { Serial.print("Dice (5)"); break; }
    case 0x06: { Serial.print("Dice (6)"); break; }
    case 0x08: { Serial.print("Shake"); break; }
    case 0x10: { Serial.print("Move"); break; }
    default: break;
    }
    Serial.println("");
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or Not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

19-21行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

24-26行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

29-49行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、キューアプリ(TWELITE CUE モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppCuePacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Accel Event加速度センサーの状態
Accel X AxisX 軸加速度(1サンプル目)
Accel Y AxisY 軸加速度(1サンプル目)
Accel Z AxisZ 軸加速度(1サンプル目)
Magnet State磁気センサーの状態
加速度センサーの状態

出力される加速度センサーの状態は以下の通りです。

  • Dice (1) - Dice (6) サイコロの目(姿勢)を検知した。
  • Shake 揺さぶるような動きを検知した。
  • Move ゆっくりとした動きを検知した。
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

55行目では、Twelite.update() を呼び出しています。

    Twelite.update();

3 - アリアアプリのデータを取得

アリアアプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

3.1 - アリアアプリのデータを取得

最新版
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_aria からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_ARIA (ARIA Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_ARIA
    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-11行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const int8_t RX1_PIN = 16;
const int8_t TX1_PIN = 17;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号
RX1_PINTWELITE の RX1 ピンが接続されているピンの番号
TX1_PINTWELITE の TX1 ピンが接続されているピンの番号

TWELITE 設定の定義

13-14行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

21-23行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1, RX1_PIN, TX1_PIN);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

26-28行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

31-47行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、アリアアプリ(TWELITE ARIA モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppAriaPacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Air TemperatureTWELITE ARIA が計測した気温 (°C)
Relative HumidityTWELITE ARIA が計測した相対湿度 (%)
Magnet State磁気センサーの状態
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

53行目では、Twelite.update() を呼び出しています。

    Twelite.update();

3.2 - アリアアプリのデータを取得

v1.0.1
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_aria からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_ARIA (ARIA Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_ARIA
    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

18-20行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

23-25行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

28-44行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、アリアアプリ(TWELITE ARIA モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppAriaPacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Air TemperatureTWELITE ARIA が計測した気温 (°C)
Relative HumidityTWELITE ARIA が計測した相対湿度 (%)
Magnet State磁気センサーの状態
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

50行目では、Twelite.update() を呼び出しています。

    Twelite.update();

3.3 - アリアアプリのデータを取得

v1.1.3
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> TWELITE SPOT -> Receive -> monitor_spot_app_aria からスケッチを開くことができます。

保存場所の表示例

保存場所の表示例

スケッチ

以下はソースコード本体です。

// Monitor example for TWELITE SPOT: Receive data from App_ARIA (ARIA Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_ARIA
    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリをインクルードしています。

#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

18-20行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

23-25行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

28-44行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、アリアアプリ(TWELITE ARIA モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppAriaPacket 型の引数 packet に格納されています。

メッセージの内容

メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Air TemperatureTWELITE ARIA が計測した気温 (°C)
Relative HumidityTWELITE ARIA が計測した相対湿度 (%)
Magnet State磁気センサーの状態
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

50行目では、Twelite.update() を呼び出しています。

    Twelite.update();