自 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(); //行尾移動到下一行
}
?
評論
查看更多