自动体温测量与语音播报系统
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| UTSOURCE 电子元件 | 1 |
项目简介
近期全球正面临新冠病毒疫情的挑战。筛查感染者或疑似病例的首要步骤是测量体温。本项目旨在构建一个自动测量体温并通过语音播报结果的系统。
第一步:物料清单
项目所需组件:
- Arduino UNO
- SD 卡模块
- 8GB SD 卡
- PAM8403 功放模块 & 扬声器
- HC-SR04 超声波传感器
- 128x64 OLED 显示屏
- 面包板连接线
- GY-906 红外测温传感器
注意: 因红外测温传感器需求量大,GY-906 有时可能难以买到。
第二步:电路设计
系统工作流程:
- 通过 GY-906 红外测温传感器测量体温
- 在 OLED 128x64 显示屏上显示测量结果
- 通过扬声器语音播报体温结果,音频文件存储在 SD 卡中,经 PAM8403 功放放大后播放
主要交互流程:
- 用户在距离超声波传感器约 10cm 处挥手
- 系统语音播报:"欢迎使用体温测量系统,请将手或额头置于传感器前约 2cm 处"
- 用户将手或额头靠近传感器进行测量
- 系统语音播报并显示结果,例如:"您的体温是 36.5 摄氏度。您的体温正常,请保持健康!"
第三步:制作外壳与连接
外壳采用 3mm 厚 MDF 板激光切割而成。若无激光切割机,可用纸板替代。设计文件可从 Google 网盘下载。
切割完成后用胶水组装外壳,随后安装所有组件并按电路图接线。
第四步:代码编写与下载
Arduino 代码主要功能:
- 超声波传感器检测人员靠近
- 语音欢迎并提示测量姿势
- 语音播报测量结果及健康建议
代码下载地址: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;
}
}
原理图
电路原理图请参考项目附件。
制造工艺
- 集成二维码、RFID与体温验证的门禁控制系统
- 树莓派结合 Maxim 1-Wire 传感器与 DS2482 I2C 桥接器的多点温度测量
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- 树莓派配合 EzTemp 实现无缝温湿度监测
- DIY 家酿温控系统:Arduino 监测与调节发酵温度
- 实验室级热电偶精密测温与记录:树莓派接 ADS1118
- 树莓派多传感器温度光照监测系统:DS18B20 实战构建
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- BME280 环境数据实时显示于 Nextion 触摸屏——Visuino 图形化开发
- 测量工具大全:16种常用类型、用途与最佳实践
- 手自动变速器动力传递原理深度解析
- 复合结构与胶接结合线内部精准温度监测技术突破