kouのアイコン画像
kou 2021年02月28日作成 (2021年12月22日更新) © MIT
製作品 製作品 閲覧数 8352
kou 2021年02月28日作成 (2021年12月22日更新) © MIT 製作品 製作品 閲覧数 8352

Arduinoを使ってスマートな体温計を作ってみた

Arduinoを使ってスマートな体温計を作ってみた

概要

Arduinoと赤外線温度センサーで安価な非接触体温計を作りました
測定温度を自動的にPCに記録するので、毎日手軽に体調管理できます

きっかけ

Covid-19の感染拡大により,毎朝学校に入るために家で検温した結果を報告しなくてはいけなったのですが,これが非常に面倒くさい!
朝の忙しい時間に,もっと手軽に体温を測定できればもっと便利になるのではないかと思い,これを製作しました。

製作目標

  • 安価な部品で作れるコスパに優れたデバイス
    普通に非接触の体温計を買うと高い!
  • 手をかざすだけで体温が測れる
    毎朝手軽にできるように!

イメージ画像

開発環境

  • MacBookPro 2020 (M1)
  • Node.js (v15.10.0)
  • Arduino IDE
  • Visual Studio Code

部品

※市販の温度計が3000円ちょいだから少し安いかな?

接続図

今回使用したモジュールに搭載されているセンサは、MLX90614というものでi2cによる値を読み出すことができます。
Arduino UNOには、i2cで使うSDAとSCLというピンがアナログのA5,A4と共通なのでそこに接続します。
注意点として、接続するときに10kΩほどのプルアップ抵抗を挟んでください。

温度センサ

接続図

ソースコード

温度センサを制御するにあたって便利なライブラリがすでに公開されていたので、そちらを使用させていただきました。
導入する際は、Arduino IDEの[ツール]-[ライブラリを管理]からMLX90614と検索してAdafruit MLX90614 Libraryという名前のライブラリを選択すれば大丈夫です。

また、今回は温度をシリアル通信を用いてPCへ測定した温度を送信し、PCで記録するためにPC側のソフトウェアも作成しました。PC側のソフトの詳細はGitHubに載せたので、そちらを御覧ください。

ハードウェア側

/* Smart Termometer */ #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); #define N 5 //測定する回数 #define STATUS A0 void setup() { mlx.begin(); Serial.begin(115200); pinMode(STATUS, OUTPUT); } void loop() { static float temp_bak = -1; static int count = 0; static float sum = 0; float temp = mlx.readObjectTempC(); if (count) { sum += temp; if (count > N) { digitalWrite(STATUS, LOW); Serial.println(sum / N); count = 0; sum = 0; } else { count++; } } else if (temp_bak != -1 && temp - temp_bak > 2.0) { digitalWrite(STATUS, HIGH); Serial.println("Found"); count++; } temp_bak = temp; delay(500); }

PC側

'use strict'; require('date-utils'); const SerialPort = require('serialport'); const player = require('node-wav-player'); const { Readline } = SerialPort.parsers; const fs = require('fs'); //シリアルポートは適宜変更してください const port = new SerialPort('/dev/cu.usbserial-1120', { baudRate: 115200 }); const parser = port.pipe(new Readline({ delimiter: '\n' })); function sound(path) { player.play({ path: './sound/' + path }) } let temp_bak = -1; let count = 0; let sum = 0; let N = 5; parser.on('data', data => { data = data.replace('\r', ''); switch (data) { case "Found": console.log("そのままお待ち下さい..."); sound("wait.mp3"); break; default: console.log(data + "℃"); sound("ok.mp3"); const now = new Date(); const timeStamp = now.toFormat('DDD MMM DD YYYY HH24:MI:SS'); fs.appendFile('data.csv', timeStamp + "," + data + "℃\n", (err) => { if (err) throw err; console.log('data.csvに追記されました'); }); } });

工夫したところ

  • 手がかざされたことを温度センサのみで検知
    部品点数を減らすため、手をかざした際の急激な変化を検知して体温を自動測定します

機能

  • 体温測定
    デバイスに手を3秒程度かざすと体温を測定できます
  • 体温を記録
    毎日の体温をPC側でCSVとして記録できます
  • 動作中はLEDとサウンドで通知
    手をかざすと測定中はLEDが点灯するとともに、PC側でサウンドが再生されるのでいつまで手をかざすかが分かりやすい

外観

中身の配線
外観

試作品なのでブレッドボードで作り、外観はダンボールを切って作りました。
外観はちょっとひどいですが、動作はしっかりとしています。

デモ

ここに動画が表示されます

測定値を見てみると、やはり手の平だと少し体温と差があるように感じますね。
+2度ぐらい補正をかけてあげると良い感じかな?

今後の改良

  • ESP32などを使って単体でクラウドへ体温をアップする
  • ハードウェアをプラスチックケースで作り直す
  • ユニバーサル基板にATMEGA328PUとかで小型化する
kouのアイコン画像
電子工作とアプリ開発をしている大学生です. マイコンはArduinoやSTM32など使っていて,高校の部活ではRCJなど大会向けのロボット製作などしていました.
  • kou さんが 2021/02/28 に 編集 をしました。 (メッセージ: 初版)
  • Opening
    Skのアイコン画像 Sk 2021/05/24

    はじめましてよろしくお願いします。非接触型体温計を作成しようとしています。色々教えていただけませんか?

    0 件の返信が折りたたまれています
  • kou さんが 2021/12/22 に 編集 をしました。
ログインしてコメントを投稿する