Basic Tutorial for Arduino, 感測器 Sensor, 進階篇

【Arduino進階教學】DS18B20 溫度感測器實作:1-Wire 協定原理、接線圖與程式碼解析

在物聯網(IoT)與智慧農業專案中,「溫度監測」是最常見的應用之一。相比常見的 DHT11 溫濕度感測器,DS18B20 數位溫度感測器 具備更高的量測精準度與極佳的抗干擾能力。

本篇文章將帶你了解 DS18B20 的運作原理,並手把手教你如何使用 Arduino 搭配 1-Wire 協定進行環境溫度讀取!

什麼是 DS18B20 溫度感測器?

DS18B20 是由 Maxim(原 Dallas Semiconductor)生產的數位溫度感測元件。其最大的特色是採用專利的 1-Wire(單線)匯流排協定,僅需一根資料訊號線即可完成微控制器(如 Arduino)與感測器之間的雙向資料傳輸。

DS18B20 的核心優勢與規格特點:

  1. 量測範圍廣: 可測量 -55°C 至 +125°C,在 -10°C 至 +85°C 範圍內精度高達

  2. 接線簡潔: 僅需 3 根引腳(電源 VCC、資料 DQ、接地 GND)。

  3. 獨一無二的 64 位元 ROM 序號: 每顆 DS18B20 出廠時皆燒錄唯一序號,允許在同一條資料線上串接多顆感測器(多點測溫)而不會互相衝突。

  4. 解析度可調: 支援 9 到 12 位元的數位轉換解析度。

1-Wire(單線匯流排)運作原理

1-Wire 是一種主從式(Master/Slave)架構的雙向通訊協定:

  • 時脈與資料合一: 僅用單一訊號線同時傳輸時脈(Clock)與資料(Data)。

  • 外接上拉電阻(Pull-up Resistor): 由於 1-Wire 匯流排為開漏極(Open-drain)結構,必須在 DQ 資料線與 5V 電源之間外接一個 4.7kΩ 的上拉電阻,以確保匯流排在空閒時維持高電位,並維持訊號傳輸的穩定性。

實驗所需硬體材料

進行本實作前,請先準備以下電子零件:

  • Arduino Uno R3 開發板 x 1

  • USB 數據傳輸線 x 1

  • DS18B20 溫度感測器(TO-92 封裝或防水探頭型) x 1

  • 4.7kΩ 直插色碼電阻 x 1

  • 麵包板與杜邦跳線若干

🛍️ 準備好你的硬體工具了嗎?

推薦選購:點擊連結可直接前往商城選購

購買網址:https://shop.mirotek.com.tw/product/400098/

 

 

硬體電路接線說明

DS18B20(TO-92 封裝)正面朝向自己時,引腳由左至右分別為:1-GND2-DQ3-VDD

DS18B20 引腳Arduino Uno 接線位置備註說明
GND (Pin 1)GND 引腳接地
DQ (Pin 2)Digital Pin 2資料線(需並聯 4.7kΩ 電阻至 5V
VDD (Pin 3)5V 或 3.3V 引腳工作電源

注意: 請務必將 4.7kΩ 電阻 跨接於 DQ (Pin 2)VDD (Pin 3) 之間,否則 Arduino 將無法正確讀取感測器資料。

 

 

Arduino IDE 程式庫安裝步驟

使用 DS18B20 需要安裝兩個標準程式庫:OneWireDallasTemperature

步驟 1:安裝 OneWire 程式庫

  1. 開啟 Arduino IDE,點選上方選單 草稿碼 (Sketch) 匯入程式庫 (Include Library) 管理程式庫 (Manage Libraries…)

  2. 搜尋關鍵字 OneWire,找到由 Paul Stoffregen 維護的版本並點擊 安裝

  3. 或者可以直接從GitHub下載OneWire程式庫https://github.com/PaulStoffregen/OneWire

步驟 2:安裝 DallasTemperature 程式庫

  1. 在相同的程式庫管理員中,搜尋關鍵字 DallasTemperature

  2. 找到由 Miles Burton 開發的 DallasTemperature 程式庫並點擊 安裝

完整 Arduino 程式碼範例

本程式適用於單一 DS18B20 感測器的環境溫度讀取:

#include <OneWire.h> 
#include <DallasTemperature.h> 

// 定義 DS18B20 資料線連接至 Arduino 的腳位
#define DQ_PIN 2

// 建立 OneWire 實體以傳輸資料
OneWire oneWire(DQ_PIN);

// 將 OneWire 傳遞給 DallasTemperature 函式庫處理
DallasTemperature sensors(&oneWire);

void setup(void) {
  // 初始化序列埠通訊,鮑率設定為 9600
  Serial.begin(9600);
  
  // 初始化 DS18B20 感測器
  sensors.begin();
  Serial.println("DS18B20 溫度感測器初始化完成!");
}

void loop(void) {
  // 向匯流排上的 DS18B20 發送溫度轉換請求
  sensors.requestTemperatures(); 
  
  // 取得第 0 個感測器的攝氏溫度值
  float tempC = sensors.getTempCByIndex(0);

  // 檢查是否讀取成功
  if(tempC != DEVICE_DISCONNECTED_C) {
    Serial.print("目前環境溫度: ");
    Serial.print(tempC);
    Serial.println(" °C");
  } else {
    Serial.println("錯誤:無法讀取 DS18B20 感測器,請檢查接線!");
  }

  // 每 2 秒讀取一次溫度
  delay(2000);
}

 

程式碼重點剖析

  1. #include <DallasTemperature.h>:包含高階的 DS18B20 控制函式庫,大幅簡化底層 1-Wire 通訊流程。

  2. sensors.requestTemperatures():向匯流排上的所有感測器發送命令,開始進行 AD 採樣與溫度轉換。

  3. sensors.getTempCByIndex(0):獲取匯流排上第 0 個(索引值從 0 開始)DS18B20 的攝氏溫度。

成果驗證與測試

  1. 上傳程式至 Arduino 開發板。

  2. 開啟 序列埠監控視窗(Serial Monitor),並將鮑率設定為 9600 baud

  3. 視窗每隔 2 秒即會輸出當前攝氏溫度值。

  4. 測試方法: 可以用手捏住 DS18B20 或使用吹風機稍微加熱,即可觀察到序列埠視窗中的溫度數據持續上升。

常見問題與除錯(FAQ)

Q1:為什麼序列埠一直顯示 -127.00 °C

-127.00 °CDallasTemperature 函式庫的錯誤代碼,代表 微控制器無法與感測器建立通訊。請檢查:

  1. DQ 資料線是否漏接 4.7kΩ 上拉電阻

  2. DS18B20 的 VCC、GND 引腳是否接反。

  3. 腳位設定(#define DQ_PIN)是否與實際電路一致。

Q2:如何在同一條線(同一腳位)上連接多個 DS18B20?

由於每個 DS18B20 都有獨一無二的 64 位元硬體位址,你可以將多個 DS18B20 的 VCC、GND、DQ 全部並聯至相同的 Arduino 引腳(只需共享一個 4.7kΩ 上拉電阻)。在程式中透過 sensors.getTempCByIndex(1)sensors.getTempCByIndex(2) 即可分別獲取不同感測器的溫度數據。

 

延伸學習與推薦教學

 

 

相關文章