在調(diào)試電子電路或測(cè)試新的硬件設(shè)計(jì)時(shí),我經(jīng)常傾向于通過觸摸它們來檢查板上的組件是否異常變熱。如果出現(xiàn)問題(通常是第一次嘗試),這些組件可能會(huì)變得高達(dá) 80°C 或更高,不僅會(huì)燒毀組件,還會(huì)燒毀我的手指。在燒傷手指的次數(shù)比我記得的要多之后,我決定使用 Arduino 和紅外溫度傳感器構(gòu)建自己的溫度槍。這款熱槍將使用名為MLX90614的非接觸式溫度傳感器制造; 因此,它不僅可以用于測(cè)量組件溫度,還可以用于測(cè)量體溫、表面溫度、熱通風(fēng)等。當(dāng)然,這些熱敏槍在市場(chǎng)上很容易從 Fluke、Flir 等知名制造商那里買到。但它們并不容易放在你的口袋里,而且最重要的是,這比構(gòu)建自己的小工具更有趣。
所需材料
Arduino Pro 迷你
MLX90614 紅外溫度傳感器
激光二極管
9V電池
按鈕
電池夾
連接線
MLX90614 紅外測(cè)溫儀
在繼續(xù)本教程之前,了解 MLX90614 傳感器的工作原理非常重要。市場(chǎng)上有許多溫度傳感器,我們一直在將DHT11 傳感器和LM35廣泛用于許多必須測(cè)量大氣濕度或溫度的應(yīng)用。
在這里,對(duì)于熱敏槍,我們需要一個(gè)傳感器,它可以感應(yīng)特定物體(不是環(huán)境)的溫度,而無需直接與物體接觸。為此,我們有接觸較少的溫度傳感器,它利用激光或紅外線來計(jì)算物體的溫度。MLX90614 就是這樣一種傳感器,它使用紅外能量來檢測(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)物體溫度值。
MLX90614 紅外溫度傳感器特性:
工作電壓:3.6V 至 5V
物體溫度范圍:-70°C 至 382.2°C
環(huán)境溫度范圍:-40°C 至 125°C
分辨率/準(zhǔn)確度:0.02°C
傳感器和物體之間的距離應(yīng)該是多少?
數(shù)據(jù)表沒有直接回答的一個(gè)問題是傳感器和物體之間的測(cè)量距離。該距離的值由術(shù)語視野 (FOV)給出,對(duì)于我們的傳感器,視野約為 80°。
您可以將感應(yīng)范圍從傳感器的點(diǎn)看成錐形,如上圖所示。因此,當(dāng)我們遠(yuǎn)離測(cè)量對(duì)象時(shí),感應(yīng)區(qū)域會(huì)增加兩倍。這意味著我們距離物體每移動(dòng) 1 厘米,感應(yīng)區(qū)域就會(huì)增加 2 厘米。在我們的熱槍中,我們?cè)趥鞲衅黜敳糠胖昧艘粋€(gè)激光二極管,以了解傳感器的感應(yīng)區(qū)域當(dāng)前指向的位置。我發(fā)現(xiàn)如果槍指向距離物體 2 厘米的地方,這些值是可靠的,并且隨著我們離開,精度會(huì)下降。
Arduino MLX90614溫度計(jì)電路圖
紅外線溫度計(jì)的電路圖非常簡(jiǎn)單。完整的電路如下所示,它是使用 Fritzing 軟件創(chuàng)建的。
由于 Fritzing 軟件不支持 MLX90614 傳感器的部件,我們使用注釋來提及其連接,如上所示,我們還使用紅色 LED 代替激光二極管。整個(gè)電路通過一個(gè)按鈕由 9V 電池供電。當(dāng)按下按鈕時(shí),9V 電池連接到 Arduino 的 RAW 引腳,然后使用板載穩(wěn)壓器將其調(diào)節(jié)為 5V。然后使用這個(gè) 5V 為 OLED 模塊、傳感器和激光二極管供電。
我們已經(jīng)學(xué)習(xí)了如何將SSD1306 OLED 與 Arduino連接,此處將使用相同的硬件和代碼。如果您需要更強(qiáng)大的激光束,您也可以設(shè)計(jì)一個(gè)單獨(dú)的激光二極管驅(qū)動(dòng)電路。
溫度槍外殼設(shè)計(jì)
為了使項(xiàng)目更有趣和更實(shí)用,我們?yōu)槲覀兊臒崦魳屵M(jìn)行了 3D 建模和打印外殼。該設(shè)計(jì)包括兩個(gè)部分,一個(gè)是頂部,作為槍身,裝有 Arduino 控制器、OLED、傳感器和激光二極管。另一個(gè)是底部,用作容納電池和按鈕的槍的手柄。此處的按鈕用作觸發(fā)器。該模型如下所示。
設(shè)計(jì)文件可從thingiverse 下載;您可以下載設(shè)計(jì)并使用 3D 打印機(jī)進(jìn)行打印,也可以根據(jù)需要進(jìn)行修改。下載鏈接如下
3D打印外殼:
然后將該模型保存為 STL 文件并使用 Cura 轉(zhuǎn)換為 G 代碼。我用我的 Tevo tarantula 打印機(jī)打印了我的兩個(gè)零件,然后將它們擰在一起。如果您的打印機(jī)支持,也可以將這兩個(gè)部分打印為單件。我打印的切片設(shè)置如下所示
我花了將近 6 個(gè)小時(shí)來打印這兩個(gè)部件,一旦打印了硬件連接,我就分別使用傳感器和 OLED 顯示器的 7 針和 4 針 Relimate 連接器 (RMC) 直接將電線直接焊接到 Arduino 針上。然后使用螺釘將 OLED 安裝在印刷部件中,同時(shí)使用熱膠安裝傳感器和激光二極管。然后將電源引腳(Raw,Gnd)通過一根電線向下滑動(dòng),用于由按鈕和電池組成的手柄部分。然后通過按鈕將這些電線連接到電池。組裝完成后,熱槍如下所示
您可以繼續(xù)為頂部設(shè)計(jì)封面,但我決定將其保持打開狀態(tài),以便以后如有需要可以對(duì)其進(jìn)行調(diào)整。
Arduino MLX90614 紅外溫度計(jì)編程
Arduino 程序應(yīng)從 MLX90614 讀取溫度值并將其顯示在 OLED 顯示屏上。幸運(yùn)的是,該程序?qū)⒎浅:?jiǎn)單,因?yàn)?a target="_blank">Adafruit 為我們提供了一個(gè)庫,可以輕松地從 MLX90614 讀取數(shù)據(jù)。
該鏈接會(huì)將庫下載為 ZIP 文件夾。下載后,按照命令Sketch -》 Include Library -》 Add .ZIP Library將其添加到 Arduino IDE并瀏覽此 ZIP 文件的位置。還要確保您已遵循OLED 與 Arduino 接口的教程,以便您也安裝了 OLED 顯示模塊所需的庫。添加庫后,我們可以開始我們的程序,該項(xiàng)目的完整程序可以在此頁面底部找到。這里將用小片段解釋相同的程序。
像往常一樣,我們通過添加所需的庫文件開始程序。這里 Wire 庫(內(nèi)置)用于使用 I2C 協(xié)議進(jìn)行通信,SparkFunML90614 庫用于與傳感器進(jìn)行通信。SPI、GFX 和 SSD1306 庫用于通過 4 線 SPI 協(xié)議與 OLED 顯示模塊進(jìn)行通信。
#include 《Wire.h》
#include 《SparkFunMLX90614.h》
#include 《SPI.h》
#include 《Adafruit_GFX.h》
#include 《Adafruit_SSD1306.h》
然后,我們定義我們已建立連接的 OLED 顯示器的引腳。由于該模塊與 SPI 一起使用,我們使用了 Arduino 的 SPI 引腳。有些 OLED 顯示器也適用于 I2C 協(xié)議,但我們不能在這里使用它們,因?yàn)?I2C 引腳已經(jīng)被溫度計(jì)傳感器占用。
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
在void setup()函數(shù)中,我們使用我們之前創(chuàng)建的對(duì)象therm初始化用于調(diào)試的串行監(jiān)視器以及 IR 溫度傳感器。在印度,最受關(guān)注的溫度單位是??攝氏度(攝氏度),因此我們使用TEMP_C設(shè)置了單位,如果您需要將值設(shè)為華氏 (F),您也可以將其更改為TEMP_F 。最后我們初始化OLED顯示屏并清除它的顯示。此外,OLED 屏幕可旋轉(zhuǎn) 180 度,以便于安裝在外殼中。
無效設(shè)置()
{
序列。開始(9600);
熱。開始();
therm.setUnit(TEMP_C);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setRotation(2);
}
在循環(huán)函數(shù)內(nèi)部,我們從傳感器讀取溫度值并將其轉(zhuǎn)換為字符串以顯示在 OLED 顯示屏上。我們還在串行監(jiān)視器上打印了該值以進(jìn)行調(diào)試。我們還增加了一個(gè)名為 runner 的變量,每次成功更新溫度傳感器的值時(shí),它都會(huì)在屏幕上產(chǎn)生一個(gè)小動(dòng)畫,這將有助于我們了解讀數(shù)是否由于某種原因而卡住。
if (therm.read()) // 成功時(shí),read() 將返回 1,失敗時(shí)返回 0。
{
temperature = String(therm.object(), 2);
Serial.print(“對(duì)象:”);
串行打印(溫度);Serial.println(“C”);
display.clearDisplay();
亞軍++;
延遲(5);
}
測(cè)試 Arduino 熱槍
一旦 Arduino 代碼準(zhǔn)備就緒,我們可以使用外部 TTL 編程器或 FTDI 板將其上傳到我們的硬件,因?yàn)?pro mini 沒有板載。然后只需按下按鈕觸發(fā)熱敏槍,您會(huì)注意到激光束落在物體上,并且物體的溫度顯示在 OLED 屏幕上,如下圖所示。在這里,我用它來測(cè)量激光束指向的組件的溫度。
熱風(fēng)槍還在烙鐵、3D打印機(jī)噴嘴、冰塊等上進(jìn)行了測(cè)試,觀察到了令人滿意的結(jié)果。
Arduino MLX90614 非接觸式溫度計(jì)
MLX90614 I2C 連接
OLED 4 線 SPI 的代碼連接
日期:2019 年 7 月 6 日
代碼作者:Aswint Raj
**********************************/
#include
#include
#include
#include
#include
// 如果使用軟件 SPI(默認(rèn)情況):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
IRTherm 熱;
無效設(shè)置()
{
序列.開始(9600);
熱.開始();
therm.setUnit(TEMP_C);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setRotation(2);
}
字符串溫度;
字符亞軍;
void loop()
{
if (therm.read()) // 成功時(shí),read() 將返回 1,失敗時(shí)返回 0。
{
temperature = String(therm.object(), 2);
Serial.print("對(duì)象:");
串行打印(溫度);Serial.println("C");
display.clearDisplay();
亞軍++;
延遲(5);
}
display.setTextSize(2);
display.setTextColor(白色);
display.setCursor(display.width()/4,display.height()/12);
if (therm.object()>=100)
display.setCursor(display.width()/4,display.height()/12);
display.println(溫度);
display.drawLine(display.width()/runner,display.height() - display.height()/2.5, display.width()/runner+1, display.height() - display.height()/2.5,白色的);
display.setCursor(0,display.height()-display.height()/4);
display.setTextSize(1);
display.println("Arduino Thermlgun");
display.setCursor(display.width()- display.width()/4,display.height()/12);
display.println("攝氏度");
顯示.顯示();
如果(跑步者> 20)
跑步者= 0;
}
評(píng)論
查看更多