温度测量自动和语音通知
组件和用品
| × | 1 | ||||
| × | 1 |
关于这个项目
最近一天,全世界都在与病毒 Covid19 作斗争。首先检查受影响的人(或怀疑受影响的人)是测量体温。所以本项目就是制作了一个可以自动测量体温并通过语音通知的模型。
开始吧!
第 1 步:零件清单
项目组件:
1. Arduino UNO https://amzn.to/2P58O7s
2. SD 卡模块 https://amzn.to/2E1myhb
3. SD 卡 8GB https://amzn.to/2xTCz6i
4. 放大器 PAM8403 和扬声器 https://amzn.to/2E1myhb
5.超声波传感器HC-SR04 https://amzn.to/2E1myhb
6. OLED 128x64 https://amzn.to/2E1myhb
7.面包板电缆 https://amzn.to/2E1myhb
8.红外测温仪GY-906 https://amzn.to/2Wlab5r
在 utsource.net 上购买电子元件
请注意:由于红外测温仪的需求量很大,有时您可能在市场上找不到传感器 GY-906。
第二步:电路设计
看看电路设计。
基本上,它会从红外测温仪 GY-906 测量温度,然后在 128*64 的 Oled LCD 上显示结果。它还通过扬声器通过语音通知您结果温度。扬声器将从 SD 卡中提取音频文件,然后根据温度结果播放。音箱需要功放PAM8403才能让我们的声音变大。
主要使用过程如下:
1.我们会在超声波传感器上挥手(距离约10cm)
2. 然后它会用语音问候我们“欢迎使用温度测量系统,请将您的手或额头放在传感器前约 2 厘米处”
3.我们将手或额头放在传感器前测量温度
4. 声音温度结果,并显示在LCD上。例如,你的体温是 36.5dgC,它会说“你的体温是 36.5 摄氏度。你的体温看起来很正常,所以请保持健康!”
第 3 步:制作框架并进行连接
框架由 3 毫米厚的 MDF 木材制成,经激光切割。我希望你们中的一些人可以支持cnc激光机来切割它。如果没有,您可以为框架切割纸板。设计文件可以在这里下载(谷歌分享)
图> 图> 图> 图>切割后,您将需要胶水为其制作框架。制作框架并不难。然后我们将所有零件安装到框架中,并按照电路设计进行布线
第 4 步:代码工作和下载
arduino 代码将完成这项工作:
1.检测传感器附近是否有人(障碍物),通过超声波传感器检测
2. 用扬声器说欢迎,告知用户将手或额头靠近传感器约 2 厘米
3. 说出结果并评论您的体温
代码可以在这里下载
https://bit.ly/2Za1mjZ
这是音频文件,您应该下载并保存到 SD 卡中
https://bit.ly/3aZpGWJ
请注意,音频文件为 8bit,单声道类型,11025Hz。我用电脑(或手机)录制我的声音,然后通过工具在线转换(https://audio.online-convert.com/convert-to-wav)
第 5 步:试运行
现在,我们可以插入电源并测试它的运行情况。非常有趣的系统可以测量您的体温并通过语音通知。
图> 图>我希望你会喜欢它:)
感谢您的阅读!https://bit.ly/2Za1mjZ
代码
- Arduino_ir_temperature_auto.ino
Arduino_ir_temperature_auto.inoArduino
// www.youtube.com/c/engineer2you#include// 对于 SD 卡#define SD_ChipSelectPin 10 // 对于 SD 卡#include // 播放 wav 文件的 Lib#包括 // 用于红外测温仪//------------------------------------ - oled#include "SSD1306Ascii.h"#include "SSD1306AsciiAvrI2c.h"#define I2C_ADDRESS 0x3C // 0X3C+SA0 - 0x3C 或 0x3D#define RST_PIN -1 // 如果需要,定义适当的 RST_PIN。//------ --------------------------------- oledAdafruit_MLX90614 mlx =Adafruit_MLX90614(); //红外测温仪SSD1306AsciiAvrI2c oled; // 为 LCDTMRpcm 创建一个对象 tmrpcm; // 为音乐播放器创建一个对象double temp; // 保存温度值const int trigPin =17; //超声波常量 int echoPin =16; //ultrasoniclong duration;int distance;int step1_judge =0;void setup(){ //------------------------------ --------- oled #if RST_PIN>=0 oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN); #else // RST_PIN>=0 oled.begin(&Adafruit128x64, I2C_ADDRESS); #endif // RST_PIN>=0 // 调用 oled.setI2cClock(frequency) 以更改默认频率。 oled.setFont(Adafruit5x7); //-------------------------------------- oled tmrpcm.speakerPin =9; //pin 9 用于输出音频 Serial.begin(9600); if (!SD.begin(SD_ChipSelectPin)) { // 查看卡是否存在并且可以初始化:Serial.println("SD fail"); Serial.println("SD ok"); oled.clear(); oled.set1X(); oled.println("SD 卡失败");返回; // 如果没有就不要再做任何事情 } else{ Serial.println("SD ok"); oled.clear(); oled.println("SD 卡正常"); } 延迟(1000); tmrpcm.play("m_wel.wav"); //每次arduino上电或重置时都会播放欢迎声音文件 tmrpcm.volume(1); oled.clear(); oled.set2X(); oled.println(""); oled.println("欢迎"); pinMode(trigPin, OUTPUT); // 将触发引脚设置为输出 pinMode(echoPin, INPUT); // 将 echoPin 设置为 Input mlx.begin(); //启动红外测温仪延迟(10000); //等待欢迎音频}void loop(){ //------------读取距离 // 将trigPin 设置为HIGH 状态10 微秒digitalWrite(trigPin, HIGH);延迟微秒(10);数字写入(trigPin,低); // 读取 echoPin,以微秒为单位返回声波传播时间 duration =pulseIn(echoPin, HIGH, 23529); //23529us for timeout 4.0m // 计算距离 distance=duration*0.034/2; //speak_out(temp); Serial.print("距离为"); Serial.println(距离); if ((distance<10)&&(distance>0)) step1_judge++;否则 step1_judge=0; if (step1_judge>2){ step1_judge=0; tmrpcm.play("m_wel.wav");延迟(10000); //等待欢迎语音完成 temp =mlx.readObjectTempC()+1.2;//--------------------读取温度并在 LCD 上显示 //temp =37.4; //为了测试,注释这一行是为了真正阅读oled.clear(); oled.set2X(); oled.println(""); oled.print(" "); oled.print(temp,1); oled.println("dgC"); tmrpcm.play("m_now.wav");延迟(1380); if (temp<20){ tmrpcm.play("m_b20.wav"); //在 20 dgC 下说出来延迟(1700); //等待音频结束 tmrpcm.play("m_nman.wav"); //说出“你不是人类”延迟(2270); //等待音频结束 } else{ if (temp> 50){ tmrpcm.play("m_over50.wav"); //说出超过 50 dgC 延迟(1740); tmrpcm.play("m_nman.wav"); //说出“你不是人类”延迟(2270); } else{ 说话(温度); //说出温度(如果是从20到50dgC)延迟(1500); if((temp> 36)&&(temp<37)){ tmrpcm.play("m_normal.wav"); //如果是36~37dgC就说“正常体温,保持健康” delay(3268); } if(temp> 37){ tmrpcm.play("m_fever.wav"); //说出“你发烧了”延迟(2728); } } } } delay(300);}void speak_out(double temperature_result){ //这个子程序会说出温度 temperature_result =temperature_result*10;温度结果 =轮(温度结果); int temp0 =温度结果; int temp1 =temp0/10; //温度值,xy数字(在xy.z dgC中) int temp2 =temp1%10; //温度值,y位(在xy.z dgC中) int temp3 =temp0%10; //温度值,z位数(在xy.z dgC中) if(temp1<20){ tmrpcm.play("m_below20.wav"); //低于20dgC延迟(1631); } if(temp1>50){ tmrpcm.play("m_over50.wav"); //更大的50dgC延迟(1747); } if(((temp1>=20)&&(temp1<=29)){ tmrpcm.play("m_twenty.wav"); //二十延迟(600); } if((temp1>=30)&&(temp1<=39)){ tmrpcm.play("m_thirty.wav"); //三十延迟(500); } if((temp1>=40)&&(temp1<=49)){ tmrpcm.play("m_fourty.wav"); //四十延迟(691); } if (temp2!=0) speak_num(temp2); //温度值,y位(在xy.z dgC中) if((temp1>=20)&&(temp1<=50)){ tmrpcm.play("m_point.wav"); //点延迟(319);说话数(temp3); //温度值,z位(在xy.z dgC中) } tmrpcm.play("m_dgc.wav"); //摄氏度延迟(853); Serial.println(temp0); Serial.println(temp1); Serial.println(temp2); Serial.println(temp3);}void speak_num(int number){ //这个子程序会在子程序“speak_out()”中调用 if(number==1){ tmrpcm.play("m_one.wav" ); //一个延迟(453); } if(number==2){ tmrpcm.play("m_two.wav"); //两个延迟(499); } if(number==3){ tmrpcm.play("m_three.wav"); //三个延迟(406); } if(number==4){ tmrpcm.play("m_four.wav"); //四个延迟(401); } if(number==5){ tmrpcm.play("m_five.wav"); //五个延迟(354); } if(number==6){ tmrpcm.play("m_six.wav"); //六个延迟(401); } if(number==7){ tmrpcm.play("m_seven.wav"); //七延迟(633); } if(number==8){ tmrpcm.play("m_eight.wav"); //八延迟(360); } if(number==9){ tmrpcm.play("m_nine.wav"); //九延迟(580); } if(number==0){ tmrpcm.play("m_zero.wav"); //零延迟(610); }}
示意图
制造工艺