Arduino 非接觸式溫度計|GY-906+0.91 吋 OLED

用Arduino搭配GY-906紅外線測溫模組與0.91吋OLED顯示器,打造非接觸式溫度計。透過I2C介面同時連接兩個模組,即時將物體表面溫度顯示在螢幕上。

Arduino 非接觸式溫度計|GY-906+0.91 吋 OLED

大家還記得疫情期間,天天用的溫度計嗎?今天這篇教學就是要用 GY-906(MLX90614)紅外線測溫模組搭配 0.91 吋 OLED 顯示器,打造一個迷你非接觸式溫度計。


關於 GY-906(MLX90614)

GY-906 模組的核心是 Melexis 的 MLX90614 紅外線溫度感測器。它利用偵測物體發出的紅外線輻射來計算溫度,完全不需要接觸目標物。

主要規格如下:

  • 測量範圍:-70°C ~ 380°C(物體溫度)
  • 精度:±0.5°C(0~50°C 範圍)
  • 通訊介面:I2C(預設位址 0x5A
  • 工作電壓:3V ~ 5V

材料清單

材料 數量
Arduino UNO 1
GY-906(MLX90614)模組 1
0.91 吋 OLED 顯示器(I2C,SSD1306) 1
麵包板 1
杜邦線 若干
Arduino紅外線非接觸式測溫器DIY套件 GY-906+OLED 0.91吋
傑森創工獨家提供!數量有限,賣完就要預夠囉! 程式和線路圖皆由傑森設計,實測OK! 本商品非醫療器材,只提供DIY實驗。 套件內容: GY-906模組、Arduino UNO開發板、OLED 0.91吋、原型擴展板、電池扣、杜邦線足量、4孔長針排母(方便架高MLX90615) 範例程式下載:http://jmaker.banner.tw/doc/MLX90615_OLED.zip
GY-906 MLX90614 非接觸式 紅外線 溫度感測模組 附排針 Arduino適用
模塊型號:GY-906 使用晶片:MLX90614 供電電源:3-5v(內部低壓差穩壓) 通信方式:標準IIC通信協議 Up for sale is a MELEXIS MLX90614ES -000-TU-ND non-contact infrared thermometer for use with Arduino, or any microcontroller that can communicate with it through it’s I2C interface. This se

腳位接線

GY-906 和 OLED 都使用 I2C 通訊,可以同時掛在同一組 SDA/SCL 線上。

Arduino UNO 的 I2C 腳位:

  • SDA → A4
  • SCL → A5
模組 模組腳位 Arduino UNO
GY-906 VCC(VDD) 5V(或 3.3V)
GY-906 GND(VSS) GND
GY-906 SDA A4
GY-906 SCL A5
OLED VCC 3.3V(或 5V)
OLED GND GND
OLED SDA A4
OLED SCL A5
⚠️ 注意: GY-906 與 OLED 的 SDA、SCL 直接並聯到同一腳位即可,I2C 匯流排支援多個裝置同時連接。

安裝函式庫

這個專案需要安裝以下三個函式庫,請在 Arduino IDE 的「程式庫管理員」中搜尋並安裝:

  1. Adafruit MLX90614 Library(用於 GY-906 溫度讀取)
  2. Adafruit GFX Library(OLED 繪圖底層)
  3. Adafruit SSD1306(OLED 驅動)

開啟路徑:選單 → 工具 → 管理程式庫,逐一搜尋安裝。


程式碼

/*
 * Arduino 非接觸式測溫器範例
 * 使用 GY-906(MLX90614)搭配 0.91 吋 OLED
 * 由傑森創工提供
 *
 * 請先安裝:
 *   - Adafruit MLX90614 Library
 *   - Adafruit GFX Library
 *   - Adafruit SSD1306
 *
 * 粉絲團:https://www.facebook.com/jasonshow
 * 傑森創工購物網:https://www.jmaker.com.tw/
 * 傑森創工部落格:https://blog.jmaker.com.tw/
 */

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // OLED 寬度(像素)
#define SCREEN_HEIGHT 32  // OLED 高度(像素)

// OLED Reset 腳位
// I2C 版本的 OLED 通常沒有獨立 Reset 腳,設為 -1 即可
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  Serial.begin(9600);

  // 初始化 OLED,I2C 位址 0x3C(0.91 吋常見位址)
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 初始化失敗,請檢查接線"));
    for (;;);  // 停住不繼續執行
  }

  // 開機顯示歡迎畫面
  display.clearDisplay();
  display.setRotation(2);        // OLED 顯示方向,可依安裝方向調整(0~3)
  display.setTextSize(4);        // 字體大小
  display.setTextColor(SSD1306_WHITE);  // 顯示顏色(OLED 只有亮/暗)
  display.setCursor(0, 0);
  display.print("Hello~");
  display.display();
  delay(1000);

  // 初始化 MLX90614
  Serial.println("MLX90614 紅外線溫度感測器啟動");
  mlx.begin();
}

