用Arduino來做紅外線非接觸式體溫溫度計吧! ~新增按鈕功能~

之前我們有在FB分享防疫小尖兵-用Arduino來做溫度計吧!

我們使用MLX90615紅外線非接觸溫度計感測器連接Arduino與OLED,就能夠即時看到偵測到的溫度呢,當身體接近感測器時就能夠明顯看出溫度的變化喔!

 

今天就來完整教學如何製作吧!

作者/攝影 郭俊廷
時間

3HR

難度

 ★★☆☆☆

材料表

關於MLX90615紅外線非接觸溫度計感測器(以下簡稱MLX90615)如何連接Arduino與OLED,我們今天就來分享如何自己製作呢!

首先先來看看我們執行的成果影片:

一、硬體接線

首先要先查看我們的硬體的腳位是什麼?如何接線到Arduino呢?

我們先來查看MLX90615的Datasheet(相關檔案請至下方連結下載)

MLX90615-Datasheet-Melexis.pdf

根據MLX90615的Datasheet的圖表(如下圖) 查看我們需要在SDA跟SCL腳位放一個300K的提升電阻,VSS接地,VDD接電源
這個提升電阻是由於這個電路是使用開汲極設計的,是為了提供導通電流,確保高低電位的電壓準位而使用的。

而在大部份的 Arduino板子上,SDA接在analog pin 4,而SCL接在 analog pin 5。

OLED的部分我們採用I2C的介面,一樣接在A4跟A5。

