株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

Arduino IoT 感染症対策のIoT技術

感染症対策のためのIoT技術(その2)非接触温度センサーをインターネットへ接続する

投稿日:2021年1月21日 更新日:

前回の続きです。前回は非接触温度センサーでの体温測定について書きました。今回はその非接触温度センサーをインターネットへ接続してクラウドに体温データを蓄積して可視化すという内容で書きます。その上で実務的な体温管理のシステム構築(ソリューション)としてどのような課題があるか等について書きます。

非接触温度センサー側は以下のような構成です。マイコンモジュールは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を準備するという方法もあります。

これらに関しては唯一無二の正解があるということではなく、個別の案件においてシステムの要求仕様をどのように実現していくか検討していくことになります。

今回は以上です。

AdSense

AdSense

-Arduino, IoT, 感染症対策のIoT技術

執筆者:

関連記事

Arduino UnoでSPI通信(その2)温度センサADT7310

Arduino UnoでSPI通信の2回目です。前回のArduino UnoでSPI通信(その1)Arduino2台で通信ではArduino Uno2台でSPI通信を確認しました。今回は実際のデバイス …

Arduino CC3000 WiFi シールドでHTTP POST

Arduino CC3000 WiFi シールドでHTTP POST通信を試してみます。以下はArduino UNOに接続した状態です。 Arduino CC3000 WiFi シールドの概要、導入に …

Remote.itを利用したWindows PCへのリモートアクセス

Remote.itを利用してWindows PCへのリモートアクセスを設定して実際にリモートデスクトップで接続してみました。Remote.itではいろいろなリモートアクセスのサービスが提供されています …

Arduino Ethernetシールド(旧製品)を使ってみた

Arduino Ethernetシールド(旧製品)を使ってみました。Arduinoと接続した状態が以下です。おそらく2~3年前ぐらいに買ったものだと思います。どうも自宅以外で有線LANが気軽に使える場 …

Raspberry PiでIoT(MQTTで遠隔操作編 その1)MQTTでの通信

Raspberry PiでIoTのMQTTで遠隔操作編のシリーズを始めます。実際に動作させてみるということを重点として進めます。ここでの遠隔操作は2台のRaspberry Pi間でインターネット経由の …