构建一个基于RFID的非接触式温度监测系统

2023-04-04  

  自 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两种通讯接口提供输出。

pYYBAGL0wy2AWW12AAUMI_qFKik669.png

pYYBAGL0wymAc5c3AAFaDp8IA6k751.png

  EM18 RFID 阅读器具有发送无线电信号的收发器。当 RFID 标签进入发射器信号范围时,该信号会到达卡内的转发器。标签从阅读器模块产生的电磁场中获取能量。然后转发器将无线电信号转换为可用的电力形式。接通电源后,应答器会将所有信息(例如特定 ID)以 RF 信号的形式传输到 RFID 模块。然后这个数据使用UART通信发送到微控制器。


  MLX90614 红外测温仪

  在继续本教程之前,了解 MLX90614 传感器的工作原理非常重要。市场上有许多温度传感器,我们一直在将 DHT11 传感器 和 LM35 广泛用于许多必须测量大气湿度或温度的应用。


  我们之前在红外热枪中使用过这种传感器,它可以感应特定物体(不是环境)的温度,而无需直接接触物体。在这里,我们再次使用相同的传感器来计算物体的温度。MLX90614 就是这样一种传感器,它使用 IR 能量来检测物体的温度。

poYBAGL0wyWATIlDAAGu3hKqwV8045.png

  MLX90614 传感器由迈来芯微电子集成系统制造,它内置了两个器件,一个是红外热电堆探测器(传感单元),另一个是信号调理DSP器件(计算单元)。它基于 Stefan-Boltzmann 定律 工作,该定律指出所有物体都会发射 IR 能量,并且这种能量的强度将与该物体的温度成正比。传感器中的传感单元测量目标物体发射了多少红外能量,计算单元使用 17 位内置 ADC 将其转换为温度值,并通过I2C 通信输出数据 协议。传感器测量物体温度和环境温度以校准物体温度值。


  电路原理图

  使用 Arduino 的基于 RFID 的非接触式温度传感器的电路图如下所示:

pYYBAGL0wyGAOmWhAAETA-TxyI8846.png

  如电路图所示,连接非常简单,因为我们将它们用作模块,我们可以直接在面包板上构建它们。当有人扫描标签时,连接到 EM18 阅读器模块的 BUZ 引脚的 LED 变为高电平。RFID模块向控制器串行发送数据;因此 RFID 模块的发送器引脚连接到 Arduino 的接收器引脚。连接在下表中进一步分类:

poYBAGL0wx2AHEVBAAAm07ESAZE924.png

pYYBAGL0wxmAXpiGAAYW2KstDWg981.png

  代码说明

  我们必须编写一个 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 上禁用了宏,您将看到如下图所示的安全块:

poYBAGL0wxGAJeTAAACKohngWio120.png

  单击选项-》启用内容-》完成-》确定以启用宏。在此之后,您将看到以下屏幕:

poYBAGL0ww2ALe-7AAF9Ak-6Ycg783.png

  现在选择波特率“9600”和你的Arduino连接的端口,然后点击连接开始数据流。您的值应该开始被记录,如下图所示。

pYYBAGL0wwmAbjX-AAGOG16raGo313.png

#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(); //行尾移动到下一行
}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。