亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

自动体温测量与语音播报系统

组件与物料清单

组件数量
Arduino UNO1
UTSOURCE 电子元件1

项目简介

近期全球正面临新冠病毒疫情的挑战。筛查感染者或疑似病例的首要步骤是测量体温。本项目旨在构建一个自动测量体温并通过语音播报结果的系统。

第一步:物料清单

项目所需组件:

注意: 因红外测温传感器需求量大,GY-906 有时可能难以买到。

第二步:电路设计

系统工作流程:

  1. 通过 GY-906 红外测温传感器测量体温
  2. 在 OLED 128x64 显示屏上显示测量结果
  3. 通过扬声器语音播报体温结果,音频文件存储在 SD 卡中,经 PAM8403 功放放大后播放

主要交互流程:

  1. 用户在距离超声波传感器约 10cm 处挥手
  2. 系统语音播报:"欢迎使用体温测量系统,请将手或额头置于传感器前约 2cm 处"
  3. 用户将手或额头靠近传感器进行测量
  4. 系统语音播报并显示结果,例如:"您的体温是 36.5 摄氏度。您的体温正常,请保持健康!"

第三步:制作外壳与连接

外壳采用 3mm 厚 MDF 板激光切割而成。若无激光切割机,可用纸板替代。设计文件可从 Google 网盘下载。

切割完成后用胶水组装外壳,随后安装所有组件并按电路图接线。

第四步:代码编写与下载

Arduino 代码主要功能:

  1. 超声波传感器检测人员靠近
  2. 语音欢迎并提示测量姿势
  3. 语音播报测量结果及健康建议

代码下载地址:https://bit.ly/2Za1mjZ

语音文件下载地址:https://bit.ly/3aZpGWJ

注意: 音频文件需为 8bit、单声道、11025Hz 格式。可使用在线工具(如 audio.online-convert.com)转换。

第五步:测试运行

接通电源测试系统。系统能自动测量体温并语音播报,功能完善。

希望您喜欢这个项目!

核心代码

// 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);
  
  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 = temperature_result * 10;
  temperature_result = round(temperature_result);
  int temp0 = 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. 集成二维码、RFID与体温验证的门禁控制系统
  2. 树莓派结合 Maxim 1-Wire 传感器与 DS2482 I2C 桥接器的多点温度测量
  3. 树莓派与 Python 构建远程温度传感器:分步实战指南
  4. 树莓派配合 EzTemp 实现无缝温湿度监测
  5. DIY 家酿温控系统:Arduino 监测与调节发酵温度
  6. 实验室级热电偶精密测温与记录:树莓派接 ADS1118
  7. 树莓派多传感器温度光照监测系统:DS18B20 实战构建
  8. Arduino + DHT11 + 以太网盾板温湿度数据记录仪
  9. BME280 环境数据实时显示于 Nextion 触摸屏——Visuino 图形化开发
  10. 测量工具大全:16种常用类型、用途与最佳实践
  11. 手自动变速器动力传递原理深度解析
  12. 复合结构与胶接结合线内部精准温度监测技术突破