음성 알림 기능이 있는 자동 체온 측정기
부품 및 소모품
 |
Arduino UNO |
× |
1 |
 |
UTSOURCE 전자 부품 |
× |
1 |
프로젝트 소개
최근 전 세계가 코로나19 바이러스와 싸우고 있습니다. 감염 의심자를 선별하는 첫 단계가 체온 측정입니다. 이 프로젝트는 체온을 자동으로 측정하고 음성으로 결과를 알려주는 장치를 만드는 것입니다.
1단계: 부품 목록
프로젝트에 필요한 구성품:
- Arduino UNO
- SD 카드 모듈
- SD 카드 8GB
- 앰프 PAM8403 & 스피커
- 초음파 센서 HC-SR04
- OLED 128x64
- 브레드보드 점퍼 케이블
- 적외선 온도계 GY-906 (MLX90614)
전자 부품은 utsource.net에서 구매할 수 있습니다. 참고: 수요가 많아 GY-906 센서를 구하기 어려울 수 있습니다.
2단계: 회로 설계
기본 동작: 적외선 온도계(GY-906)로 체온을 측정하고, 결과를 OLED 128x64에 표시합니다. 동시에 SD 카드에서 오디오 파일을 읽어 스피커로 음성 안내를 합니다. 스피커 소리를 키우기 위해 PAM8403 앰프를 사용합니다.
주요 사용 시나리오:
- 사용자가 초음파 센서 앞에서 손을 흔듭니다(약 10cm 거리).
- 시스템이 음성으로 "체온 측정 시스템에 오신 것을 환영합니다. 손이나 이마를 센서 앞 2cm 정도에 대주세요"라고 안내합니다.
- 사용자가 손이나 이마를 센서 가까이 가져가면 체온을 측정합니다.
- 결과를 음성과 LCD로 알려줍니다. 예: 체온이 36.5℃라면 "당신의 체온은 36.5도입니다. 정상 체온이니 건강을 유지하세요"라고 음성 출력합니다.
3단계: 프레임 제작 및 배선
프레임은 3mm 두께 MDF 목재를 레이저 커팅으로 제작했습니다. CNC 레이저 장비가 없다면 골판지로 대체 가능합니다. 설계 파일은 구글 드라이브에서 다운로드할 수 있습니다.
자른 부품을 접착제로 조립한 후, 모든 부품을 프레임에 장착하고 회로도대로 배선합니다.
4단계: 코드 작성 및 다운로드
아두이노 코드는 다음 기능을 수행합니다:
- 초음파 센서로 사람(장애물) 감지
- 스피커로 환영 인사 및 측정 안내 음성 출력
- 측정된 체온을 음성으로 알려주고 상태 코멘트 추가
코드 다운로드: https://bit.ly/2Za1mjZ
오디오 파일 다운로드 (SD 카드에 저장): https://bit.ly/3aZpGWJ
오디오 파일 사양: 8비트, 모노, 11025Hz. 컴퓨터나 휴대폰으로 녹음 후 온라인 변환 도구로 WAV 변환.
5단계: 테스트 실행
전원을 연결하고 테스트해 보세요. 체온을 측정하고 음성으로 알려주는 시스템이 재미있게 작동합니다.
유용하게 사용하시길 바랍니다! 읽어주셔서 감사합니다.
코드
// 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;
Serial.print("distance is ");
Serial.println(distance);
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;
}
}
회로도