自 Covid-19 爆发以来,红外温度计被用作筛查工具,对机场、火车站和其他拥挤场所的人员进行扫描。这些扫描被用于识别潜在的 Covid-19 患者。政府规定在进入办公室、学校或任何其他拥挤的地方之前必须对每个人进行扫描。
因此,在本教程中,我们将使用带有 Arduino 的非接触式温度传感器构建一个基于 RFID 的非接触式温度监测系统。当员工扫描 RFID 卡时,它将使用非接触式红外温度计测量员工的体温,并将该员工的姓名和温度直接记录到 Excel 表中。我们将使用 Arduino Nano、MLX90614、EM18 RFID 阅读器和超声波传感器来构建这个项目。超声波传感器用于计算温度计与人之间的距离。温度计仅在距离小于 25 厘米时测量温度。它类似于基于RFID的考勤系统,它还记录每个人的体温。
所需组件
Arduino纳米
EM-18 射频识别模块
MLX90614 非接触式温度传感器
超声波传感器
面包板
跳线
EM18 RFID阅读器模块
用于读取 125 kHz 标签的广泛使用的 RFID 阅读器之一是 EM-18 RFID 阅读器。这种低成本的 RFID 阅读器模块具有低功耗、小尺寸和易于使用的特点。EM-18阅读器模块可以通过RS232和WEIGAND26两种通讯接口提供输出。
EM18 RFID 阅读器具有发送无线电信号的收发器。当 RFID 标签进入发射器信号范围时,该信号会到达卡内的转发器。标签从阅读器模块产生的电磁场中获取能量。然后转发器将无线电信号转换为可用的电力形式。接通电源后,应答器会将所有信息(例如特定 ID)以 RF 信号的形式传输到 RFID 模块。然后这个数据使用UART通信发送到微控制器。
MLX90614 红外测温仪
在继续本教程之前,了解 MLX90614 传感器的工作原理非常重要。市场上有许多温度传感器,我们一直在将 DHT11 传感器 和 LM35 广泛用于许多必须测量大气湿度或温度的应用。
我们之前在红外热枪中使用过这种传感器,它可以感应特定物体(不是环境)的温度,而无需直接接触物体。在这里,我们再次使用相同的传感器来计算物体的温度。MLX90614 就是这样一种传感器,它使用 IR 能量来检测物体的温度。
MLX90614 传感器由迈来芯微电子集成系统制造,它内置了两个器件,一个是红外热电堆探测器(传感单元),另一个是信号调理DSP器件(计算单元)。它基于 Stefan-Boltzmann 定律 工作,该定律指出所有物体都会发射 IR 能量,并且这种能量的强度将与该物体的温度成正比。传感器中的传感单元测量目标物体发射了多少红外能量,计算单元使用 17 位内置 ADC 将其转换为温度值,并通过I2C 通信输出数据 协议。传感器测量物体温度和环境温度以校准物体温度值。
电路原理图
使用 Arduino 的基于 RFID 的非接触式温度传感器的电路图如下所示:
如电路图所示,连接非常简单,因为我们将它们用作模块,我们可以直接在面包板上构建它们。当有人扫描标签时,连接到 EM18 阅读器模块的 BUZ 引脚的 LED 变为高电平。RFID模块向控制器串行发送数据;因此 RFID 模块的发送器引脚连接到 Arduino 的接收器引脚。连接在下表中进一步分类:
代码说明
我们必须编写一个 Arduino 代码,该代码可以从超声波传感器、MLX90614、EM18 RFID 读取器模块读取数据,并将人的姓名和温度发送到 Excel 表。
页面末尾给出了这种非接触式体温监测的完整代码。这里将用小片段解释相同的程序。
像往常一样,通过包含所有必需的库来启动代码。此处 Wire 库用于使用 I2C 协议进行通信,Adafruit_MLX90614.h库用于读取 MLX90614 传感器数据。
#include
#include
然后我们定义我们已经建立连接的超声波传感器的引脚
常量 int trigPin = 5;
常量 int echoPin = 6;
之后,定义变量来存储 RFID 模块、超声波传感器和 MLX90614 传感器数据。
持续时间长;
整数距离;
字符串 RfidReading;
浮动 TempReading;
在void setup()函数中,我们初始化用于调试的串行监视器和 MLX90614 温度传感器。此外,将 Trig 和 Echo 引脚设置为输出和输入引脚。
无效设置()
{
序列号.开始(9600);// 初始化与串行监视器的串行通信
pinMode(trigPin,输出);
pinMode(echoPin,输入);
mlx.开始();
Initialize_streamer();
}
在void loop()函数内部,计算人与传感器之间的距离,如果距离小于或等于 25cm,则调用reader()函数扫描标签。
无效循环()
{
数字写入(trigPin,低);
延迟微秒(2);
数字写入(trigPin,高);
延迟微秒(10);
数字写入(trigPin,低);
持续时间=脉冲输入(回声针,高);
距离 = 持续时间 * 0.0340 / 2;
如果(距离 <= 25){
读者(); }
void reader()函数用于读取 RFID 标签卡。一旦卡靠近读卡器模块,读卡器模块就会读取串行数据并将其存储在输入变量中。
无效的读者()
{
如果(串行。可用())
{
计数 = 0;
而(Serial.available() && 计数 < 12)
{
输入[计数] = Serial.read();
计数++;
延迟(5);
在接下来的几行中,将扫描的卡片数据与预定义的标签 ID 进行比较。如果标签 ID 与扫描的卡匹配,则读取人员的温度并将人员的温度和姓名发送到 Excel 表。
如果(输入[计数]==标签[计数])
标志 = 1; 别的
标志= 0;
计数++;
RfidReading = "Ashish";
}
}
如果(标志 == 1)
{
temp_read();
Write_streamer();
}
在temp_read()函数中,以摄氏度读取 MLX90614 传感器数据并将其存储在“TempReading”变量中。
无效临时读取()
{
TempReading = mlx.readObjectTempC();}
硬件和软件准备就绪后,就可以将程序上传到您的 Arduino Nano 板上了。一旦您的程序被上传,超声波传感器就会开始计算距离。当计算距离小于 40 厘米时,它会读取温度和卡片。
从 Arduino 控制器将传感器数据存储到 Excel 表中
现在要将数据发送到 Excel 表,我们将使用PLX-DAQ。它是一个 Excel 插件软件,可帮助您将 Arduino 中的值直接写入笔记本电脑或 PC 上的 Excel 表中。使用链接下载文件。下载后解压文件并点击.exe文件进行安装。它将在您的桌面上创建一个名为PLS-DAQ的文件夹。
现在从桌面文件夹中打开“PLX-DAQ 电子表格”文件。如果您的 Excel 上禁用了宏,您将看到如下图所示的安全块:
单击选项-》启用内容-》完成-》确定以启用宏。在此之后,您将看到以下屏幕:
现在选择波特率“9600”和你的Arduino连接的端口,然后点击连接开始数据流。您的值应该开始被记录,如下图所示。
#include
#include
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
字符标签[] =“180088FECCA2”;// 替换为您自己的标签 ID
字符输入[12];// 一个变量来存储正在呈现的标签 ID
整数计数 = 0;// 在 input[] 字符数组中导航的计数器变量
布尔标志 = 0; // 一个存储标签匹配状态的变量
常量 int trigPin = 5;
常量 int echoPin = 6;
持续时间长;
整数距离;
字符串 RfidReading;
浮动 TempReading;
无效设置()
{
序列号.开始(9600);// 初始化与串行监视器的串行通信
pinMode(trigPin,输出);
pinMode(echoPin,输入);
mlx.开始();
Initialize_streamer();
}
无效循环()
{
数字写入(trigPin,低);
延迟微秒(2);
数字写入(trigPin,高);
延迟微秒(10);
数字写入(trigPin,低);
持续时间=脉冲输入(回声针,高);
距离 = 持续时间 * 0.0340 / 2;
// Serial.println("距离");
//Serial.println(距离);
如果(距离 <= 40){
读者();
}
延迟(1000);
}
无效的读者()
{
if(Serial.available())// 检查RFID阅读器串行缓冲区中是否有传入数据。
{
计数 = 0; // 将计数器重置为零
而(Serial.available() && 计数 < 12)
{
输入[计数] = Serial.read(); // 读取 1 个字节的数据并将其存储在 input[] 变量中
计数++;// 递增计数器
延迟(5);
}
如果(计数 == 12)//
{
计数=0;// 将计数器变量重置为 0
标志 = 1;
而(计数<12 && 标志!=0)
{
如果(输入[计数]==标签[计数])
标志 = 1; // 每次值匹配时,我们将标志变量设置为 1
别的
标志= 0;
计数++;// 增加 i
RfidReading = "Ashish";
}
}
if(flag == 1) // 如果 flag 变量为 1,则表示标签匹配
{
//Serial.println("允许访问!");
temp_read();
Write_streamer();
}
别的
{
// Serial.println("拒绝访问"); // 不正确的标签信息
}
for(count=0;count<12;count++)
{
输入[计数] = 'F';
}
计数 = 0; // 重置计数器变量
}
}
无效临时读取()
{
TempReading = mlx.readObjectTempC();
// Serial.println(sensorReading1);
// Serial.print(",");
//Serial.print("环境");
//Serial.print(mlx.readAmbientTempC());
//Serial.print("C");
// Serial.print("目标");
// Serial.print(mlx.readObjectTempC());
// Serial.print("C");
// 延迟(1000);
}
无效 Initialize_streamer()
{
Serial.println("CLEARDATA"); //清除以前项目留下的任何数据
Serial.println("标签、日期、时间、温度、名称"); //总是写LABEL,表示它是第一行
}
无效的 Write_streamer()
{
// Serial.print("DATA"); //总是写“DATA”来表示下面的数据
// Serial.print(","); //使用“,”移动到下一列
// Serial.print("DATE"); //在Excel中存储日期
// Serial.print(","); //使用“,”移动到下一列
// Serial.print("TIME"); //在Excel中存储日期
// Serial.print(","); //使用“,”移动到下一列
Serial.print(RfidReading); //在Excel中存储日期
序列号.print(","); //使用“,”移动到下一列
Serial.print(TempReading); //在Excel中存储日期
序列号.print(","); //使用“,”移动到下一列
序列号.println(); //行尾移动到下一行
}