IoT その2(温湿度センサーのデータをESP32のWi-Fi経由でThingsBoard Cloudで確認する~実践編~)
こんにちは、Ideagearの鈴木陽介です。
前回は、センサーで検知したデータをWi-Fi経由でクラウドにつなぎ、既存のIoTプラットフォームで確認する方法に関して、IoTやそのプラットフォームにとは何ぞや?という知識関係をメインにご紹介しました。
今回は、センサーやマイコンを使った実際の配線やソースコード、ThingsBoard Cloudの使い方についてご説明します。
おさらい
IoTやIoTプラットフォームって何?まずはそこから勉強したい。
という方は、先に下記の前回記事をご覧ください。
改めて、今回は以下の3つのアイテムを使います。
1.DHT11(温湿度センサー)
2.ESP32(Wi-FiとBluetoothが具備されているマイコンボード)
3.ThingsBoard(オープンソースのIoTプラットフォーム)
配線
では、まずはセンサーとマイコンの配線から見ていきましょう!
今回は手抜きで申し訳ありませんが、配線は下記記事とYouTube動画を参考にしました。
※こちらの画像は上記記事から拝借させていただきました。
記事内のマイコンはArduino Unoですが、DATAケーブルはこの記事と同じくESP32のD2に接続します。ただ、動画ではD4につなぐように言っていますが、こちらはESP8266というESP32の一世代前のボードでの話で、今回使用するESP32とはピン配置も異なりますのでご注意ください。
一方で、VDDとDATAの間につなぐプルアップ抵抗は、記事内の4.7kΩではなく、動画の方の10kΩを採用しました。
ESP32 | DHT11 |
---|---|
3.3V | VDD※ |
D2 | DATA※ |
-- | NC |
GND | GND |
※10kΩの抵抗を挟む
わかりにくいかもしれませんが、こちらの写真の通りに配線してください。
ThingsBoard Cloud
本記事でThingsBoardの登録方法まで説明してしまうととんでもない長さになってしまいますので、登録方法については他の方の記事をご参考にされてください。
以下に、トップページのリンクだけ貼り付けておきます。
ThingsBoardは上記の通りいくつかの種類がありますが、今回は、ThingsBoardの中でもCloudを使ってIoTを実現させます。
デバイスグループの登録
では、ThingsBoard Cloudに登録した前提で話を進めます。
ログインするとまずはこちらの画面が現れます。Closeボタンをクリックして次に進みます。
Device groupsをクリックします。
最初にログインした際に自動で生成されたデバイスグループが登録されています。
新たなデバイスグループを今回用に追加したいため、右上の「+」をクリックします。
Entity group detailsのNameに任意の名前を入力します。
Next: Share entity groupをクリックします。
Share entity groupにはチェックを付けないで、Addをクリックします。
デバイスグループが追加されました。
デバイスの登録
面倒ですが、デバイスグループを登録したら次はデバイスの登録をする必要があります。
先程追加したデバイスグループの行でダブルクリックします。
できたばかりのデバイスグループですので、まだデバイスが登録されておらず、No devices foundと表示されています。
デバイスを追加したいので、右上の「+」をクリックします。
Device detailsが表示されます。
Nameに任意の名前を入れます。
※実際はESP32を使っていますが、どのような不具合が発生するか不安だったため、動画内の名称と同じにしました。
Next: Credentialsをクリックします。
Credentials typeはデフォルトのAccess tokenのままとします。
クリックするとプルダウンで他のタイプも選べることがわかります。
Access tokenに任意の名前を入力します。
※実際はESP32を使っていますが、どのような不具合が発生するか不安だったため、動画内の名称と同じにしました。
Addをクリックします。
※私の場合はこのようなエラーが出ましたが、何度も試したらちゃんと追加できました。
デバイスが登録されました。
トークンへのアクセスキーを知りたいため、右端の「・・・」をクリックします。
Manage credentialsをクリックします。
Access tokenのところにアクセスキーが表示されます。
この文字列は後ほどのソースコード内で使用しますのでメモするなりコピーしておくなりして保管しておいてください。
ThingsBoard Cloud内での下準備は以上です。
ソースコード
先程の配線のところでもご紹介しましたが、今回は下記動画に本当に助けられました。
それだけでなく、動画内で紹介しているソースコードまで無料で公開してくれています。
動画内の概要欄にGitHubのリンクが貼られていますので、そこからダウンロードして大いに活用させていただきましょう!
CodeのDownload ZIPからダウンロード&フォルダを展開し、スケッチ(ino)ファイルを開いてください。
すると、このようなソースコードが表示されます。
当然ですが、そのままコンパイルしてもArduino IDEに必要なライブラリーが入っていなければエラーになります。
ライブラリー
ということで、先程のソースコードを活用するために、次はライブラリーをインクルードします。
スケッチ > ライブラリーをインクルード > ライブラリーを管理 >`ライブラリマネージャ
を開きます。
まずは、下記3つのライブラリーをインクルードしてください。
・PubSubClient by Nick O'Leary
・Adafruit Unified Sensor
・DHT sensor library by Adafruit
次に、下記ThingsBoardのライブラリーをインクルードします。
・ThingsBoard by ThingsBoard Team
この時に、下記3つも一緒にインクルードするか聞いてきますので、Install allを選んでください。
・ArduinoHttpClient
・TBPubSubClient
・ArduinoJason
無事インクルードされました。
続いて、ESP8266のWi-Fi関係もインクルードします。
先程同様、まとめてインストールするか聞かれます。
インクルードしてもデメリットは無いのでInstall allしましょう。
こちらもインクルード完了です。
ただ、ここまでやっても<ESP8266WiFi.h>のライブラリーでコンパイルエラーになります。
この解決方法はネット上にもいろいろ上がっていますが、ちょっと待てよと。
そもそもESP32を使おうとしているわけです。
ですので、いくら動画の通りに進めているとはいえ、このESP8266に関するエラーを解決しても、結局はESP32を使う時に問題が発生する可能性が高いというごく当たり前のことに気づきました。
ということで、ここからは、ESP32用にソースコードを多少いじっていきます。
ボードマネージャにESP32を追加する
と、その前に、Arduino IDEでESP32を使えるようにしておきましょう。
Arduino IDEのメニューバーから
ファイル > 環境設定
で、環境設定の画面を開きます。
「追加のボードマネージャのURL:」に下記URLを入れ、OKをクリックします。
https://dl.espressif.com/dl/package_esp32_index.json
続いて、
ツール > ボード > ボードマネージャ
から
・esp32 by Espressif Systems
をインクルードします。
これで下記のように、ツール > ボードから、ESP32を使えるようになりました。
ソースコードをESP32用にカスタマイズ
ESP32を使う準備が整ったところで、ようやくソースコードをいじります。
- 不要な部分のコメント化(ESP8266特有の部分)
- 必要な部分の追加(ESP32でWi-Fiを使うために必要な部分)
まず、コメント化して無効にするのは下記の部分です。
//#include <ESP8266WiFi.h>
//#define WIFI_AP "raspberry"
//#define WIFI_PASSWORD "samue1202"
次に、代わりに追加するのは以下の部分です。
#include <WiFi.h>
const char* ssid = "******"; //Your SSID
const char* password = "******"; //Your Password
#define TOKEN "******" //Your Access token
で、SSIDとPasswordの***の部分には、ご自身がお使いのWi-Fi環境を設定してください。
ちなみに、私は別の場所へ持って行って見せられるよう、スマホでテザリングする時のIDとパスワードを入れました。
また、Access tokenの***には、ThingsBorad Cloudのデバイス登録時に発行されたアクセスキーをコピペしてそのまま入れてください。
具体的には下記の通りとなります。
ただ、Wi-Fiの定義のところをESP8266用からESP32用に変えましたので、本文のところのもう2ヶ所も変更します。
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
ソースコードの本文の方にある上記2ヶ所を下記の通り変更してください。
WiFi.begin(ssid, password);
具体的な場所は、以下の2ヶ所となります。
以上でソースコードのカスタマイズは終わりました。
最終的には、最初の定義の部分は以上のようにスッキリさせました。
以下に、実際のソースコードを共有します。
#include "DHT.h"
#include <ThingsBoard.h>
#include <WiFi.h>
//Wi-Fi
const char* ssid = "******"; //Your SSID
const char* password = "******"; //Your Password
// TOKEN
#define TOKEN "******" //Your Access token
// DHT
#define DHTPIN 2
#define DHTTYPE DHT11
char thingsboardServer[] = "thingsboard.cloud";
WiFiClient wifiClient;
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);
ThingsBoard tb(wifiClient);
int status = WL_IDLE_STATUS;
unsigned long lastSend;
void setup()
{
Serial.begin(115200);
dht.begin();
delay(10);
InitWiFi();
lastSend = 0;
}
void loop()
{
if ( !tb.connected() ) {
reconnect();
}
if ( millis() - lastSend > 1000 ) { // Update and send only after 1 seconds
getAndSendTemperatureAndHumidityData();
lastSend = millis();
}
tb.loop();
}
void getAndSendTemperatureAndHumidityData()
{
Serial.println("Collecting temperature data.");
// Reading temperature or humidity takes about 250 milliseconds!
float humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
float temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println("Sending data to ThingsBoard:");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C ");
tb.sendTelemetryFloat("temperature", temperature);
tb.sendTelemetryFloat("humidity", humidity);
}
void InitWiFi()
{
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() {
// Loop until we're reconnected
while (!tb.connected()) {
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
Serial.print("Connecting to ThingsBoard node ...");
if ( tb.connect(thingsboardServer, TOKEN) ) {
Serial.println( "[DONE]" );
} else {
Serial.print( "[FAILED]" );
Serial.println( " : retrying in 5 seconds]" );
// Wait 5 seconds before retrying
delay( 5000 );
}
}
}
ThingsBoard Cloudでセンサーの値を確認する
ここまでできたらESP32をPCへつなぎ、Arduino IDEのシリアルモニタで値をモニタリングしながら、ThingsBoard Cloudでも同じ値が見られるかを確認してみましょう!
先程登録したデバイスをダブルクリックすると、Device detailsが表示されます。
Letest telemetryをクリックします。
データが取れていないとこのようにNo telementry foundと表示されます。
ここでESP32をPCとつなぎ、Arduino IDEのシリアルモニタを開いて、同時にLetest telementryで同じ値が表示されるかどうか確認します。
配線や先程修正したソースコードが間違っていなければ、このようにしっかり同期するはずです。
では、もう少し細かく見てみましょう!
Last update timeのhumidityのチェックボックスにチェックを入れます。
すると、Show on widgetが表示されるので、クリックします。
Timeseries tableが表示されました。
時間と共に湿度が更新されているのがわかります。
では、別の表示形式にも切り替えてみましょう。
Current bundleの横のCards Systemとなっている部分をクリックします。
何やらいろいろと出てきました。
Analogue gaugesに変えてみましょう。
昔ながらのアナログのメーターで表示されました。
同様に温度の方も確認して見ましょう。
温度もバッチリ同期されていますね。
他にもいろいろ見られますが、これ以上は長くなってしまうので割愛します。
ここまでできていれば、温湿度計とESP32とThingsBoard Cloudの連携はできていますので、あとはご自身でいろいろ触ってみてください。
参考までに、下記は私が実際にテストした時の動画です。
※湿度90度超え→90%超えの間違い
まとめ
いかがでしたでしょうか?
Arduino IDEへのライブラリーのインクルードやESP32用にソースコードを修正する部分はやや手間ですが、他は思いのほかカンタンだと思われた方も少なくないのではないでしょうか?
私もThingsBoard Cloudについては使い始めたばかりでまだわからない部分も多いです。
今後も案件をこなしながら継続して勉強し、守秘義務に反しない範囲でこちらでも成果をシェアしていきたいと思います。
では、次回の記事をお楽しみに!
Discussion