void loop() {
  // 將環境溫度與物體溫度輸出到序列埠監控視窗
  Serial.print("環境溫度 = ");
  Serial.print(mlx.readAmbientTempC());
  Serial.print(" °C\t物體溫度 = ");
  Serial.print(mlx.readObjectTempC());
  Serial.println(" °C");

  // 在 OLED 顯示物體溫度
  display.clearDisplay();

  // 大字體顯示溫度數值(取到小數點後 1 位)
  display.setTextSize(4);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 4);
  display.print(mlx.readObjectTempC(), 1);

  // 小字體顯示「°C」單位
  display.setTextSize(2);
  display.setCursor(99, 0);
  display.print("o");       // 上標圓圈代表「度」
  display.setTextSize(3);
  display.setCursor(109, 12);
  display.print("C");

  display.display();
  delay(500);
}

程式說明

初始化部分(setup):

  • OLED_RESET -1:I2C 版本的 0.91 吋 OLED 通常沒有獨立 Reset 腳,設為 -1 讓它與 Arduino 共用 Reset,這樣才不會初始化失敗。
  • display.begin(SSD1306_SWITCHCAPVCC, 0x3C):指定 OLED 的 I2C 位址。大多數 0.91 吋模組預設為 0x3C,少數為 0x3D,若無法啟動可以嘗試換一下。
  • display.setRotation(2):旋轉顯示方向,0~3 各代表不同角度,可依你的安裝方向調整。
  • mlx.begin():初始化 MLX90614,GY-906 的 I2C 位址預設為 0x5A,與 OLED 的 0x3C 不衝突。

主迴圈(loop):

  • mlx.readAmbientTempC():讀取感測器本身周圍的環境溫度。
  • mlx.readObjectTempC():讀取被偵測目標物的表面溫度,這才是我們要顯示的值。
  • display.print(mlx.readObjectTempC(), 1):第二個參數 1 代表顯示到小數點後一位,例如 36.5
  • °C 符號用兩段文字拼出:上方小字的 o 充當度數符號,下方大字的 C 是攝氏。

常見問題

Q:OLED 開機後一片黑,什麼都沒顯示? 先用 I2C Scanner 程式確認 OLED 的位址。搜尋 "Arduino I2C Scanner" 可以找到範例,燒錄後開啟序列埠監控視窗查看實際位址。

Q:溫度讀到的值明顯偏高或偏低? MLX90614 感測到的是物體的「表面輻射溫度」,測量距離建議在 1~5 公分,且要對準目標物中心。隔著玻璃或反光面量測會有誤差。

Q:兩個模組同時接上就無法運作? 確認 SDA 和 SCL 有正確並聯,GND 也要共地。另外確認電源足夠,OLED 和 MLX90614 同時運作時電流需求會增加。


成果展示

燒錄完成後,OLED 會先顯示 Hello~,接著進入主迴圈,畫面上會即時更新顯示物體溫度,單位 °C。同時也可以開啟序列埠監控視窗(9600 baud)看到環境溫度與物體溫度。


傑森創工|jmaker.com.twblog.jmaker.com.twFacebook