spot-thingspeak
の解説です。本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
ソースコードの入手
GitHub リポジトリ monowireless/spot-thingspeak から入手できます。
システムの概要
spot-thingspeak サンプルは、TWELITE ARIA から受信したデータを HTTP GET リクエストとして ThingSpeak のサーバへ送信し、グラフとして表示できるようにします。

表示例
基本的に、spot-httpbin サンプルを改変して作られています。そちらの解説もご覧ください。
主に NTP 関連のコードを消去し、リクエストの内容を変えている点が異なります。
開発に必要なもの
-
無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
-
磁気・温度・湿度センサー無線タグ TWELITE ARIAなどの子機 (お持ちでない場合はご購入ください 👉 販売店一覧)
- CR2032 コイン電池 などの電源
-
USBアダプター TWELITE R3 (お持ちでない場合はご購入ください 👉 販売店一覧)
- 通信用 USB-C ケーブル
- 💻 開発用コンピュータ
環境整備
ThingSpeak の設定
- ThingSpeak のサイトへアクセスし、MathWorks のアカウントを作成します
- “Channel” を作成し、次のように設定します。

Channelの設定例
- “API Keys” タブにある、16文字の “Write API key” を控えておきます
IDE とツールチェインの導入
Arduino IDE 1.x による開発環境の構築方法 をご覧ください。
プロジェクトファイルの入手
- GitHub (monowireless/spot-thingspeak) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
spot-thingspeak-main
からspot-thingspeak
に変更します - Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:
C:\Users\foo\Documents\Arduino
)にspot-thingspeak
フォルダを配置します
ユーザ設定の変更
Arduino IDE 上部のタブから config.h
を開き、Wi-Fi の SSID と パスワードを設定してください。WPA2-PSK ネットワークを想定しています。
また、先ほど控えた 16文字の “Write API key” についても設定してください。必要に応じて、ルート証明書も書き換えてください。
プロジェクトファイルの書き込み
ESP32 へのスケッチの書き込み方法 をご覧ください。
TWELITE ARIA の設定と起動
- TWELITE ARIA の設定を変更し、TWELITE ARIA モードの送信間隔を30秒以上(例:60秒)とします(サーバへの過負荷を避けるため)
- CR2032 電池を投入し、TWELITE ARIA を起動します
スケッチ
Arduino スケッチ spot-thingspeak.ino
および config.h
の解説です。
ライブラリのインクルード
Arduino および ESP32 公式ライブラリ
5-7行目では、Arduino および ESP32 の公式ライブラリをインクルードしています。
ヘッダファイル | 内容 | 備考 |
---|---|---|
Arduino.h | Arduino の基本ライブラリ | 省略できる場合もあるが念のため記載 |
WiFiClientSecure.h | ESP32 で SSL通信を行う | |
WiFi.h | Wi-Fiを扱う | 省略できる場合もあるが念のため記載 |
MWings ライブラリ
13行目では、MWings ライブラリをインクルードしています。
ユーザ設定の定義
16行目では、config.h
をインクルードしています。
config.h
では、ユーザ設定を定義しています。実行時には、この設定を書き換えてください。データ型の定義
19-26行目では、子機から受信したデータを保管しておく構造体の型を定義しています。
名称 | 内容 |
---|---|
serialId | シリアルID |
logicalId | 論理デバイスID |
supplyVoltage | 電源電圧 |
linkQuality | LQI |
temp100x | 100倍された温度 |
humid100x | 100倍された湿度 |
ここでは、TWELITE ARIA を使用します。
config.h
再起動間隔の定義
config.h
の4行目では、ESP32 の再起動間隔を指定しています。
ここでは、21600秒=6時間としています。
長期間の運用では、メモリリークが累積して不具合を起こしてしまう場合があります。
そこで Wi-Fi ルータのように定期的な再起動を行うようにしています。
TWELITE 設定の定義
config.h
の7-8行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。
名称 | 内容 |
---|---|
TWE_CH | TWELITE の 周波数チャネル |
TWE_APPID | TWELITE の アプリケーション ID |
Wi-Fi 設定の定義
config.h
の11-12行目では、TWELITE SPOT に搭載された ESP32 に適用するWi-Fi 設定を定義しています。
名称 | 内容 |
---|---|
WIFI_SSID | 接続するネットワークの SSID |
WIFI_PASSWORD | 接続するネットワークのパスワード |
ThingSpeak の Write API key
config.h
の15行目では、ThingSpeak の “Channel” の “Field” へデータを追加するために必要な “Write API key” を定義しています。
ルート証明書
config.h
の18-41行目では、Google Chrome を使って api.thingspeak.com
から取得したルート証明書の中身を記述しています。必要に応じて書き換えてください。
ホストの設定
config.h
の43-44行目では、ホストの設定を定義しています。
名称 | 内容 |
---|---|
SERVER_HOST | サーバのホスト名 |
SERVER_PORT | サーバのポート番号 |
SERVER_HOST
には、https://
を含めないようにしてください。DNS Failed / with error '-54'
のエラーを引き起こします。各種定数の定義
config.h
の46行目からは、各種定数を定義しています。
名称 | 内容 |
---|---|
QUERIES_MAX_LENGTH | クエリ文字列の最大長(ヌル文字含まず) |
CONNECT_TIMEOUT | サーバへの接続時のタイムアウト |
RECONNECT_MIN_INTERVAL | Wi-Fiアクセスポイントへ再接続する際の最短間隔 |
SEND_MIN_INTERVAL | リクエスト間隔の最短間隔 |
REQUEST_TIMEOUT | リクエストからレスポンスまでのタイムアウト |
SEND_MIN_INTERVAL
は、20秒に設定しています。
ThingSpeak の API の呼び出し制限によるものです。
SEND_MIN_INTERVAL
を短くすると、連続してパケットを受信した場合にサーバへ負担をかけてしまいます。
必ず適度な間隔を空けてください。
ピン番号の定義
spot-thingspeak.ino
の29-34行目では、ピン番号を定義しています。
名称 | 内容 |
---|---|
RST_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の PRG ピンが接続されているピンの番号 |
LED_PIN | 基板上の ESP32 用 LED が接続されているピンの番号 |
RX1_PIN | TWELITE の RX1 ピンが接続されているピンの番号 |
TX1_PIN | TWELITE の TX1 ピンが接続されているピンの番号 |
グローバルオブジェクトの宣言
37行目では、グローバルオブジェクトを宣言しています。
名称 | 内容 |
---|---|
client | HTTPS通信のインタフェース |
グローバル変数の宣言
40-41行目では、グローバル変数を宣言しています。
名称 | 内容 |
---|---|
LatestDataFromAria | TWELITE ARIA から受信した最新のデータ |
IsThereNewDataFromAria | TWELITE ARIA から新たなデータを受信したことを示すフラグ |
関数プロトタイプの宣言
44-54行目では、関数プロトタイプを宣言しています。
名称 | 内容 |
---|---|
anotherLoopForTWELITE | TWELITEのデータを処理するためのループ関数 |
xTaskCreatePinnedToCore()
により、別のタスクとして登録しています。名称 | 内容 |
---|---|
initTWELITE | TWELITEの初期化関数 |
initWiFi | Wi-Fiの初期化関数 |
名称 | 内容 |
---|---|
onAppAriaPacket | TWELITE ARIA からデータを受信した際のコールバック関数 |
名称 | 内容 |
---|---|
sendAriaData | TWELITE ARIAのデータを HTTP GET リクエストにのせて送る関数 |
setup()
57-74行目では、全体の初期化を行います。
xTaskCreatePinnedToCore()
により、loop()
とは別のタスクを登録しています。
下記の部分はキャプチャのない無名関数です。不要なグローバル空間の汚染を避けることができます。
vTaskDelay()
を挿入しています。loop()
77-99行目は、主となるループ処理です。
HTTP リクエストの処理、Wi-Fi 切断時の再接続処理、定期リセットの処理を行います。
anotherLoopForTWELITE()
102-104行目は、TWELITE のためのループ処理です。
データの受信と解釈を逐次行うため、ブロッキング処理を含む loop()
とは別のタスクとしています。
initTWELITE()
107-114行目は、TWELITE の初期化処理です。
TWELITE SPOT に搭載された TWELITE を指定された設定で起動し、パケット受信時のコールバック関数を登録しています。
下記リファレンスも合わせてご覧ください。
Twelite.begin()
mwings::MWings クラス | MWings API リファレンスTwelite.on()
mwings::MWings クラス | MWings API リファレンス
initWiFi()
117-144行目は、Wi-Fi の初期化処理です。
接続されない場合は、5秒置きに再接続を試みます。
onAppAriaPacket()
147-157行目には、TWELITE ARIA からデータを受信した際の処理を記述しています。
ここでは HTTP の送信処理を行わず、グローバル変数へセットしています。
グローバル変数へセットしたデータは、別のタスクで sendAriaData()
によって処理します。
sendAriaData()
160-220行目は、TWELITE ARIA のデータを HTTP GET リクエストのクエリ文字列にセットして送信する関数です。
サーバへの過度な負荷を防ぐため、高頻度でパケットが到着した際には送信をスキップしています。