1.はじめに
弊社から発売中の「おんどとりease (イーズ) 」ことTR32Bは、置かれた場所の温度と湿度を測定して記録する製品です。弊社「おんどとり」シリーズの中でも最もシンプルな温度湿度ロガーですが、本体の液晶画面 (LCD) はもちろん、スマート端末でも弊社の無料クラウドでも温湿度の値が確認できる、非常に便利な機種です。
今回は、スマホやクラウド以外で、TR32Bのデータを表示する方法をご紹介します。
具体的には、TR32BのBluetooth Low Energyの電波をM5StickC Plus (以下、M5Stickと記載します) というマイコンボードで受信し、LCDに測定値を表示させてみました。
TR32Bから独自の機器で温湿度を取得可能になることで、例えば下記のような応用が考えられます。
・複数のTR32Bのデータを大型のLCDにまとめて表示する。
・あらかじめ設定した上下限値を超えた場合に、温湿度の警報をLineで通知する。
・取得した測定値をサーバに送信して独自のシステムと共有する。
アイディア次第でいくらでも可能性が広がりそうですね。
それでは、どうやって実現するかを以下で説明していきましょう。
2.動作概要
Bluetooth Low Energyでは、TR32Bのようなセンサ側はペリフェラルデバイス、ペリフェラルデバイスからデータを取得する側をセントラルデバイスと呼びます。スマホなどはセントラルデバイスの代表例ですが、今回はM5Stickでセントラルデバイスを作成します。
ペリフェラルデバイスは、[図1]のように常時自らの情報を載せたアドバタイジングパケットという信号を送信しています。
TR32Bのアドバタイジングパケットには温度と湿度の測定値データが含まれており、M5Stickはアドバタイジングパケットを受信し、その中の測定値を表示する動作をします。
3.必要な物
3-1. おんどとりease TR32B
TR32Bは温湿度を内部のメモリーに保存し、後からスマホアプリで変化を確認できる商品で、スマホアプリとはBluetooth Low Energyを使用して通信を行います。
3-2. M5StickC Plus
M5StickC Plusは親指程度のコンパクトなケースの中に、CPU、Bluetooth機能、カラーLCD、無線LAN機能などが搭載されているマイコンボードです。
2023年4月時点で3,542円で購入が可能です。
詳細は下記サイトを参照ください。
https://docs.m5stack.com/ja/core/m5stickc_plus
3-3. Arduino IDE
M5StickのプログラムはArduino IDEを使って作成します。
(Arduino IDEではプログラムのことをスケッチと呼ぶため、以後この記事の中でもプログラムをスケッチと記述します。)
Arduino IDEはスケッチを書くエディタ、スケッチをM5Stickに書き込むツール、シリアルモニタなどが含まれる総合開発環境(Integrated Development Environment)です。
Arduino IDEのインストールは下記を参照ください。
https://docs.m5stack.com/ja/quick_start/m5stickc_plus/arduino
インストール直後のArduino IDEのメニューは英語表示となっていますが、下記設定で日本語表示に変更できます。
メニューから[File]→[Preferences]を選択し、表示された設定画面の Language: の選択肢から[日本語]を選択して[OK]ボタンを押す。
以降の説明は全て 日本語表示として説明します。
その他「M5StickC plus Arduino」などで検索すると参考になる情報が得られると思います。
本記事を執筆時のArduino IDE の動作環境は下記となっています。
・Arduino IDE バージョン:2.0.4
・ボードマネージャ M5Stack バージョン:2.0.6
・Arduino IDEのメニューで右記を選択:[ツール]→[ボード]→[M5Stick-C-Plus]
・OS:Windows 11 Home
その他、PCとM5Stickを接続するUSBケーブルが必要です。M5StickはUSB-Cコネクタなので必要に応じて用意してください。
4.スケッチの説明
4-1.概要
Arduinoのスケッチは、setup() と loop() という2つの関数で構成されます。
setup() は、M5Stickの電源が入ってから最初に1回だけ実行され、loop() は、setup() 実行後に繰り返し実行されます。
今回作成するスケッチのフローチャートは[図2]となり、スケッチは[リスト1]を参照してください。
スケッチの中で「//」が記載されている場合、その行の「//」以降の文字はコメントとなります。
[リスト1]のコメントのカッコ内の数字は、フローチャートの数字の該当箇所を示しています。
スケッチを書き始める時はArduino IDEのメニューから、[ファイル]→[新規スケッチ] を選択すると中身の無い setup() と loop() が作成されるのでその中に書いていきます。
初心者の方でスケッチの動作が良くわからなくても、気にせずとりあえずは[リスト1]を真似し、アルファベットの大文字と小文字の違いに注意してスケッチを書いてみましょう。
リスト1
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
/*
TR32B から温湿度を Bluetooth Low Energy で取得してLCDに表示する
*/
#include <M5StickCPlus.h>
#include <BLEDevice.h>
#define CompanyID 0x0392 // T&D CompanyID
int scanTime = 4; //In seconds
BLEScan* pBLEScan;
void setup() {
Serial.begin(115200); //(1)シリアル通信初期設定
Serial.println("Scanning...");
M5.begin();
M5.Lcd.setRotation(3); //(2)LCD表示初期設定
M5.Lcd.setCursor(0,0,4); //(2)「Scanning...」の表示位置とフォントを指定する
M5.Lcd.print("Scanning..."); //(2)「Scanning...」を表示
BLEDevice::init(""); //(3)Bluetooth Low Energy初期設定
pBLEScan = BLEDevice::getScan(); //(3)BLEスキャンオブジェクト取得
pBLEScan->setActiveScan(false); //(3)パッシブスキャン
}
void loop() {
BLEScanResults foundDevices = pBLEScan->start(scanTime); //(4)アドバタイジングスキャン開始
uint8_t count = foundDevices.getCount(); // count=スキャンで見つけたデバイス数
for(int8_t i = 0 ; i < count ; i++){ // デバイスの個数の回数繰り返す
BLEAdvertisedDevice d = foundDevices.getDevice(i);
if(d.haveManufacturerData()){
//### (5)アドバタイジングパケットにManufacturerDataが含まれる場合以下実行 ###
std::string data = d.getManufacturerData(); // data=受信したManufacturerData
int manu = data[1] << 8 | data[0]; // manu=受信したCompany ID
if((manu == CompanyID)&&((data[4] == 0x46)||(data[4] == 0x47))){ //(6)TR32Bか判断
//### (6)ManufacturerDataがTR32Bならば以下実行 ###
float temp = data[11] << 8 | data[10]; //(7)ManufacturerData から温度データを取得する
temp = (temp - 1000) / 10; //(7)温度データをXX.X[℃]の値に変換する
float humi = data[13] << 8 | data[12]; //(7)ManufacturerData から湿度データを取得する
humi = (humi - 1000) / 10; //(7)温度データをXX.X[%]の値に変換する
Serial.printf("TR32B S/N:%02X%02X%02X%02X ",data[5],data[4],data[3],data[2]); //(8)
Serial.printf("temp:%3.1f humi:%3.0f \n",temp,humi); //(8)
M5.Lcd.fillRect(0,0,240,21,GREENYELLOW); //(9)タイトル部分を塗りつぶす
M5.Lcd.setTextColor(MAROON,GREENYELLOW);
M5.Lcd.setCursor(50,1,4); //(9)タイトルを表示する位置、フォントを指定する
M5.Lcd.print("TR32B "); //(9)タイトルを表示
M5.Lcd.setCursor(140,6,2);
M5.Lcd.printf("S/N %02X%02X%02X%02X",data[5],data[4],data[3],data[2]); //(9)シリアルNo表示
M5.Lcd.fillRect(0,21,240,6,BLACK);
M5.Lcd.setTextColor(WHITE,BLACK); //(9)温度の文字色を白、背景色を黒に指定する
M5.Lcd.setCursor(50,28,7); //(9)温度の表示位置とフォントNoを指定する
M5.Lcd.printf("%3.1f",temp); //(9)温度を表示
M5.Lcd.setCursor(168,48,4);
M5.Lcd.print("C"); //(9)温度単位を表示
M5.Lcd.setCursor(83,82,7); //(9)湿度の表示位置とフォントNoを指定する
M5.Lcd.printf("%3.0f",humi); //(9)湿度を表示
M5.Lcd.setCursor(168,102,4);
M5.Lcd.print("%"); //(9)湿度単位を表示
M5.Lcd.fillRect(0,133,240,3,GREENYELLOW);
delay(4000); // 1台分の温湿度は4秒間表示する為のWait
}
}
}
pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory
delay(100);
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
4-2. setup について
setup() では、M5StickでBluetoothやカラーLCDなどを動作させるための初期設定を行っています。
(1)の Serial.bigin(115200) は115200bpsでシリアル通信する為の初期設定です。シリアル通信はスケッチの動作確認の為に使用し、Arduino IDEのメニューから [ツール]→[シリアルモニタ]で開いた画面に動作状況を出力させることができます。
Serial.println("Scanning...") と記述するとシリアルモニタに「Scanning…」と表示されます。
スケッチの途中に上記の様な記述を追加しておくことで、スケッチが実行されている途中状況を確認することができる仕組みです。
(2)の M5.Lcd.xxxxxxx という部分はM5StickのLCD表示関連のコマンドで、LCDの初期設定と「Scanning...」と表示させる処理を行っています。
(3)の BLEDevice::init 、 BLEDevice::getScan() 、setActiveScan(false) はBluetoothの初期設定を行っています。
M5Stickはパッシブスキャンという設定でアドバタイジングパケットを受信する設定を行っています。
4-3. loop について
(4)の pBLEScan->start(scanTime) ではアドバタイジングパケットのパッシブスキャンを起動しています。
「scanTime」はスキャンをする時間を秒で指定し、今回は4秒と指定しています。
(5)以降の処理は、パッシブスキャンの結果、アドバタイジングパケットを受信した場合に受信した個数(台数)だけくり返します。
(5)では、アドバタイジングパケットに[表1]に示す ManufacturerData が含まれているか確認しています。ManufacturerDataが含まれている場合、更にその中身を確認し、「Company ID=0x0392(T&D)」、「機器シリアルNo.=TR32BのシリアルNo.」であればTR32Bのアドバタイジングパケットであると判断し、(6)以降を実行します。
参考情報
今回のスケッチは簡単な変更で弊社の『おんどとりTR4Aシリーズ』に対応させることも可能です。
例) TR41A の場合は下記のように変更します。
-
1. [表1]の[機器シリアルNo.]に従い、シリアルNo.の指定を変更する。
if((manu == CompanyID)&&((data[4] == 0x46)||(data[4] == 0x47))){
↓
if((manu == CompanyID)&&((data[4] == 0x40)||(data[4] == 0x41))){
-
2. 湿度表示を削除する。
[リスト1]の下記コメントの行からの4行を削除する。
「//(9)湿度の表示位置とフォントNoを指定する」
表1 : TR32BのManufacturerData
byte位置
|
形式
|
内容
|
|
0~1
|
Uint16
|
Company ID
|
0x0392→T&D
|
2~5
|
Uint32
|
機器シリアルNo.
|
TR32B: 0xXX46XXXX or 0xXX47XXXX
TR41A: 0xXX40XXXX or 0xXX41XXXX
TR42A: 0xXX42XXXX or 0xXX43XXXX
TR43A: 0xXX44XXXX or 0xXX45XXXX
|
6
|
Byte
|
制御コード
|
|
7
|
Byte
|
各種カウンタ
|
|
8
|
Byte
|
状態コード1
|
|
9
|
Byte
|
状態コード2
|
|
10~11
|
Uint16
|
測定値1
|
温度 測定値
|
12~13
|
Uint16
|
測定値2
|
湿度 測定値
|
14~15
|
Uint16
|
測定値3
|
|
16~17
|
Uint16
|
測定値4
|
|
18~19
|
Uint16
|
検査用
|
|
(7)では、ManufacturerData から温度と湿度の測定データを抜き出し、それぞれ温度は[temp]、湿度は[humi]という変数に格納しています。
ここまでの処理でTR32Bから温度、湿度データを取得できたことになります。
(8)では[temp]、[humi]の値を、(1)で設定したシリアル通信で出力しています。
(9)ではいよいよM5StickのカラーLCDに温度[temp]、湿度[humi]の値を表示します。
LCD上部のタイトルを塗りつぶしたり、フォントサイズを変更するなどしている為、複数行の処理になっていますが、ポイントは M5.Lcd.printf("%3.1f",temp) で温度表示、 M5.Lcd.printf("%3.0f",humi) で湿度表示を行っている箇所となります。
5.実行
5-1. コンパイルと書き込み
スケッチの入力が終わったら、PCとM5StickをUSBケーブルで接続し、Arduino IDEのメニューから [スケッチ]→[書き込み] を実行します。(又は上部の丸い右矢印(→)のスイッチを押下)
実行するとPCの画面右下に「スケッチをコンパイル中...」→「書き込み中」→「書き込み完了」と処理状態を示すメッセージが変化していきます。
「書き込み完了」と表示された場合、自動的にM5Stickはスケッチ通りの動作を開始します。
ただし、途中でエラーが発生した場合、「書き込み完了」に至らない場合もあります。
その場合、よくある例として[表2]の状況が考えられるので確認してみてください。
表2 : Arduino IDEエラー例
Arduino IDE
画面下部の出力の表示
|
対処内容
|
exit status 1 ・・・
|
プログラムの記述が間違っている。
「exit status 1」以下の記述やリストの色が変わっている箇所を確認。
メニューの [ツール]→[ボード] でM5Stick-C-Plus が選択されているか確認。
M5Stick-C-Plusが選択肢にない場合、下記を参考にM5Stackライブラリをインストールする。
https://docs.m5stack.com/en/quick_start/m5stickc_plus/arduino
|
Failed uploading: no upload port provided
|
M5StickがPCとUSBケーブルで接続されているか確認。
[ツール]→[ポート]: M5Stickが接続されているCOMポートの選択を確認。
|
5-2. 動作確認
M5Stickでスケッチが動作し始めると、M5StickのLCDに「Scanning…」と表示されます。
この状態で付近のTR32Bを見つけると、LCDは温湿度の表示に切り替わります。
TR32Bのアドバタイジングパケットの温湿度データは1分毎に更新されるため、M5Stickに表示される温湿度も約1分周期で更新されます。
また、複数のTR32Bを見つけた場合は、4秒毎に切り替えて表示していきます。
M5StickをPCに接続した状態で、Arduino IDEのメニューから [ツール]→[シリアルモニタ] を実行し、シリアルモニタ画面右上の設定を「115200 baud」に変更してみてください。
スケッチの中で Serial.print… と記述している内容がシリアルモニタに表示され、スケッチの実行状況を確認することができます。
6.最後に
いかがでしたか?皆さん、無事M5StickのLCDにTR32Bの測定値を表示させることができたでしょうか。
今回ご紹介したのは「測定値を表示する」というシンプルな内容ですが、冒頭でも書いたように、様々な応用が可能です。
この記事が「おんどとりease」TR32Bと共に、自由な発想で温湿度データを活用していただくきっかけとなれば嬉しいです。