自 Covid-19 爆發(fā)以來,紅外溫度計(jì)被用作篩查工具,對(duì)機(jī)場(chǎng)、火車站和其他擁擠場(chǎng)所的人員進(jìn)行掃描。這些掃描被用于識(shí)別潛在的 Covid-19 患者。政府規(guī)定在進(jìn)入辦公室、學(xué)?;蛉魏纹渌麚頂D的地方之前必須對(duì)每個(gè)人進(jìn)行掃描。
因此,在本教程中,我們將使用帶有 Arduino 的非接觸式溫度傳感器構(gòu)建一個(gè)基于 RFID 的非接觸式溫度監(jiān)測(cè)系統(tǒng)。當(dāng)員工掃描 RFID 卡時(shí),它將使用非接觸式紅外溫度計(jì)測(cè)量員工的體溫,并將該員工的姓名和溫度直接記錄到 Excel 表中。我們將使用 Arduino Nano、MLX90614、EM18 RFID 閱讀器和超聲波傳感器來構(gòu)建這個(gè)項(xiàng)目。超聲波傳感器用于計(jì)算溫度計(jì)與人之間的距離。溫度計(jì)僅在距離小于 25 厘米時(shí)測(cè)量溫度。它類似于基于RFID的考勤系統(tǒng),它還記錄每個(gè)人的體溫。
所需組件
Arduino納米
EM-18 射頻識(shí)別模塊
MLX90614 非接觸式溫度傳感器
超聲波傳感器
面包板
跳線
EM18 RFID閱讀器模塊
用于讀取 125 kHz 標(biāo)簽的廣泛使用的 RFID 閱讀器之一是 EM-18 RFID 閱讀器。這種低成本的 RFID 閱讀器模塊具有低功耗、小尺寸和易于使用的特點(diǎn)。EM-18閱讀器模塊可以通過RS232和WEIGAND26兩種通訊接口提供輸出。
EM18 RFID 閱讀器具有發(fā)送無線電信號(hào)的收發(fā)器。當(dāng) RFID 標(biāo)簽進(jìn)入發(fā)射器信號(hào)范圍時(shí),該信號(hào)會(huì)到達(dá)卡內(nèi)的轉(zhuǎn)發(fā)器。標(biāo)簽從閱讀器模塊產(chǎn)生的電磁場(chǎng)中獲取能量。然后轉(zhuǎn)發(fā)器將無線電信號(hào)轉(zhuǎn)換為可用的電力形式。接通電源后,應(yīng)答器會(huì)將所有信息(例如特定 ID)以 RF 信號(hào)的形式傳輸?shù)?RFID 模塊。然后這個(gè)數(shù)據(jù)使用UART通信發(fā)送到微控制器。
MLX90614 紅外測(cè)溫儀
在繼續(xù)本教程之前,了解 MLX90614 傳感器的工作原理非常重要。市場(chǎng)上有許多溫度傳感器,我們一直在將 DHT11 傳感器 和 LM35 廣泛用于許多必須測(cè)量大氣濕度或溫度的應(yīng)用。
我們之前在紅外熱槍中使用過這種傳感器,它可以感應(yīng)特定物體(不是環(huán)境)的溫度,而無需直接接觸物體。在這里,我們?cè)俅问褂孟嗤膫鞲衅鱽碛?jì)算物體的溫度。MLX90614 就是這樣一種傳感器,它使用 IR 能量來檢測(cè)物體的溫度。
MLX90614 傳感器由邁來芯微電子集成系統(tǒng)制造,它內(nèi)置了兩個(gè)器件,一個(gè)是紅外熱電堆探測(cè)器(傳感單元),另一個(gè)是信號(hào)調(diào)理DSP器件(計(jì)算單元)。它基于 Stefan-Boltzmann 定律 工作,該定律指出所有物體都會(huì)發(fā)射 IR 能量,并且這種能量的強(qiáng)度將與該物體的溫度成正比。傳感器中的傳感單元測(cè)量目標(biāo)物體發(fā)射了多少紅外能量,計(jì)算單元使用 17 位內(nèi)置 ADC 將其轉(zhuǎn)換為溫度值,并通過I2C 通信輸出數(shù)據(jù) 協(xié)議。傳感器測(cè)量物體溫度和環(huán)境溫度以校準(zhǔn)物體溫度值。
電路原理圖
使用 Arduino 的基于 RFID 的非接觸式溫度傳感器的電路圖如下所示:
如電路圖所示,連接非常簡單,因?yàn)槲覀儗⑺鼈冇米髂K,我們可以直接在面包板上構(gòu)建它們。當(dāng)有人掃描標(biāo)簽時(shí),連接到 EM18 閱讀器模塊的 BUZ 引腳的 LED 變?yōu)楦唠娖?。RFID模塊向控制器串行發(fā)送數(shù)據(jù);因此 RFID 模塊的發(fā)送器引腳連接到 Arduino 的接收器引腳。連接在下表中進(jìn)一步分類:
代碼說明
我們必須編寫一個(gè) Arduino 代碼,該代碼可以從超聲波傳感器、MLX90614、EM18 RFID 讀取器模塊讀取數(shù)據(jù),并將人的姓名和溫度發(fā)送到 Excel 表。
頁面末尾給出了這種非接觸式體溫監(jiān)測(cè)的完整代碼。這里將用小片段解釋相同的程序。
像往常一樣,通過包含所有必需的庫來啟動(dòng)代碼。此處 Wire 庫用于使用 I2C 協(xié)議進(jìn)行通信,Adafruit_MLX90614.h庫用于讀取 MLX90614 傳感器數(shù)據(jù)。
#include
?
#include
?
然后我們定義我們已經(jīng)建立連接的超聲波傳感器的引腳
?
常量 int trigPin = 5; 常量 int echoPin = 6;
?
之后,定義變量來存儲(chǔ) RFID 模塊、超聲波傳感器和 MLX90614 傳感器數(shù)據(jù)。
?
持續(xù)時(shí)間長; 整數(shù)距離; 字符串 RfidReading; 浮動(dòng) TempReading;
?
在void setup()函數(shù)中,我們初始化用于調(diào)試的串行監(jiān)視器和 MLX90614 溫度傳感器。此外,將 Trig 和 Echo 引腳設(shè)置為輸出和輸入引腳。
?
無效設(shè)置() { 序列號(hào).開始(9600);// 初始化與串行監(jiān)視器的串行通信 pinMode(trigPin,輸出); pinMode(echoPin,輸入); mlx.開始(); Initialize_streamer(); }
?
在void loop()函數(shù)內(nèi)部,計(jì)算人與傳感器之間的距離,如果距離小于或等于 25cm,則調(diào)用reader()函數(shù)掃描標(biāo)簽。
?
無效循環(huán)() { 數(shù)字寫入(trigPin,低); 延遲微秒(2); 數(shù)字寫入(trigPin,高); 延遲微秒(10); 數(shù)字寫入(trigPin,低); 持續(xù)時(shí)間=脈沖輸入(回聲針,高); 距離 = 持續(xù)時(shí)間 * 0.0340 / 2; 如果(距離 <= 25){ 讀者(); }
?
void reader()函數(shù)用于讀取 RFID 標(biāo)簽卡。一旦卡靠近讀卡器模塊,讀卡器模塊就會(huì)讀取串行數(shù)據(jù)并將其存儲(chǔ)在輸入變量中。
?
無效的讀者() { 如果(串行。可用()) { 計(jì)數(shù) = 0; 而(Serial.available() && 計(jì)數(shù) < 12) { 輸入[計(jì)數(shù)] = Serial.read(); 計(jì)數(shù)++; 延遲(5);
?
在接下來的幾行中,將掃描的卡片數(shù)據(jù)與預(yù)定義的標(biāo)簽 ID 進(jìn)行比較。如果標(biāo)簽 ID 與掃描的卡匹配,則讀取人員的溫度并將人員的溫度和姓名發(fā)送到 Excel 表。
?
如果(輸入[計(jì)數(shù)]==標(biāo)簽[計(jì)數(shù)]) 標(biāo)志 = 1; 別的 標(biāo)志= 0; 計(jì)數(shù)++; RfidReading = "Ashish"; } } 如果(標(biāo)志 == 1) { temp_read(); Write_streamer(); }
?
在temp_read()函數(shù)中,以攝氏度讀取 MLX90614 傳感器數(shù)據(jù)并將其存儲(chǔ)在“TempReading”變量中。?
?
無效臨時(shí)讀?。ǎ?{ TempReading = mlx.readObjectTempC();}
?
硬件和軟件準(zhǔn)備就緒后,就可以將程序上傳到您的 Arduino Nano 板上了。一旦您的程序被上傳,超聲波傳感器就會(huì)開始計(jì)算距離。當(dāng)計(jì)算距離小于 40 厘米時(shí),它會(huì)讀取溫度和卡片。
從 Arduino 控制器將傳感器數(shù)據(jù)存儲(chǔ)到 Excel 表中
現(xiàn)在要將數(shù)據(jù)發(fā)送到 Excel 表,我們將使用PLX-DAQ。它是一個(gè) Excel 插件軟件,可幫助您將 Arduino 中的值直接寫入筆記本電腦或 PC 上的 Excel 表中。使用鏈接下載文件。下載后解壓文件并點(diǎn)擊.exe文件進(jìn)行安裝。它將在您的桌面上創(chuàng)建一個(gè)名為PLS-DAQ的文件夾。
現(xiàn)在從桌面文件夾中打開“PLX-DAQ 電子表格”文件。如果您的 Excel 上禁用了宏,您將看到如下圖所示的安全塊:
單擊選項(xiàng)-》啟用內(nèi)容-》完成-》確定以啟用宏。在此之后,您將看到以下屏幕:
現(xiàn)在選擇波特率“9600”和你的Arduino連接的端口,然后點(diǎn)擊連接開始數(shù)據(jù)流。您的值應(yīng)該開始被記錄,如下圖所示。
#include
#include
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
字符標(biāo)簽[] =“180088FECCA2”;// 替換為您自己的標(biāo)簽 ID
字符輸入[12];// 一個(gè)變量來存儲(chǔ)正在呈現(xiàn)的標(biāo)簽 ID
整數(shù)計(jì)數(shù) = 0;// 在 input[] 字符數(shù)組中導(dǎo)航的計(jì)數(shù)器變量
布爾標(biāo)志 = 0; // 一個(gè)存儲(chǔ)標(biāo)簽匹配狀態(tài)的變量
常量 int trigPin = 5;
常量 int echoPin = 6;
持續(xù)時(shí)間長;
整數(shù)距離;
字符串 RfidReading;
浮動(dòng) TempReading;
無效設(shè)置()
{
序列號(hào).開始(9600);// 初始化與串行監(jiān)視器的串行通信
pinMode(trigPin,輸出);
pinMode(echoPin,輸入);
mlx.開始();
Initialize_streamer();
}
無效循環(huán)()
{
數(shù)字寫入(trigPin,低);
延遲微秒(2);
數(shù)字寫入(trigPin,高);
延遲微秒(10);
數(shù)字寫入(trigPin,低);
持續(xù)時(shí)間=脈沖輸入(回聲針,高);
距離 = 持續(xù)時(shí)間 * 0.0340 / 2;
// Serial.println("距離");
//Serial.println(距離);
如果(距離 <= 40){
讀者();
}
延遲(1000);
}
無效的讀者()
{
if(Serial.available())// 檢查RFID閱讀器串行緩沖區(qū)中是否有傳入數(shù)據(jù)。
{
計(jì)數(shù) = 0; // 將計(jì)數(shù)器重置為零
而(Serial.available() && 計(jì)數(shù) < 12)
{
輸入[計(jì)數(shù)] = Serial.read(); // 讀取 1 個(gè)字節(jié)的數(shù)據(jù)并將其存儲(chǔ)在 input[] 變量中
計(jì)數(shù)++;// 遞增計(jì)數(shù)器
延遲(5);
}
如果(計(jì)數(shù) == 12)//
{
計(jì)數(shù)=0;// 將計(jì)數(shù)器變量重置為 0
標(biāo)志 = 1;
而(計(jì)數(shù)<12 && 標(biāo)志!=0)
{
如果(輸入[計(jì)數(shù)]==標(biāo)簽[計(jì)數(shù)])
標(biāo)志 = 1; // 每次值匹配時(shí),我們將標(biāo)志變量設(shè)置為 1
別的
標(biāo)志= 0;
計(jì)數(shù)++;// 增加 i
RfidReading = "Ashish";
}
}
if(flag == 1) // 如果 flag 變量為 1,則表示標(biāo)簽匹配
{
//Serial.println("允許訪問!");
temp_read();
Write_streamer();
}
別的
{
// Serial.println("拒絕訪問"); // 不正確的標(biāo)簽信息
}
for(count=0;count<12;count++)
{
輸入[計(jì)數(shù)] = 'F';
}
計(jì)數(shù) = 0; // 重置計(jì)數(shù)器變量
}
}
無效臨時(shí)讀?。ǎ?br />
{
TempReading = mlx.readObjectTempC();
// Serial.println(sensorReading1);
// Serial.print(",");
//Serial.print("環(huán)境");
//Serial.print(mlx.readAmbientTempC());
//Serial.print("C");
// Serial.print("目標(biāo)");
// Serial.print(mlx.readObjectTempC());
// Serial.print("C");
// 延遲(1000);
}
無效 Initialize_streamer()
{
Serial.println("CLEARDATA"); //清除以前項(xiàng)目留下的任何數(shù)據(jù)
Serial.println("標(biāo)簽、日期、時(shí)間、溫度、名稱"); //總是寫LABEL,表示它是第一行
}
無效的 Write_streamer()
{
// Serial.print("DATA"); //總是寫“DATA”來表示下面的數(shù)據(jù)
// Serial.print(","); //使用“,”移動(dòng)到下一列
// Serial.print("DATE"); //在Excel中存儲(chǔ)日期
// Serial.print(","); //使用“,”移動(dòng)到下一列
// Serial.print("TIME"); //在Excel中存儲(chǔ)日期
// Serial.print(","); //使用“,”移動(dòng)到下一列
Serial.print(RfidReading); //在Excel中存儲(chǔ)日期
序列號(hào).print(","); //使用“,”移動(dòng)到下一列
Serial.print(TempReading); //在Excel中存儲(chǔ)日期
序列號(hào).print(","); //使用“,”移動(dòng)到下一列
序列號(hào).println(); //行尾移動(dòng)到下一行
}
?
評(píng)論
查看更多