工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

音声アラート付き自動体温測定システム

部品と材料

部品数量
Arduino UNO1
SDカードモジュール1
SDカード(8GB)1
アンプ PAM8403 とスピーカー1
超音波センサー HC-SR041
OLED 128x641
ブレッドボード用ジャンパーワイヤー1式
赤外線温度計 GY-906 (MLX90614)1

※ 赤外線温度計 GY-906 は需要が高いため、入手困難な場合があります。

プロジェクト概要

新型コロナウイルスの世界的流行に伴い、非接触での体温測定ニーズが高まっています。本プロジェクトは、超音波センサーで人の接近を検知し、赤外線温度計で体温を測定、OLEDディスプレイに表示するとともに、SDカードから音声ファイルを再生して測定結果を音声で通知する自動体温測定システムです。

ステップ1: 回路設計

音声アラート付き自動体温測定システム

システムの動作フローは以下の通りです:

  1. 超音波センサー(HC-SR04)が約10cm以内の障害物(手など)を検知
  2. スピーカーから「体温測定システムへようこそ。センサーの約2cm前に手または額をかざしてください」と音声案内
  3. 赤外線温度計(GY-906 / MLX90614)で体温を測定
  4. 測定結果をOLEDに表示し、音声で通知(例:「あなたの体温は36.5度です。正常な体温です。健康を維持してください」)

音声ファイルは8bit、モノラル、11025HzのWAV形式でSDカードに保存します。音声合成にはオンライン変換ツール(audio.online-convert.com)を利用しました。

ステップ2: フレーム製作と配線

音声アラート付き自動体温測定システム
音声アラート付き自動体温測定システム
音声アラート付き自動体温測定システム
音声アラート付き自動体温測定システム
音声アラート付き自動体温測定システム

フレームは厚さ3mmのMDF材をレーザーカッターで切り出し、接着剤で組み立てます。レーザーカッターがない場合は段ボールで代用可能です。設計ファイルはGoogleドライブで共有しています(リンクは元記事参照)。

全パーツをフレームに取り付け、回路図に従って配線します。

ステップ3: プログラムとダウンロード

音声アラート付き自動体温測定システム

Arduinoスケッチの主な処理:

  1. 超音波センサーで人(障害物)を検知
  2. ウェルカム音声を再生、センサー前2cmへの手/額の位置を案内
  3. 温度測定、結果を音声と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;
  }
}

回路図

音声アラート付き自動体温測定システム

製造プロセス

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