在辦公室、商場、購物中心等入口處掃描溫度已成為應對當前 Covid19 大流行的“新常態(tài)”。雖然可以使用手持紅外溫度計來測量每個進入大門的人的溫度并在筆記本上手動記錄下來,但這并不是最有效的方法。
因此,在這個項目中,我們將使用 Arduino 設計一個壁掛式紅外溫度計,可以簡單地固定在墻上并保持開啟狀態(tài)。每個進入場所的人都可以通過走到這個紅外溫度傳感器來掃描他們的溫度,它將測量個人的溫度并將其顯示在 LCD 上。除此之外,它還會在 SD 卡上以 Excel 格式記錄員工/訪客的時間和溫度。在此項目中添加 RFID 閱讀器或條形碼掃描儀也很容易,以檢測員工的姓名并根據(jù)他的姓名記錄溫度和時間。這樣,設備也可以作為考勤系統(tǒng),因為時間也會被記錄下來。有意思吧!!所以讓我們開始吧……
壁掛式紅外測溫儀所需材料
Arduino納米
MLX90615
TCRT5000
DS3231 實時時鐘模塊
16*2液晶
SD卡模塊
蜂鳴器
紅色 LED
綠色 LED
性能板
1K、4.7K、10K 電阻器
10K電位器
DC 筒式千斤頂
12V 1A 直流電源適配器
LED 安裝支架
金屬外殼和螺絲
壁掛式數(shù)字紅外溫度計電路圖
數(shù)字紅外溫度計的完整原理圖如下所示。它可能看起來像一個復雜的電路,但其中大多數(shù)是簡單的接口電路。
MLX90615 非接觸式紅外溫度傳感器:電路中最重要的元件是非接觸式溫度傳感器 MLX90615。我們之前在我們的智能手機紅外溫度計項目中使用了相同的傳感器。該傳感器的工作原理是所有熱物體(包括人)都會發(fā)出紅外線,紅外線的強度將與物體的溫度成正比。因此,傳感器通過測量物體發(fā)出的紅外線來測量物體的溫度。MLX90615 是一款數(shù)字紅外溫度傳感器,這意味著它有自己的內(nèi)部電路來測量來自物體的紅外光并將其直接轉換為溫度值??梢允褂?I2C 通信讀取此輸出溫度,MLX90615 的引腳如下所示。
TCRT5000 IR 接近傳感器:我們設備上的下一個傳感器是 TCRT5000 IR 接近傳感器。該傳感器用于檢測是否有人將手放在傳感器前面。這是一個簡單的接近傳感器,我們之前在許多項目中都使用過,比如我們之前建造的遙控 Arduino Car。但在這個項目中,我們更有效地使用它來解決紅外傳感器的陽光問題。
TCRT5000 作為 IR 傳感器可能會被陽光錯誤地觸發(fā),因為太陽光線也包含 IR 光線。為避免陽光造成的誤觸發(fā),我們將紅外接收器 LED 連接到 Arduino 的模擬端口,將紅外發(fā)射器連接到數(shù)字引腳。這樣,我們可以在紅外發(fā)射器打開時測量紅外接收器接收到的紅外信號,并在紅外發(fā)射器關閉時再次測量它。取這兩個值之間的差異將有助于我們找到環(huán)境中的噪聲,從而避免誤觸發(fā)。
DS3231 RTC 模塊: DS3231 RTC 模塊用于跟蹤時間和日期。RTC 模塊有自己的內(nèi)置電池,因此即使關閉電源,設備也會記住時間。但是,我們必須在第一次使用它之前設置正確的時間。我們不會在本文中討論如何做到這一點。DS3231 還與 I2C 引腳通信,因此連接到 MLX90615 的相同引腳。但是,兩個模塊都有不同的 I2C 地址,因此我們不必擔心信號干擾。
SD 卡模塊: SD 卡模塊用于將 SD 卡與我們的 Arduino 微控制器連接。它用于將掃描的溫度和時間值保存在文本文件中。該模塊使用 SPI 通信協(xié)議,因此我們已將其連接到 Arduino 的 SPI 引腳,如上圖所示。
16x2 LCD 顯示屏: LCD 顯示屏用于顯示溫度和時間值。這是一個簡單的16x2 字母數(shù)字 LCD 顯示器,我們在許多其他項目中都使用過。
LED 和蜂鳴器:最后,我們有用于輸出指示的 LED 和蜂鳴器。如果溫度正常,蜂鳴器會隨著綠色 LED 發(fā)出一次嗶聲,并且蜂鳴器會隨著紅色 LED 發(fā)出多次嗶聲表示高溫。
如您所見,電路圖沒有什么很復雜的,我們只是直接將模塊與Arduino連接起來。除此之外,我們幾乎沒有用于 LED 和蜂鳴器的電阻器用作限流電阻器,而 I2C 總線上的其他 4.7k 歐姆電阻器用于上拉電阻器。我們還有一個連接到 LCD 的電位器來調(diào)節(jié) LCD 的對比度。
在性能板上構建電路
從主圖中可以看出,這個想法是在金屬板外殼內(nèi)使用這個電路。所以上面顯示的完整電路被焊接到一個穿孔板上。確保使用電線留出足夠的距離來安裝 LCD、LED、傳感器和蜂鳴器。我使用了兩個 perf 板,一個用于放置 Arduino nano、DS3231 和所有無源組件,另一個用于兩個傳感器(MLX90615 和 TCRT500),根據(jù)您的安裝外殼,您可以以不同的方式焊接它。我的穿孔板焊接到 LCD 和傳感器模塊如下所示。
安裝 MLX90615、DS3231 和 SD 卡所需的庫
現(xiàn)在硬件已準備就緒,是時候開始對我們的 IR 數(shù)字溫度計進行編程了。此項目的完整代碼在本頁末尾提供,但在我們開始之前,將所需的庫添加到您的 Arduino IDE 非常重要。確保從下面的鏈接中添加正確的庫,否則代碼在編譯時會拋出錯誤。
為壁掛式溫度計編程 Arduino?
添加所需庫后,您可以直接上傳本頁底部給出的代碼,以檢查電路是否正常工作。如果您想知道代碼是如何工作的,請繼續(xù)閱讀...
像往常一樣,我們通過添加所需的頭文件并定義引腳名稱來開始程序。
?
#define 嗡嗡聲 5 #定義綠色 3 #定義紅色 4 #include#include "DS3231.h" #include "MLX90615.h" #include #include //SPI 通信庫(預加載到 Arduino 中) #include //SD 卡庫(預加載到 Arduino 中)
?
然后我們有兩個主要的全局變量,必須根據(jù)您的應用程序進行調(diào)整。第一個變量是“error_correction”,它是溫度值加上 MLX90615 傳感器的原始值。盡管 MLX90615 傳感器經(jīng)過工廠校準,但我注意到它的值比原始值非常低,因此我必須添加error_correction值才能獲得可靠的讀數(shù)。我用我的手持儀表來校準這些值。但經(jīng)過校準后,我發(fā)現(xiàn)傳感器在所有范圍內(nèi)都非??煽俊O乱粋€變量是Range_sensitive,此值用于確定觸發(fā)我們的設備之前該人應該離多近。我使用了 200 的值,但如果你想增加范圍,你可以減小這個值。
?
浮動error_correction = 4;//將此添加到實際值 int Range_sensitivity = 200; //減小這個值來增加范圍
?
繼續(xù)我們的代碼,我們有Initialize SD Card函數(shù),用于打開與 SD 卡的 SPI 通信,并在 SD 卡內(nèi)創(chuàng)建一個名為“Temp_Log.text”的文件。然后我們也將打開這個文件并寫下日志的標題。在這里,我們記錄日期、時間和溫度,因此我們相應地命名標題。在 setup 函數(shù)執(zhí)行期間,該函數(shù)只會被調(diào)用一次。
?
無效 Initialize_SDcard() { // 查看卡是否存在并且可以初始化: 如果(!SD.begin(芯片選擇)){ Serial.println("卡失敗,或不存在"); // 不要再做任何事情了: 返回; } // 打開文件。請注意,一次只能打開一個文件, // 所以你必須在打開另一個之前關閉這個。 文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE); // 如果文件可用,則寫入它: 如果(數(shù)據(jù)文件){ dataFile.println("日期、時間、溫度"); //寫入excel文件的第一行 數(shù)據(jù)文件.close(); } }
?
然后我們有寫入 SD 卡功能,用于將實際值記錄到我們剛剛創(chuàng)建的文本文件中。每次讀取新讀數(shù)時都會調(diào)用此函數(shù)。日志記錄的格式將以逗號分隔,例如“日期、時間、溫度”,示例日志將類似于“19.08.2020,10:45:17,35.6”。它可能有點難以閱讀,但這種格式稱為逗號分隔值,它可以很容易地被 Excel 打開和理解。使用 SD 卡進行數(shù)據(jù)記錄與我們之前構建的Arduino 數(shù)據(jù)記錄器項目非常相似。
?
無效 Write_SDcard() { // 打開文件。請注意,一次只能打開一個文件, // 所以你必須在打開另一個之前關閉這個。 文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE); // 如果文件可用,則寫入它: 如果(數(shù)據(jù)文件){ dataFile.print(rtc.getDateStr()); //在SD卡上存儲日期 數(shù)據(jù)文件.print(","); //使用“,”移動到下一列 dataFile.print(rtc.getTimeStr()); //在SD卡上存儲日期 數(shù)據(jù)文件.print(","); //使用“,”移動到下一列 dataFile.print(溫度);//在SD卡上存儲日期 數(shù)據(jù)文件.println(); //行尾移動到下一行 數(shù)據(jù)文件.close(); //關閉文件 } 別的 Serial.println("OOPS!! SD 卡寫入失敗"); }
?
繼續(xù)編寫代碼,我們有初始化設備的void setup函數(shù)。我們只是在 LCD 上顯示一些介紹信息,并初始化 SD 卡以供使用。這里沒有什么很嚴重的解釋。
?
無效設置(){ 序列號.開始(9600); rtc.begin(); lcd.begin(16, 2); lcd.print("溫度掃描儀"); lcd.setCursor(0,1); lcd.print("電路文摘"); pinMode(2,輸出); pinMode(嗡嗡聲,輸出); pinMode(紅色,輸出); pinMode(綠色,輸出); mlx.開始(); 數(shù)字寫入(嗡嗡聲,低); 數(shù)字寫入(紅色,低); 數(shù)字寫入(綠色,低); 初始化_SDcard(); }
?
接下來,在void 循環(huán)函數(shù)中,我們的代碼還獲取當前時間和日期并在 LCD 上更新。然后我們打開連接到 IR 發(fā)射器 LED 的數(shù)字引腳 2,并在連接 IR 接收器 LED 的 A7 中執(zhí)行模擬讀取。然后我們再次重復此操作,關閉 IR LED。這有助于我們測量紅外傳感器的噪聲和噪聲+信號值。然后我們只需從 Noise+Signal 值中減去 Noise 值即可得到 Signal 的值。
?
lcd.setCursor(0,1); lcd.print("日期:"); lcd.print(rtc.getDateStr()); 數(shù)字寫入(2,高);// 打開紅外燈 延遲微秒(500);// IR LED 的正向上升時間 Noise_P_Signal=analogRead(A7); // 從 A0 讀取值 => 噪聲+信號 數(shù)字寫入(2,低);//關閉紅外LED 延遲微秒(500);// IR LED 的下降時間 噪聲=模擬讀?。ˋ7);// 從 A0 讀取值 => 僅噪聲 信號 = 噪聲 - Noise_P_Signal;
?
信號值將告訴我們在不受人周圍陽光影響的情況下,人與 TCRT5000 IR 傳感器的距離有多近。然后通過比較這個信號值和噪聲值,我們將觸發(fā)我們的溫度計讀取溫度值并將其存儲在 SD 卡中。如果溫度正常,綠色 LED 會亮起,如果溫度高,紅色 LED 會亮起。
?
if (Signal>Range_sensitive && Noise >500) //dec. 增加憤怒的信號 { 數(shù)字寫入(嗡嗡聲,高); 如果(觸發(fā)器 == 真) Serial.println("開始") 數(shù)字寫入(2,低);//關閉紅外傳感器以避免干擾。 for (int i=1; i<=3; i++) { 溫度 = (mlx.get_object_temp()) + error_correction; Serial.println(溫度,1); 延遲(150); } 數(shù)字寫入(嗡嗡聲,低); lcd.clear(); lcd.setCursor(0,0); lcd.print("溫度:"); lcd.print(溫度,1); lcd.setCursor(0,1); lcd.print("保存到 SD 卡"); 寫_SD卡();
?
壁掛式溫度計外殼 - 組裝
在測試了硬件和代碼之后,我們可以將我們的項目組裝在一個永久性的外殼中,以將其安裝在一個設施中。為此,我們設計并制造了一個鈑金外殼。該設計考慮了項目中使用的 LCD 顯示器、LED 和其他組件的尺寸。然后將設計帶到激光切割車間,根據(jù)設計對鈑金進行切割和折彎。最后,它被用于粉末涂層以改善美學外觀并覆蓋金屬部件。
收到外殼后,我們只需將 LCD、DC 連接器和 LES 安裝到相應的插槽中即可。確保電子部件與金屬外殼絕緣良好。上圖顯示了組裝電子設備的外殼的底部和頂部。組裝完成后,外殼看起來像下面這樣。
壁掛式數(shù)字紅外測溫儀測試
組裝完成后,是時候測試設備了。我們使用外部 12V 1A 適配器為設備供電并將設備安裝在墻上。
如您所見,默認情況下設備將顯示時間和日期。如果有人走到設備傳感器前或伸出手,它會讀取人的溫度并顯示在屏幕上,如下圖所示。它還將在 SD 卡上存儲與時間和日期相同的值。
一天結束后,當所有溫度讀數(shù)都完成后,可以使用側面的插槽從設備中取出 SD 卡。只需將此 SD 卡連接到計算機,您就會找到一個名為Temp_Log.text的文件,其中包含設備獲取的所有溫度值。我在測試期間創(chuàng)建的錄制文件如下所示。
如您所見,在這樣的記事本上不容易讀取這些值。因此,最好使用 Microsoft Excel 打開文件。只需將其作為 CSV 文件打開并使用逗號作為分隔符。excel 文件將像這樣打開我們的數(shù)據(jù)。
/*帶 SD 記錄的壁掛式溫度掃描儀
* 網(wǎng)站:circuitdigest.com
* 代碼:B.Aswinth Raj
*/
浮動error_correction = 4;//將此添加到實際值
int Range_sensitivity = 200; //減小這個值來增加范圍
#define 嗡嗡聲 5
#定義綠色 3
#定義紅色 4
#include
#include "DS3231.h"
#include "MLX90615.h"
#include
#include
#include
DS3231 實時時鐘(SDA,SCL);//RTC通過I2C連接
液晶液晶(9、8、14、15、16、17);// 用接口引腳的編號初始化庫
MLX90615 mlx = MLX90615();
常量 int 芯片選擇 = 10; //SD卡CS引腳連接到Arduino的引腳4
詮釋噪音;
整數(shù)信號;
int Noise_P_Signal;
布爾觸發(fā)器=真;
浮動溫度;
浮動 pvs_溫度;
無效 Initialize_SDcard()
{
// 查看卡是否存在并且可以初始化:
如果(!SD.begin(芯片選擇)){
Serial.println("卡失敗,或不存在");
// 不要再做任何事情了:
返回;
}
// 打開文件。請注意,一次只能打開一個文件,
// 所以你必須在打開另一個之前關閉這個。
文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE);
// 如果文件可用,則寫入它:
如果(數(shù)據(jù)文件){
dataFile.println("日期、時間、溫度"); //寫入excel文件的第一行
數(shù)據(jù)文件.close();
}
}
無效 Write_SDcard()
{
// 打開文件。請注意,一次只能打開一個文件,
// 所以你必須在打開另一個之前關閉這個。
文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE);
// 如果文件可用,則寫入它:
如果(數(shù)據(jù)文件){
dataFile.print(rtc.getDateStr()); //在SD卡上存儲日期
數(shù)據(jù)文件.print(","); //使用“,”移動到下一列
dataFile.print(rtc.getTimeStr()); //在SD卡上存儲日期
數(shù)據(jù)文件.print(","); //使用“,”移動到下一列
dataFile.print(溫度);//在SD卡上存儲日期
數(shù)據(jù)文件.println(); //行尾移動到下一行
數(shù)據(jù)文件.close(); //關閉文件
}
別的
Serial.println("OOPS!! SD 卡寫入失敗");
}
無效設置(){
序列號.開始(9600);
rtc.begin();
lcd.begin(16, 2);
lcd.print("溫度掃描儀");
lcd.setCursor(0,1);
lcd.print("電路文摘");
pinMode(2,輸出);
pinMode(嗡嗡聲,輸出);
pinMode(紅色,輸出);
pinMode(綠色,輸出);
mlx.開始();
數(shù)字寫入(嗡嗡聲,低);
數(shù)字寫入(紅色,低);
數(shù)字寫入(綠色,低);
初始化_SDcard();
}
無效循環(huán)(){
lcd.setCursor(0,0);
lcd.print("時間:");
lcd.print(rtc.getTimeStr());
lcd.setCursor(0,1);
lcd.print("日期:");
lcd.print(rtc.getDateStr());
數(shù)字寫入(2,高);// 打開紅外燈
延遲微秒(500);// IR LED 的正向上升時間
Noise_P_Signal=analogRead(A7); // 從 A0 讀取值 => 噪聲+信號
數(shù)字寫入(2,低);//關閉紅外LED
延遲微秒(500);// IR LED 的下降時間
噪聲=模擬讀?。ˋ7);// 從 A0 讀取值 => 僅噪聲
信號 = 噪聲 - Noise_P_Signal;
if (Signal>Range_sensitive && Noise >500) //dec. 增加憤怒的信號
{
數(shù)字寫入(嗡嗡聲,高);
如果(觸發(fā)器 == 真)
Serial.println("開始");
數(shù)字寫入(2,低);//關閉紅外傳感器以避免干擾。
for (int i=1; i<=3; i++)
{
溫度 = (mlx.get_object_temp()) + error_correction;
Serial.println(溫度,1);
延遲(150);
}
數(shù)字寫入(嗡嗡聲,低);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("溫度:");
lcd.print(溫度,1);
lcd.setCursor(0,1);
lcd.print("保存到 SD 卡");
寫_SD卡();
如果(溫度>38)
{
數(shù)字寫入(紅色,高);
數(shù)字寫入(嗡嗡聲,高);
延遲(5000);
}
別的
{
數(shù)字寫入(綠色,高);
延遲(1000);
}
觸發(fā)器=假;
}
別的
{
延遲(100);
觸發(fā)器=真;
數(shù)字寫入(13,低);
Serial.println("position_error");
}
數(shù)字寫入(紅色,低);
數(shù)字寫入(嗡嗡聲,低);
數(shù)字寫入(綠色,低);
}
?
評論
查看更多