音声アラート付き自動体温測定システム
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| SDカードモジュール | 1 |
| SDカード(8GB) | 1 |
| アンプ PAM8403 とスピーカー | 1 |
| 超音波センサー HC-SR04 | 1 |
| OLED 128x64 | 1 |
| ブレッドボード用ジャンパーワイヤー | 1式 |
| 赤外線温度計 GY-906 (MLX90614) | 1 |
※ 赤外線温度計 GY-906 は需要が高いため、入手困難な場合があります。
プロジェクト概要
新型コロナウイルスの世界的流行に伴い、非接触での体温測定ニーズが高まっています。本プロジェクトは、超音波センサーで人の接近を検知し、赤外線温度計で体温を測定、OLEDディスプレイに表示するとともに、SDカードから音声ファイルを再生して測定結果を音声で通知する自動体温測定システムです。
ステップ1: 回路設計

システムの動作フローは以下の通りです:
- 超音波センサー(HC-SR04)が約10cm以内の障害物(手など)を検知
- スピーカーから「体温測定システムへようこそ。センサーの約2cm前に手または額をかざしてください」と音声案内
- 赤外線温度計(GY-906 / MLX90614)で体温を測定
- 測定結果をOLEDに表示し、音声で通知(例:「あなたの体温は36.5度です。正常な体温です。健康を維持してください」)
音声ファイルは8bit、モノラル、11025HzのWAV形式でSDカードに保存します。音声合成にはオンライン変換ツール(audio.online-convert.com)を利用しました。
ステップ2: フレーム製作と配線





フレームは厚さ3mmのMDF材をレーザーカッターで切り出し、接着剤で組み立てます。レーザーカッターがない場合は段ボールで代用可能です。設計ファイルはGoogleドライブで共有しています(リンクは元記事参照)。
全パーツをフレームに取り付け、回路図に従って配線します。
ステップ3: プログラムとダウンロード

Arduinoスケッチの主な処理:
- 超音波センサーで人(障害物)を検知
- ウェルカム音声を再生、センサー前2cmへの手/額の位置を案内
- 温度測定、結果を音声とOLEDで出力
コードダウンロード: https://bit.ly/2Za1mjZ
音声ファイルダウンロード: https://bit.ly/3aZpGWJ
ステップ4: 動作テスト


電源を入れて動作確認を行います。非接触で体温を測定し、音声で結果を知らせるシステムが完成しました。
ソースコード
// www.youtube.com/c/engineer2you
#include <SD.h>
#define SD_ChipSelectPin 10
#include <TMRpcm.h>
#include <Adafruit_MLX90614.h>
// OLED用
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
SSD1306AsciiAvrI2c oled;
TMRpcm tmrpcm;
double temp;
const int trigPin = 17;
const int echoPin = 16;
long duration;
int distance;
int step1_judge = 0;
void setup() {
// OLED初期化
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif
oled.setFont(Adafruit5x7);
// オーディオ初期化
tmrpcm.speakerPin = 9;
Serial.begin(9600);
// SDカード初期化
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
oled.clear(); oled.set1X(); oled.println("SD card fail");
return;
} else {
Serial.println("SD ok");
oled.clear(); oled.println("SD card ok");
}
delay(1000);
tmrpcm.play("m_wel.wav");
tmrpcm.volume(1);
oled.clear(); oled.set2X(); oled.println(""); oled.println(" Welcome");
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
mlx.begin();
delay(10000);
}
void loop() {
// 超音波距離測定
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 23529);
distance = duration * 0.034 / 2;
if ((distance < 10) && (distance > 0)) step1_judge++;
else step1_judge = 0;
if (step1_judge > 2) {
step1_judge = 0;
tmrpcm.play("m_wel.wav");
delay(10000);
temp = mlx.readObjectTempC() + 1.2; // 補正値
oled.clear(); oled.set2X(); oled.println(""); oled.print(" "); oled.print(temp, 1); oled.println("dgC");
tmrpcm.play("m_now.wav");
delay(1380);
if (temp < 20) {
tmrpcm.play("m_b20.wav"); delay(1700);
tmrpcm.play("m_nman.wav"); delay(2270);
} else if (temp > 50) {
tmrpcm.play("m_over50.wav"); delay(1740);
tmrpcm.play("m_nman.wav"); delay(2270);
} else {
speak_out(temp);
delay(1500);
if ((temp > 36) && (temp < 37)) { tmrpcm.play("m_normal.wav"); delay(3268); }
if (temp > 37) { tmrpcm.play("m_fever.wav"); delay(2728); }
}
}
delay(300);
}
void speak_out(double temperature_result) {
temperature_result = round(temperature_result * 10);
int temp0 = (int)temperature_result;
int temp1 = temp0 / 10;
int temp2 = temp1 % 10;
int temp3 = temp0 % 10;
if (temp1 < 20) { tmrpcm.play("m_below20.wav"); delay(1631); }
if (temp1 > 50) { tmrpcm.play("m_over50.wav"); delay(1747); }
if (temp1 >= 20 && temp1 <= 29) { tmrpcm.play("m_twenty.wav"); delay(600); }
if (temp1 >= 30 && temp1 <= 39) { tmrpcm.play("m_thirty.wav"); delay(500); }
if (temp1 >= 40 && temp1 <= 49) { tmrpcm.play("m_fourty.wav"); delay(691); }
if (temp2 != 0) speak_num(temp2);
if (temp1 >= 20 && temp1 <= 50) { tmrpcm.play("m_point.wav"); delay(319); speak_num(temp3); }
tmrpcm.play("m_dgc.wav"); delay(853);
}
void speak_num(int number) {
switch (number) {
case 1: tmrpcm.play("m_one.wav"); delay(453); break;
case 2: tmrpcm.play("m_two.wav"); delay(499); break;
case 3: tmrpcm.play("m_three.wav"); delay(406); break;
case 4: tmrpcm.play("m_four.wav"); delay(401); break;
case 5: tmrpcm.play("m_five.wav"); delay(354); break;
case 6: tmrpcm.play("m_six.wav"); delay(401); break;
case 7: tmrpcm.play("m_seven.wav"); delay(633); break;
case 8: tmrpcm.play("m_eight.wav"); delay(360); break;
case 9: tmrpcm.play("m_nine.wav"); delay(580); break;
case 0: tmrpcm.play("m_zero.wav"); delay(610); break;
}
}
回路図

製造プロセス
- QR・RFID・体温検知統合アクセス制御システム(Raspberry Piベース)
- Raspberry PiでMaxim 1-WireセンサーとDS2482 I2Cブリッジを用いた温度測定
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- EzTempでRaspberry Pi上の温度・湿度をシームレスに監視
- DIY自家醸造温度制御:Arduinoで監視・調節
- 実験室・科学実験向け精密熱電対測定とロギング
- Raspberry PiとDS18B20でマルチセンサー温度・光監視システムを構築
- Arduinoで温湿度ロガーを作る – DHT11とEthernetシールドでSDカード記録
- 計測工具の種類・用途・ベストプラクティスを徹底解説
- マニュアル・オートマチックトランスミッションの動力伝達メカニズム
- 複合構造体および接着ボンドライン内部の精密温度モニタリング