在前面介紹過的幾種溫度感測器,不管是類比或式數位式的,都有一個共同點,就是在量測的時候都必須靠近或是直接接觸被測物;但是在有些場合測量者可能不容易接近被測物,或是被測物是有危險的高溫物體,乃至是醫療上會有污染或是被感染的虞慮時,前面介紹過的幾種溫度感測器就不適用了。
一般遇到上面所提到的幾種特殊場合時,大都會使用所謂的非接觸式的方式去測量待測物的溫度,而本單元要介紹的MLX90614系列的紅外線感測器就是屬於其中之一。在物理學上來說熱能本身也是一種電磁波,而且是一種波長很的電磁波,其波長位於不可見光的紅外光附近,不同熱度的溫度具有不同的波長;此外其波長就和一般的電磁波一樣,不會因為量測的距離而改變,所以只要能測量到被測物所發出的熱能波長,就可以計算出該物體的表面溫度了,這就是一般紅外線溫度感測器的工作原理。
MLX90614這個系列的紅外線感測器是由奧地利Melexis公司所開發製造出來的,而這個感測器其實是該公司由一顆編號為MLX81101紅外線熱電堆(Infra Red thermopile)偵測器,加上另外一顆專用於紅外線信號處理的MLX90302晶片所組合而成;此MLX90614系列的產品外觀與相關編號如下面的【圖六、6-5_1】所示:
圖六、6-5_1 MLX90614XX紅外線溫度感測器外觀與產品編號特性規格表
(本圖片取材自Melexis公司的技術手冊僅此致謝)
綜合上面【圖六、6-5_1】的規格表來說這個MLX90614系列的紅外線感測器特性如下:
1. 溫度測量範圍:-40∘C ~ 85∘C(E系列)或-40∘C ~ 125∘C(K系列)
2. 溫度精確度1:0.5∘C(在0∘C ~ 50∘C時包括測量本體及待測物體)
3. 溫度精確度2:0.1∘C,使用於醫療方面且測量溫度調整在一有限範圍內
4. 溫度解析度 :0.02∘C
5. 工作電壓 :可選3V或5V
本實習所使用的MLX90614系列的紅外線感測器是目前市面上最普片的一款,其編號為[MLX90614ESF-AAA] ,也就是溫度測量範圍為-40∘C ~ 85∘C的E系列,工作電壓為5V,只有單一紅外線測量點的標準包裝(TO-39)元件。
◎ 功能與動作說明:
1、以ESP8266建立一無線WiFi AP存取點(即Soft—AP模式),這個AP存取點的SSID名稱為『ESP_softAP01』,而且不使用連線密碼。
2、此AP存取點內建伺服器的IP位址為:[ 192.168.4.1 ]。
3、當有客戶端(Client:手機、平板或筆電)裝置以瀏覽器連線上此伺服器時,會將接在模組板上的MLX90614紅外線感測器所量測到的溫度回傳給連線客戶端,並顯示在瀏覽器的螢幕上。
4、如果客戶端裝置持續的連線,則系統會以固定的時間(在此為3秒)重新測量溫度感測器所量測到的溫/濕度值,並主動傳送給客戶端裝置。
圖六、6-5_3 MLX90614系列紅外線感測器客戶端瀏覽器連線後預期畫面
上面的【圖六、6-5_3】是本範例程式在客戶端瀏覽器連線後預期出現的畫面,和前面幾個範例類似,在此標記1實習名稱的提示訊息部分改成了『MLX90614紅外線溫度感測器測量實習』。而標記2的內容則是MLX90614紅外線溫度感測器測量到的溫度值,由於MLX90614是以非接觸方式測量目標物的溫度,其本身的外包裝是金屬的TO-39形式,因此其包裝外殼的周邊溫度也會因為輻射的關係影響到內部紅外線熱電堆所測量到的結果,所以MLX90614會送回本體封裝的溫度(Ta),與被測物體的溫度(To),好讓使用者在測量時可決定要不要做溫度補償與校正,所以在此範例中我們把這兩個溫度都讀取並顯示出來,而後續的矯正與補償動作由使用者自行決定是否要擴充。
◎電路圖:
圖六、6-5_4 MLX90614紅外線接腳與I2C介面接線圖
圖六、6-5_5 MLX90614感測器與NodeMcu與WeMos D1/R2 I2C介面電路圖
MLX90614這顆感測器除了用有I2C匯流排界面之外,還有所謂的PWM輸出信號,不過由於要準確的測量PWM的時脈寬度並不容易,所以一般還是使用I2C界面為主。【圖六、6-5_4】左邊是MLX90614這顆感測器的接腳位置底視圖,原廠建議最好在元件包裝電源腳上並接一個電容以過濾電源的雜訊,一般來說用0.1uf的電容值就可以。
【圖六、6-5_5】是MLX90614這顆感測器與NodeMcu與WeMos D1 R2的接線圖,在NodeMcu上SCL是接在🡪D1(GPIO5),而SDA則是接在🡪D2(GPIO4);至於WeMos D1 R2開發板上除了D1、D2這兩隻腳之外,還多了兩組的I2C介面接腳供使用者選用。
◎ 程式列表與說明:
#include <ESP8266WiFi.h>
#include "index.h"
#include <Adafruit_MLX90614.h> // 引入MLX90614函式庫
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // 宣告MLX90614物件變數名稱
String softSsid = "ESP_softAP01";
//String softSsid = "ESP"+String(ESP.getChipId());
const char* softPassword = "12345678";
WiFiServer server(80);
String tmpString = ""; // html網頁程式字串變數
unsigned int count = 0; // 測輛次數值
int rTime=3; // 網頁更新時間
// 初始化程式區setup()開始 :
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("Setting soft-AP Mode... ");
boolean result=WiFi.softAP(softSsid);
if(result==true)
{
Serial.println("soft-AP ready!");
Serial.print("softAP = ");
Serial.println(softSsid);
Serial.print("softIP = ");
Serial.println(WiFi.softAPIP());
server.begin();
}
else
Serial.println("soft-AP failed");
Serial.println();
Serial.println("MLX90614 test!");
mlx.begin(); // 初始化MLX90614
} // setup()結束
// 主迴圈 loop()開始 :
void loop()
{
// Check if a client has connected
WiFiClient client = server.available();
if (!client)
return;
count++;
tmpString = MAIN_page; // 取出html網頁回應程式
tmpString.replace("%rTime%", String(rTime) ); // 帶入測量的時間值到網頁html程式中
float oT=mlx.readObjectTempC(); // 讀取測試物體溫度值
float aT=mlx.readAmbientTempC(); // 讀取MLX感測器本體體溫度值
Serial.print("Ambient = "); Serial.print(aT);
Serial.print("*C\tObject = "); Serial.print(oT); Serial.println("*C");
tmpString.replace("%aTemp%", String(aT) ); // 帶入測量的周邊溫度值到網頁html程式中
tmpString.replace("%oTemp%", String(oT) ); // 帶入測量的測試物體溫度值
tmpString.replace("%count%", String(count) ); // 帶入測量次數
client.flush();
client.print( tmpString );
delay(5);
} // loop() 結束
const char MAIN_page[] PROGMEM = R"=====(
HTTP/1.1 200 OK
Content-Type:text/html
Connection: close
<!DOCTYPE html>
<html>
<head>
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<meta charset='utf-8'>
<meta http-equiv='refresh' content='%rTime%'>
<style>
body {font-size:100%;}
#main {display: table; margin: auto; padding: 0 10px 0 10px; }
</style>
<title>Soft AP模式-MLX90614溫度測量</title>
</head>
<body>
<div id='main'>
<h2><center>[Soft AP模式] <br>
MLX90614紅外線溫度感測器測量實習<br></center><br>
本體溫度 = %aTemp% *C<br>
測試物體溫度 = %oTemp% *C<br>
Ambient Temp. = %aTemp% *C<br>
Object Temp. = %oTemp% *C<br>
Count = %count%<br>
</h2>
</div>
</body>
</html>
)=====";
程式名稱:ESP_CH6_6_5_MLX90614.ino
因為MLX90614這顆紅外線溫度感測器並不是Arduino IDE中的標準內建元件,所以必須另外加裝相關的函示庫之後才能引用,上面程式中第3行便是引用了<Adafruit_MLX90614.h>這個函式庫,而第5行則是宣告程式中MLX90614所使用的物件變數名稱(在此為”mlx”)。
3. #include <Adafruit_MLX90614.h> // 引入MLX90614函式庫
4.
5. Adafruit_MLX90614 mlx = Adafruit_MLX90614();
要按裝<Adafruit_MLX90614.h>這個函示庫,請先在Arduino IDE中點選上方的【草稿碼】🡺【匯入程式庫】🡺【管理程式庫】,在看到下面的【圖六、6-4_5】程式庫管理員視窗後,在標記1的欄位輸入『MLX90614』搜尋字串,便可以找到標記2的目標函式庫,然後在標記3的地方選擇所需的版本(一般都會選擇最新的版本),並按下[安裝]鍵,便可安裝成功。
圖六、6-4_5 『Adafruit_MLX90614.h』函式庫安裝畫面
本範例程式的初始化程式區(setup())內容和前面幾個實習非常類似,差別只在下面這行用來初始化MLX90614的指令而已:
40. mlx.begin(); // 初始化MLX90614
由於MLX90614使用的是I2C匯流排介面,因此在初始化時便會指定使用ESP8266內建的SCL/D1(GPIO5)及SDA/D2(GPIO4)這兩根接腳,不必再另外宣告I2C匯流排使用的腳位。
在主迴圈(loop())程式中一開始同樣是在等待客戶端連線(47~49行),當有客戶端裝置連線時會先把連線次數(count)加一,並把網頁首頁程式碼MAIN_page[]傳送到「tmpString」這個字串變數中,同時也把測量的時間間格值(即'rTime')帶入到網頁html程式中:
50. count++;
51. tmpString = MAIN_page; // 取出html網頁回應程式
52. tmpString.replace("%rTime%", String(rTime) );
接著我們用下面這兩行程式分別取讀取MLX90614所量測到的目標物溫度(oT)轉換值,與MLX90614感測器本體的包裝溫度值(aT):
54. float oT=mlx.readObjectTempC(); // 讀取測試物體溫度值
55. float aT=mlx.readAmbientTempC(); // 讀取MLX感測器本體溫度值
至於56、57行程式會把這兩個溫度轉換的結果顯示在Arduino IDE的序列監控視窗中,以便偵錯之用。
58. tmpString.replace("%aTemp%", String(aT) ); // 帶入MLX90614感測器本體的包裝溫度值到網頁html程式中
59. tmpString.replace("%oTemp%", String(oT) ); // 帶入量測到的目標物溫度值
60. tmpString.replace("%count%", String(count) ); // 帶入測量次數
上面的3行程式會把MLX90614所量測到的目標物溫度(oT)轉換值,與MLX90614本體的包裝溫度值(aT)與量測次數值(count)分別帶入「tmpString」這個字串變數中的「aTemp」、「oTemp」、「count」3個變數中,最後執行下列程式,便可以把從MLX90614所量測到的結果回應給連線的客戶端瀏覽器。
63. client.println( tmpString );
程式列表的68~99行是ESP8266內建伺服器的網頁首頁程式碼,在此放在Arduino程式中的「index.h」分頁上,整個html程式的字串變數名稱跟之前一樣命名為「MAIN_page[]」。為了能讓客戶端的瀏覽器能更快的自動定時讀取更新的量測結果,在行程式中一樣把更新時間加快到3秒鐘;不過為了能讓程式更有彈性,所以在此是以參數(即'%rTime%')的方式去定義,這樣我們在主程式中或者說使用者,就可以更方便的去更改系統測量刷新時間了!
78. <meta http-equiv='refresh' content='%rTime%'>
【圖六、6-5_3】的中標記1也就是本實習名稱的提示訊息部分,是由下面兩行程式完成:
88. <h2><center>[Soft AP模式] <br>
89. MLX90614紅外線溫度感測器測量實習<br></center><br>
而網頁中MLX90614所量測到的目標物溫度(oT)轉換值,與MLX90614本體的包裝溫度值(aT)的部分,則是由下面幾行程式去實現:
90. 本體溫度 = %aTemp% *C<br>
91. 測試物體溫度 = %oTemp% *C<br>
92. Ambient Temp. = %aTemp% *C<br>
93. Object Temp. = %oTemp% *C<br>
94. Count = %count%<br>
「count」同樣代表MLX90614測量結果網頁更新的次數,這三個字串置換變數都是由前面58~60行的程式所傳送過來的。
◎ 執行結果:
圖六、6-5_6 使用MLX90614溫度感測器客戶端瀏覽器連線後量測畫面
【圖六、6-5_6】是客戶端瀏覽器與系統連線後,系統上的MLX90614開始測量的畫面,左邊畫面是MLX90614置於桌面時所量到的溫度,而中間的畫面是以手掌置於MLX90614前方5公分左右所量到的手部溫度值,最右邊的部分則是近接(約10公分)測量烙鐵頭時測得的結果。由於本次實習所使用編號為[MLX90614ESF-AAA]的感測器其FOV(Field of View)為90度,如下面【圖六、6-5_7】所示,當被測物與感測器的距離越遠時,由於周邊的熱也會輻射到感測器中,因此會影響測量結果的正確性,而且越遠越嚴重!為了減少這個問題所造成的影響,就必須在感測器的前方加上過濾周邊熱源的裝置,一般最簡單方式就是使用中空柱狀的管子以縮小FOV,並塗上消光黑色的塗料,以吸收雜訊熱源信號。
圖六、6-5_6 MLX90614溫度感測器FOV視角與測量距離特性曲線
(本圖片取材自Melexis公司的技術手冊僅此致謝)
沒有留言:
張貼留言