MLX90615腳位圖表(引用自MLX90615-Datasheet-Melexis.pdf

MLX90615跟Arduino接腳對應表

MLX90615 Arduino
VCC 3.3V
SDA A4
SCL A5
GND GND

OLED跟Arduino接腳對應表

OLED Arduino
VCC 5V
SDA A4
SCL A5
GND GND

 

接下來,請新增了一個按鈕的功能,當按下按鈕時OLED畫面才會顯示目前增測到的溫度,顯示五秒後即清除顯示畫面,直到再按下按鈕才會再次顯示溫度。

按鈕的部分我們使用按下去狀態為0的按鈕。

 

按鈕跟Arduino接腳對應表:

按鈕 Arduino
V 3.3V
G GND
S D3

 

根據腳位圖表所提供的資訊我們的電路圖設計如下:

MLX90615、OLED、按鈕、Arduino整體電路接線圖

實際使用按鈕時的影片如下:

二、程式設計

首先我們要匯入相關的程式庫

第一個是MLX90615的程式庫 根據下列網址把函式庫下載完解壓縮至自己使用的Arduino所在的libraries資料夾( 如下圖) ,或是使用ZIP檔匯入程式庫

https://github.com/skiselev/MLX90615

MLX90615解壓縮至函式庫資料夾

 

接著還要下載OLED顯示功能的程式庫U8g2,可以在管理程式庫裡搜尋U8g2 by oliver的程式庫( 如下圖)

點選工具、管理程式庫裡進入搜尋介面

 

搜尋U8g2並下載最新版本

 

下載完成開始設計我們的程式

[pastacode lang=”python” manual=”%2F%2F%E9%A6%96%E5%85%88%E5%AE%9A%E7%BE%A9%E6%9C%83%E4%BD%BF%E7%94%A8%E5%88%B0%E7%9A%84%E7%A8%8B%E5%BC%8F%E5%BA%AB%0A%23include%20%3CWire.h%3E%0A%23include%20%3Cmlx90615.h%3E%0A%23include%20%3CU8g2lib.h%3E%0A%0A%2F%2F%E9%80%99%E8%A3%A1%E6%98%AF%E5%AE%9A%E7%BE%A9MLX90615%E6%89%80%E5%BE%97%E5%88%B0%E7%9A%84%E5%80%BC%E8%B7%9FU8G2%E4%BD%BF%E7%94%A8%E4%BB%80%E9%BA%BC%E5%9E%8B%E8%99%9F%E5%B0%BA%E5%AF%B8%E7%9A%84OLED%0AMLX90615%20mlx%20%3D%20MLX90615()%3B%0AU8G2_SSD1306_128X64_NONAME_2_HW_I2C%20u8g2(U8G2_R0%2C%20%2F*%20reset%3D*%2F%20U8X8_PIN_NONE)%3B%0A%0A%2F%2F%E9%80%99%E8%A3%A1%E9%96%8B%E5%A7%8B%E5%AE%9A%E7%BE%A9OLED%E4%B8%8A%E8%A6%81%E5%8D%B3%E6%99%82%E9%A1%AF%E7%A4%BA%E7%9A%84%E7%95%AB%E9%9D%A2%E6%9C%89%E4%BB%80%E9%BA%BC%0Avoid%20draw(void)%20%7B%0Au8g2.setFont(u8g2_font_helvB24_tf%20)%3B%2F%2F%E5%AE%9A%E7%BE%A9%E8%A6%81%E9%A1%AF%E7%A4%BA%E4%BB%80%E9%BA%BC%E5%AD%97%E5%9E%8B%0Au8g2.drawStr(10%2C30%2C%22TEMP%3A%22)%3B%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%A8%AD%E5%AE%9A%E5%9C%A810%E8%A1%8C30%E5%88%97%E7%9A%84%E4%BD%8D%E7%BD%AE%E9%A1%AF%E7%A4%BATEMP%3A%0Au8g2.setCursor(10%2C%2060)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%A8%AD%E5%AE%9A%E5%9C%A810%E8%A1%8C60%E5%88%97%E7%9A%84%E4%BD%8D%E7%BD%AE%20%20%20%20%20%20%20%20%0Au8g2.print(mlx.get_object_temp()%2C1)%3B%20%20%2F%2F%E9%A1%AF%E7%A4%BA%E5%BE%97%E5%88%B0%E7%9A%84%E7%9B%AE%E6%A8%99%E6%BA%AB%E5%BA%A6%E6%95%B8%E5%80%BC%E5%88%B0%E5%B0%8F%E6%95%B8%E9%BB%9E%E4%B8%80%E4%BD%8D%0Au8g2.drawStr(80%2C60%2C%22%5C260C%22)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%A8%AD%E5%AE%9A%E5%9C%A880%E8%A1%8C60%E5%88%97%E7%9A%84%E4%BD%8D%E7%BD%AE%E9%A1%AF%E7%A4%BA%E2%84%83%0A%7D%0A%0A%2F%2F%E9%80%99%E8%A3%A1%E5%AE%9A%E7%BE%A9u8g2%E9%96%8B%E5%A7%8B%E8%A8%AD%E5%AE%9A%E5%BA%8F%E5%88%97%E5%9F%A0%E9%AE%91%E7%8E%87%E8%B7%9F%E5%81%B5%E6%B8%ACMLX90615%E6%9C%89%E7%84%A1%E6%AD%A3%E5%B8%B8%E8%AE%80%E5%8F%96%E9%A1%AF%E7%A4%BA%E5%AE%83%E7%9A%84ID%0Avoid%20setup()%20%7B%0A%20%20u8g2.begin()%3B%0A%20%20Serial.begin(9600)%3B%0A%20%20Serial.println(%22Melexis%20MLX90615%20infra-red%20temperature%20sensor%20test%22)%3B%0A%20%20mlx.begin()%3B%0A%20%20Serial.print(%22Sensor%20ID%20number%20%3D%20%22)%3B%0A%20%20Serial.println(mlx.get_id()%2C%20HEX)%3B%0A%7D%0A%0A%2F%2F%E9%87%8D%E8%A6%86%E5%9F%B7%E8%A1%8C%E7%9A%84%E9%83%A8%E5%88%86%E8%A8%AD%E5%AE%9A%E5%9C%A8%E5%BA%8F%E5%88%97%E5%9F%A0%E4%B8%8A%E9%A1%AF%E7%A4%BAMLX90615%E5%85%A7%E9%83%A8%E7%92%B0%E5%A2%83%E6%BA%AB%E5%BA%A6%E8%B7%9F%E6%B8%AC%E9%87%8F%E7%9B%AE%E6%A8%99%E6%BA%AB%E5%BA%A6%EF%BC%8C%E9%82%84%E6%9C%89%E8%A8%AD%E5%AE%9A%E4%B8%80%E7%9B%B4%E6%9B%B4%E6%96%B0OLED%E7%9A%84%E9%A1%AF%E7%A4%BA%E7%95%AB%E9%9D%A2%0Avoid%20loop()%20%7B%0A%20%20Serial.print(%22Ambient%20%3D%20%22)%3B%0A%20%20Serial.print(mlx.get_ambient_temp())%3B%20%2F%2Fambient%20temperature%0A%20%20Serial.print(%22%20*C%5CtObject%20%3D%20%22)%3B%0A%20%20Serial.print(mlx.get_object_temp())%3B%20%2F%2Fobject%20temperature%0A%20%20Serial.println(%22%20*C%22)%3B%0A%20%20delay(500)%3B%0A%0A%2F%2F%E9%80%99%E8%A3%A1%E9%96%8B%E5%A7%8B%E5%88%A4%E6%96%B7%E6%9C%89%E7%84%A1%E6%8C%89%E6%8C%89%E9%88%95%E7%95%B6%E6%9C%89%E6%8C%89%E4%B8%8B%E6%8C%89%E9%88%95(%E4%BD%8E%E9%9B%BB%E4%BD%8D)%E7%9A%84%E6%99%82%E5%80%99%E5%9F%B7%E8%A1%8C%E9%A1%AF%E7%A4%BAOLED%E7%95%AB%E9%9D%A2%E4%BA%94%E7%A7%92%E6%B2%92%E6%9C%89%E6%8C%89%E4%B8%8B%E6%8C%89%E9%88%95%E5%89%87%E6%B8%85%E9%99%A4%E7%95%AB%E9%9D%A2%0Aif(digitalRead(3)%3D%3DLOW)%0A%7B%0A%20%20u8g2.firstPage()%3B%0A%20%20do%20%7B%0A%20%20draw()%3B%0A%20%20%7D%20while(%20u8g2.nextPage()%20)%3B%0A%20%20delay(5000)%3B%0A%7D%0Aelse%0A%7B%0A%20%20u8g2.clearDisplay()%3B%0A%7D%0A%0A%0A%7D” message=”” highlight=”” provider=”manual”/]

以上我們的程式碼解說到這裡

 

三、執行成果

我們使用KEYES Arduino UNO R3超夠力版(商品連結,請點我)來當我們的Arduino開發板,

它有另外把I2C腳位拉出來方便我們接線,

實際測量的畫面如下:

沒有手指接近時的溫度

 

手指接近時的溫度

 

沒按按鈕時OLED不會顯示溫度

 

按按鈕時OLED會顯示溫度五秒鐘

 

以上就是我們使用MLX90615、OLED、按鈕、Arduino實作溫度計的教學,喜歡DIY的朋友們也可以嘗試看看自己焊在麵包板上讓它移動更方便更容易測量其他地方的溫度歐。

*注意此專題為Maker專題分享,非醫療用途。

 

參考資源:

U8g2 相關教學:https://www.twblogs.net/a/5d207eeabd9eee1e5c83a6bb

 

補充說明:

  • 有人反映編譯時會出現以下警告,這是因為原本在使用full buffer模式顯示OLED上的文字可以讓文字顯示的頻率更快,但也會使用到較多記憶體,因此改成使用page buffer模式顯示即可使用較少記憶體。
  • 草稿碼使用了 17874 bytes (58%) 的程式儲存空間。上限為 30720 bytes。
  • 全域變數使用了 1831 bytes (89%) 的動態記憶體,剩餘 217 bytes 給區域變數,上限為 2048 bytes 。

可用記憶體低下,可能會出現穩定性問題。

 

相關參考資料可以查看u8g2套件作者github網站說明:

https://github.com/olikraus/u8g2/wiki/setup_tutorial#u8g2-full-buffer–page-buffer-and-u8x8-mode

2 thoughts on “用Arduino來做紅外線非接觸式體溫溫度計吧! ~新增按鈕功能~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *