1ヶ月ほどトライアンドエラーを繰り返したNefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化するメモです。
今日、いままでの知見を集めて、落ち着いてやってみたらうまくいったのでメモしておきます。
今回の仕組み
今回の仕組みです。
D2ポートにGrove タッチセンサーをつないでNefry BT R2を準備します。
このようにNefry BTにつないだタッチセンサーのデータをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化します。
Nefry BT R2 がしっかりMQTTできるか試しておく
そういえば、Nefry BT R2はMQTT接続はじめてなので試しておきます。(Nefry BT 無印は確認済み)
- Nefry ライブラリバージョン
- 1.2.0
- Nefry BT R2 LCDディスプレイ
- 装着済み
- Arduino IDE バージョン
- 1.8.5 Windows
Node-RED MQTTブローカー経由でNefryBT+フルカラーテープLEDを動かすメモ この記事をMQTTの送受信だけにシンプルにしたもので無事接続されました。
ざっくり流れだけですが、
Node-REDでMQTT Broker ノードを使ってMQTTを受け付けるようにして、
D2を押すと内部的には反応し、
Node-REDに無事データが受信できています。ちゃんとMQTTとWi-Fi機能してますね!
ESPまわりでうまくいった文献を探す
いろいろと探しました。
- ESP8266系の成功記事を置き換えてみる
- NG:ESP8266WiFiがスタートになっててうまく置き換えられず
- Mosquitoを利用したコマンドラインから叩くMQTT仕様を読み解く
- NG:QuickStartではないトークン付きの記事が多く読み解けず
どれもNG。無念。自分の力が足りないとしか言いようがないですが、地道に探していたところ、以下の記事がNefry BTへの移植に相性が良さそうでした。
Connect an ESP32 to the Watson IoT Platform!
PubSubClient・WiFiClientクラスの扱いが、私のアプローチと近いので移植しやすそうで光明が見えます。
IBM Watson IoT Platform の準備(QuickStart)
まずつながるとテンションが上がるので、おなじみQuickStartでやります。
こうやってすぐ試せるのはありがたいところ。
デバイスIDを「NefryBT_123456789」で待っておきます。これは、のちほど、Nefry BTのプログラムで設定するデバイスIDと一致させたいので間違えないようにしましょう。
プログラムを書いていく
ということで、Connect an ESP32 to the Watson IoT Platform!の記事を参考にプログラムを改修していきます。
#include <Nefry.h> #include <WiFiClient.h> #include <PubSubClient.h> //-------- Customise these values ----------- // 接続先のIBM Watson IoT Platform #define ORG "quickstart" // your organization or "quickstart" // デバイスタイプはNefry BTで #define DEVICE_TYPE "nefrybt" // use this default for quickstart or customize to your registered device type // デバイスIDは以下で #define DEVICE_ID "NefryBT_123456789" // use this default for quickstart or customize to your registered device id // quickstartでは使わないが宣言はしておく #define TOKEN "<yourDeviceToken>" // your device token or not used with "quickstart" //-------- Customise the above values -------- // 実際の接続するための設定群 char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; char topic[] = "iot-2/evt/status/fmt/json"; char authMethod[] = "use-token-auth"; char token[] = TOKEN; char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID; // WiFiClient準備 WiFiClient wifiClient; // 入力の状態記録 int sensorValueState = LOW; // ポート番号 const int port = 1883; // 今回センサーがつながったピン番号 D2 int PIN = D2; // MQTT接続のための準備 // QuickStartのため server , port だけ。あとはwifiClient紐付け。 PubSubClient client(server, port, wifiClient); void setup() { pinMode(PIN,INPUT); Serial.begin(115200); } void loop() { String payload; // MQTT再接続処理 if (!!!client.connected()) { Serial.print("Reconnecting client to "); Serial.println(server); while (!!!client.connect(clientId, authMethod, token)) { Serial.print("."); delay(500); } Serial.println(); } // センサー反応判定 int sensorValueCurrent = digitalRead(PIN); if ( sensorValueCurrent != sensorValueState ) { if( sensorValueCurrent == HIGH ){ Serial.println("sensor ON"); // IBM Watson IoT Platformに合わせてデータ構造をつくる flag = 1 payload = "{ \"d\" : {\"flag\":1} }"; } else { Serial.println("sensor OFF"); // IBM Watson IoT Platformに合わせてデータ構造をつくる flag = 0 payload = "{ \"d\" : {\"flag\":0} }"; } // データ送信 Serial.print("Sending payload: "); Serial.println(payload); if (client.publish(topic, (char*) payload.c_str())) { Serial.println("Publish ok"); } else { Serial.println("Publish failed"); } } // 入力の状態を次のループまで記憶 sensorValueState = sensorValueCurrent; delay(3000); }
こちらをNefry BTに書き込みます。
動かしてみる!
Wi-Fiがつながる状態で動かしてみます!
押してない状態。
押してみます。これを繰り返します。
さきほど、表示していたIBM Watson IoT Platformの画面を見てみましょう。
無事、データが送信されています!
まとめ
ということで、NefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化できました。
IBM Watson IoT PlatformはシンプルなMQTTの構造をしていたのでNefry BTでもすぐつながるだろうと思っていましたが、接続するためのその周辺の情報、送信時のデータの形式・トークン・サーバーの送信先あたりが適切に設定できておらず、かなりハマってしまいました、QuickStartとはいえ無事につながって良かったです。
publishだけでなく、Subscribeや、しっかり自分用のIBM Watson IoT Platformを立てた際も試していこうと思います。
それではよき、Nefry BT & IBM Watson IoT Platform Life を!