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