前回の続きです。前回は非接触温度センサーでの体温測定について書きました。今回はその非接触温度センサーをインターネットへ接続してクラウドに体温データを蓄積して可視化すという内容で書きます。その上で実務的な体温管理のシステム構築(ソリューション)としてどのような課題があるか等について書きます。
非接触温度センサー側は以下のような構成です。マイコンモジュールはM5StickCを使っています。Wifiからのインターネット接続でクラウドへデータを送信します。M5StickCと非接触温度センサーはGroveコネクタで接続します。写真はコネクタをはずした状態です。
クラウド側で以下のようにグラフを表示します。
以下のような順番で書きます。
クラウドのAmbientを準備する
M5StickCに体温測定とクラウド送信のプログラムを書き込む
体温を測定してクラウドへ送信する
クラウド上のグラフを確認する
システム構築(ソリューション)を考える
Ambientを準備する
ここではAmbientを使います。データ(今回の場合は体温データ)の蓄積と可視化が出来ます。無料で始められて、プログラミング用のライブラリも充実しているので私はよく利用しています。利用方法等詳細が必要な場合はAmbientのドキュメントを参照して下さい。ここでは要点だけ書きます。
ユーザ登録が完了していてログイン後にチャンネル一覧を表示します。
「チャンネルを作る」をクリックしてチャンネルを作成します。正常に作成出来るとそのチャンネルが一覧に表示されます。ここで表示されるチャンネルIDとライトキーがデータ送信の際に必要になってきます。このチャンネルが出来ればAmbientでの準備はひとまず完了です。
M5StickCにプログラムを書き込む
今回利用するM5StickCは小型ですが、wifiとbluetoothが利用出来て、LCDとバッテリーも内蔵しているので今回のような実験や仕様検討のためのプロトタイピングに最適だと思います。
開発にはArduino IDEやVisual Studio Codeなどが利用出来ます。
今回はArduino IDEを使いました。Ambientへ接続するためのライブラリは、Arduino IDEのメニュー => ツール => ライブラリを管理… から検索してインストール出来ます。
以下のようなプログラム(Arduino的にはスケッチ)を作成して書き込みました。これですぐに使えるというものではなく、テストプログラム、サンプルプログラムのレベルですのでご了承ください。
処理としては常に対象温度と周辺温度を測定しながら周辺温度と推定体温として表示します。ボタンを押すとその時点の体温と推定した値をAmbientへ送信します。問題なくクラウドに送信が完了すると Send Ok と1秒間表示します。
#include <M5StickC.h> #include <Wire.h> #include <Adafruit_MLX90614.h> #include "Ambient.h" //ボタン関連 #define BTN_A_PIN 37 #define BTN_ON LOW #define BTN_OFF HIGH uint8_t btn_a = BTN_OFF; //MLX90614ライブラリ Adafruit_MLX90614 mlx = Adafruit_MLX90614(); //WifiとAmbientの定義 WiFiClient client; Ambient ambient; //Wifi接続情報 const char* ssid = "yourssid"; const char* password = "yourpassword"; //Ambientのチャンネル情報 unsigned int channelId = 9999; // 作成したAmbientのチャネルID const char* writeKey = "yourkey"; // ライトキー void setup() { //各初期化関連 M5.begin(); pinMode(BTN_A_PIN, INPUT_PULLUP); Serial.begin(115200); mlx.begin(); //画面初期化 M5.Lcd.setRotation(3); M5.Lcd.setTextColor(WHITE); M5.Lcd.setTextSize(2); //Wifi接続 WiFi.begin(ssid, password); // Wi-Fi APに接続 ----A while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち delay(500); Serial.print("."); } Serial.print("WiFi connected\r\nIP address: "); Serial.println(WiFi.localIP()); //Ambient開始 ambient.begin(channelId, writeKey, &client); } uint16_t result; float temperature; void loop() { float tempAmbient = mlx.readAmbientTempC(); //周辺温度 float tempObject = mlx.readObjectTempC(); //対象(体表面)温度 String sval; //周辺温度表示 M5.Lcd.fillRect(0,2,120,100,BLACK); M5.Lcd.setCursor(0, 2); sval = String(tempAmbient); M5.Lcd.print("ambi:" + sval); //体表面温度と想定して推定体温 M5.Lcd.fillRect(0,27,120,100,BLACK); M5.Lcd.setCursor(0, 27); sval = String(tempObject+2.7); M5.Lcd.print("body:" + sval); //ボタンが押されていたらAmbientへ送信する btn_a = digitalRead(BTN_A_PIN); if(btn_a == BTN_ON){ if(WiFi.status() == WL_CONNECTED) { //送信 ambient.set(1, tempObject+2.7); ambient.send(); //正常終了表示 M5.Lcd.fillRect(0,50,120,100,BLACK); M5.Lcd.setCursor(0, 50); M5.Lcd.print("Send Ok"); delay(1000);//1秒間表示してクリア M5.Lcd.print(" "); } } delay(100); M5.update(); }
実際に体温を測定してデータを送信してグラフを見る
例えば以下のように測定出来ました。実際に体温測定を試してみて思ったのは自分で測定すると体表面までの距離がバラバラになるので、距離センサー等で距離を一定にして測定しないと実際には使えないということです。
数秒おきに測定してデータを送信しましたが、やはりばらつきが大きいでしょうか。ただ確かにクラウドに蓄積は出来ました。
システム構築(ソリューション)を考える
ここまでの内容を踏まえて例えば社内システムとして出勤時に体温を測定して管理するシステムを考えます。その場合にどのような課題があってどのようなソリューションがあるか考えてみます。
体温の精度について
前回書いた通りですが、非接触温度センサーでは体表面温度を測定するのでこの値からの体温を推定するための仕様が必要です。
測定時の精度について
何回か自分で測定したのですが、体表面までの距離を一定するのは自分では無理と感じました。距離センサー等を活用して一定の条件で測定出来るようにする必要があります。
本人確認(認証)について
今回は取り上げていないですが、体温管理システムという意味では本人のデータかどうかの認証が必要になります。指紋認証や顔認証が考えられると思いますが、Raspberry Piを利用すれば画面からのユーザ名、パスワードでの認証等も可能です。
センサー類やマイコンモジュールの扱いやすさ
今回はブレッドボードにセンサーを接続してそのまま使っています。もし、実際にシステムとして運用するのであれば接続がはずれたりしないように基板やケースが必要です。
どういったクラウドを利用してどのようにデータを蓄積するか
どのように蓄積したデータを管理するのかで、いろいろなソリューション(仕様とか選択肢とかです)があると思いますが、今回のような比較的簡単と思われるAmbientからAWS、Azureもありますし、自前のサーバがあれば自前のAPIやDBを準備するという方法もあります。
これらに関しては唯一無二の正解があるということではなく、個別の案件においてシステムの要求仕様をどのように実現していくか検討していくことになります。
今回は以上です。