kou が 2021年02月28日20時45分25秒 に編集
初版
タイトルの変更
Arduinoを使ってスマートな体温計を作ってみた
タグの変更
秋葉原2021
COVID-19
体温計
Arduino
非接触センサー
メイン画像の変更
本文の変更
# 概要 Arduinoと赤外線温度センサーで安価な非接触体温計を作りました 測定温度を自動的にPCに記録するので、毎日手軽に体調管理できます # きっかけ Covid-19の感染拡大により,毎朝学校に入るために家で検温した結果を報告しなくてはいけなったのですが,これが非常に面倒くさい! 朝の忙しい時間に,もっと手軽に体温を測定できればもっと便利になるのではないかと思い,これを製作しました。 # 製作目標 - 安価な部品で作れる**コスパに優れた**デバイス 普通に非接触の体温計を買うと高い! - **手をかざすだけ**で体温が測れる 毎朝手軽にできるように!  # 開発環境 - MacBookPro 2020 (M1) - Node.js (v15.10.0) - Arduino IDE - Visual Studio Code # 部品 - Arduino UNO互換機 - ¥500 - [赤外線温度センサーモジュール](https://www.aitendo.com/product/11520) - ¥2145 - ブレッドボード - ¥100 ジャンパワイヤ - ¥60 - LED(赤) - ¥10 合計金額: ¥2815 ※市販の温度計が3000円ちょいだから少し安いかな? # 接続図 今回使用したモジュールに搭載されているセンサは、MLX90614というものでi2cによる値を読み出すことができます。 Arduino UNOには、i2cで使うSDAとSCLというピンがアナログのA5,A4と共通なのでそこに接続します。 注意点として、接続するときに**10kΩほどのプルアップ抵抗**を挟んでください。   # ソースコード 温度センサを制御するにあたって便利なライブラリがすでに公開されていたので、そちらを使用させていただきました。 導入する際は、Arduino IDEの[ツール]-[ライブラリを管理]からMLX90614と検索して*Adafruit MLX90614 Library*という名前のライブラリを選択すれば大丈夫です。 また、今回は温度をシリアル通信を用いてPCへ測定した温度を送信し、PCで記録するためにPC側のソフトウェアも作成しました。PC側のソフトの詳細は[GitHub](https://github.com/kouichihirachi/SmartThermometer)に載せたので、そちらを御覧ください。 ```arduino:ハードウェア側 /* 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); } ``` ```javascript: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側でサウンドが再生されるのでいつまで手をかざすかが分かりやすい # 外観   試作品なのでブレッドボードで作り、外観はダンボールを切って作りました。 外観はちょっとひどいですが、動作はしっかりとしています。 # デモ @[youtube](https://www.youtube.com/watch?v=CXSyCQw1Nyg) 測定値を見てみると、やはり手の平だと少し体温と差があるように感じますね。 +2度ぐらい補正をかけてあげると良い感じかな? # 今後の改良 - ESP32などを使って単体でクラウドへ体温をアップする - ハードウェアをプラスチックケースで作り直す - ユニバーサル基板にATMEGA328PUとかで小型化する