2020年10月2日 星期五

六、6-5 紅外線溫度感測器(MLX90614)實習


在前面介紹過的幾種溫度感測器不管是類比或式數位式的都有一個共同點就是在量測的時候都必須靠近或是直接接觸被測物但是在有些場合測量者可能不容易接近被測物或是被測物是有危險的高溫物體乃至是醫療上會有污染或是被感染的虞慮時前面介紹過的幾種溫度感測器就不適用了

一般遇到上面所提到的幾種特殊場合時大都會使用所謂的非接觸式的方式去測量待測物的溫度而本單元要介紹的MLX90614系列的紅外線感測器就是屬於其中之一。在物理學上來說熱能本身也是一種電磁波而且是一種波長很的電磁波其波長位於不可見光的紅外光附近不同熱度的溫度具有不同的波長此外其波長就和一般的電磁波一樣不會因為量測的距離而改變所以只要能測量到被測物所發出的熱能波長就可以計算出該物體的表面溫度了這就是一般紅外線溫度感測器的工作原理。

MLX90614這個系列的紅外線感測器是由奧地利Melexis公司所開發製造出來的而這個感測器其實是該公司由一顆編號為MLX81101紅外線熱電堆(Infra Red thermopile)偵測器加上另外一顆專用於紅外線信號處理的MLX90302晶片所組合而成此MLX90614系列的產品外觀與相關編號如下面的【圖六、6-5_1】所示


圖六、6-5_1  MLX90614XX紅外線溫度感測器外觀與產品編號特性規格表

(本圖片取材自Melexis公司的技術手冊僅此致謝)


綜合上面【圖六、6-5_1】的規格表來說這個MLX90614系列的紅外線感測器特性如下

1. 溫度測量範圍-40C ~ 85C(E系列)或-40C ~ 125C(K系列)

2. 溫度精確度10.5C(在0C ~ 50C時包括測量本體及待測物體)

3. 溫度精確度20.1C使用於醫療方面且測量溫度調整在一有限範圍內

4. 溫度解析度 0.02C

5. 工作電壓 :可選3V或5V

本實習所使用的MLX90614系列的紅外線感測器是目前市面上最普片的一款其編號為[MLX90614ESF-AAA] 也就是溫度測量範圍-40C ~ 85C的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開發板上除了D1D2這兩隻腳之外還多了兩組的I2C介面接腳供使用者選用


程式列表與說明

 

  1. #include <ESP8266WiFi.h>

  2. #include "index.h"

  3. #include <Adafruit_MLX90614.h>    // 引入MLX90614函式庫

  4.  

  5. Adafruit_MLX90614 mlx = Adafruit_MLX90614();  // 宣告MLX90614物件變數名稱

  6.  

  7. String softSsid = "ESP_softAP01";

  8. //String softSsid = "ESP"+String(ESP.getChipId());

  9. const char* softPassword = "12345678";

  10.  

  11. WiFiServer server(80);

  12.  

  13. String tmpString = "";    // html網頁程式字串變數

  14. unsigned int count = 0;   // 測輛次數值

  15. int rTime=3;              // 網頁更新時間

  16.  

  17.   // 初始化程式區setup()開始 :

  18. void setup() 

  19. {

  20.     Serial.begin(115200);

  21.     Serial.println();

  22.  

  23.   Serial.println("Setting soft-AP Mode... ");

  24.  

  25.   boolean result=WiFi.softAP(softSsid);

  26.   if(result==true)

  27.   {

  28.     Serial.println("soft-AP ready!");

  29.     Serial.print("softAP = ");

  30.     Serial.println(softSsid);

  31.     Serial.print("softIP = ");

  32.     Serial.println(WiFi.softAPIP());

  33.   server.begin();

  34.   }  

  35.   else

  36.     Serial.println("soft-AP failed"); 

  37.     

  38.   Serial.println();  

  39.   Serial.println("MLX90614 test!");  

  40.   mlx.begin();  // 初始化MLX90614

  41. } // setup()結束

  42.  

  43. // 主迴圈 loop()開始 :

  44. void loop() 

  45. {

  46.     // Check if a client has connected

  47.     WiFiClient client = server.available();

  48.     if (!client)    

  49.       return;  

  50.   count++;

  51.     tmpString = MAIN_page;    // 取出html網頁回應程式

  52.     tmpString.replace("%rTime%", String(rTime) ); // 帶入測量的時間值到網頁html程式中

  53.  

  54.   float oT=mlx.readObjectTempC();   // 讀取測試物體溫度值  

  55.   float aT=mlx.readAmbientTempC();  // 讀取MLX感測器本體體溫度值

  56.   Serial.print("Ambient = "); Serial.print(aT); 

  57.   Serial.print("*C\tObject = "); Serial.print(oT); Serial.println("*C");

  58.     tmpString.replace("%aTemp%", String(aT) );  // 帶入測量的周邊溫度值到網頁html程式中

  59.     tmpString.replace("%oTemp%", String(oT) );  // 帶入測量的測試物體溫度值

  60.     tmpString.replace("%count%", String(count) ); // 帶入測量次數

  61.  

  62.     client.flush();

  63.     client.print( tmpString );

  64.       

  65.     delay(5);

  66. } // loop() 結束

  67.  

  68. const char MAIN_page[] PROGMEM = R"=====(

  69. HTTP/1.1 200 OK

  70. Content-Type:text/html

  71. Connection: close

  72.  

  73. <!DOCTYPE html>

  74. <html>

  75.  <head>

  76.  <meta name='viewport' content='width=device-width, initial-scale=1.0'/>

  77.  <meta charset='utf-8'>

  78.  <meta http-equiv='refresh' content='%rTime%'>

  79.  <style>

  80.    body {font-size:100%;} 

  81.    #main {display: table; margin: auto;  padding: 0 10px 0 10px; } 

  82.  </style>

  83.    <title>Soft AP模式-MLX90614溫度測量</title>

  84.  </head>

  85.  

  86.  <body> 

  87.    <div id='main'>

  88.      <h2><center>[Soft AP模式] <br>

  89.          MLX90614紅外線溫度感測器測量實習<br></center><br>

  90.           本體溫度 =  %aTemp% *C<br>

  91.        測試物體溫度 =  %oTemp% *C<br>

  92.        Ambient Temp. =  %aTemp% *C<br>

  93.        Object Temp. =  %oTemp% *C<br>

  94.       Count = %count%<br>

  95.       </h2>

  96.    </div> 

  97.  </body>

  98. </html>

  99. )=====";



程式名稱: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感測器本體溫度值


至於5657行程式會把這兩個溫度轉換的結果顯示在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公司的技術手冊僅此致謝)


沒有留言:

張貼留言