在物聯網(IoT)與智慧農業專案中,「溫度監測」是最常見的應用之一。相比常見的 DHT11 溫濕度感測器,DS18B20 數位溫度感測器 具備更高的量測精準度與極佳的抗干擾能力。
本篇文章將帶你了解 DS18B20 的運作原理,並手把手教你如何使用 Arduino 搭配 1-Wire 協定進行環境溫度讀取!
什麼是 DS18B20 溫度感測器?
DS18B20 是由 Maxim(原 Dallas Semiconductor)生產的數位溫度感測元件。其最大的特色是採用專利的 1-Wire(單線)匯流排協定,僅需一根資料訊號線即可完成微控制器(如 Arduino)與感測器之間的雙向資料傳輸。
DS18B20 的核心優勢與規格特點:
量測範圍廣: 可測量 -55°C 至 +125°C,在 -10°C 至 +85°C 範圍內精度高達 。
接線簡潔: 僅需 3 根引腳(電源 VCC、資料 DQ、接地 GND)。
獨一無二的 64 位元 ROM 序號: 每顆 DS18B20 出廠時皆燒錄唯一序號,允許在同一條資料線上串接多顆感測器(多點測溫)而不會互相衝突。
解析度可調: 支援 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
麵包板與杜邦跳線若干
🛍️ 準備好你的硬體工具了嗎?
推薦選購:點擊連結可直接前往商城選購
硬體電路接線說明
DS18B20(TO-92 封裝)正面朝向自己時,引腳由左至右分別為:1-GND、2-DQ、3-VDD。
注意: 請務必將 4.7kΩ 電阻 跨接於 DQ (Pin 2) 與 VDD (Pin 3) 之間,否則 Arduino 將無法正確讀取感測器資料。
Arduino IDE 程式庫安裝步驟
使用 DS18B20 需要安裝兩個標準程式庫:OneWire 與 DallasTemperature。
步驟 1:安裝 OneWire 程式庫
開啟 Arduino IDE,點選上方選單 草稿碼 (Sketch) 匯入程式庫 (Include Library) 管理程式庫 (Manage Libraries…)。
搜尋關鍵字
OneWire,找到由 Paul Stoffregen 維護的版本並點擊 安裝。- 或者可以直接從GitHub下載OneWire程式庫https://github.com/PaulStoffregen/OneWire
步驟 2:安裝 DallasTemperature 程式庫
在相同的程式庫管理員中,搜尋關鍵字
DallasTemperature。找到由 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);
}
程式碼重點剖析
#include <DallasTemperature.h>:包含高階的 DS18B20 控制函式庫,大幅簡化底層 1-Wire 通訊流程。sensors.requestTemperatures():向匯流排上的所有感測器發送命令,開始進行 AD 採樣與溫度轉換。sensors.getTempCByIndex(0):獲取匯流排上第 0 個(索引值從 0 開始)DS18B20 的攝氏溫度。
成果驗證與測試
上傳程式至 Arduino 開發板。
開啟 序列埠監控視窗(Serial Monitor),並將鮑率設定為 9600 baud。
視窗每隔 2 秒即會輸出當前攝氏溫度值。
測試方法: 可以用手捏住 DS18B20 或使用吹風機稍微加熱,即可觀察到序列埠視窗中的溫度數據持續上升。
常見問題與除錯(FAQ)
Q1:為什麼序列埠一直顯示 -127.00 °C?
-127.00 °C 是 DallasTemperature 函式庫的錯誤代碼,代表 微控制器無法與感測器建立通訊。請檢查:
DQ 資料線是否漏接 4.7kΩ 上拉電阻。
DS18B20 的 VCC、GND 引腳是否接反。
腳位設定(
#define DQ_PIN)是否與實際電路一致。
Q2:如何在同一條線(同一腳位)上連接多個 DS18B20?
由於每個 DS18B20 都有獨一無二的 64 位元硬體位址,你可以將多個 DS18B20 的 VCC、GND、DQ 全部並聯至相同的 Arduino 引腳(只需共享一個 4.7kΩ 上拉電阻)。在程式中透過 sensors.getTempCByIndex(1)、sensors.getTempCByIndex(2) 即可分別獲取不同感測器的溫度數據。
延伸學習與推薦教學


