文\曹永忠、許智誠、蔡英德
DS18B20溫度感測模組
DS18B20溫度感測模組提供高達9位元溫度準確度來顯示物品的溫度。而溫度的資料只需將訊號經過單線串列送入 DSl8B20或從 DSl8B20 送出,因此從中央處理器到DSl8B20 僅需連接一條線(不含電源)(如下圖所示)。
DS18B20溫度感測模組讀、寫和完成溫度變換所需的電源可以由數據線本身提供,而不需要外部電源。因為每一個DS18B20溫度感測模組有唯一的系列號(silicon serial number),因此多個DS18B20溫度感測模組可以存在於同一條單線總線上。這允許在許多不同的地方放置DS18B20溫度感測模組。
▲ DS-18B20 數位溫度感測器
DS-18B20 數位溫度感測器特性介紹
1.DS18B20 的主要特性
- 適應電壓範圍更寬,電壓範圍:3.0~5.5V,在寄生電源方式下可由數據線供電。
- 獨特的單線介面方式,DS18B20 在與微處理器連接時僅需要一條口線即可實現微處理器與 DS18B20。
2.雙向通訊
- DS18B20 支援多點組網功能,多個 DS18B20 可以並聯在唯一的三線上,實現組網多點測溫。
- DS18B20 在使用中不需要任何週邊元件,全部傳感元件及轉換電路集成在形如一只三極管的積體電路內。
- 可測量溫度範圍為-55℃~+125℃,在-10~+85℃時精度為±0.5℃。
- 程式讀取的解析度為 9~12 位元,對應的可分辨溫度分別為 0.5℃、0.25℃、0.125℃和 0.0625℃,可達到高精度測溫。
- 在 9 位元解析度狀態時,最快在 93.75ms 內就可以把溫度轉換為數位資料,在12 位元解析度狀態時,最快在750ms 內把溫度值轉換為數位資料,速度更快。
- 測量結果直接輸出數位溫度信號,只需要使用一條線路的資料匯流排,使用串列方式傳送給微處理機,並同時可傳送 CRC 檢驗碼,且具有極強的抗干擾除錯能力。
- 負壓特性:電源正負極性接反時,晶片不會因發熱而燒毀, 只是不能正常工作。
3.DS18B20的外形和內部結構
- DS18B20 內部結構主要由四部分組成:64 位元ROM 、溫度感測器、非揮發的溫度報警觸發器 TH 和 T配置暫存器。
- DS18B20 的外形及管腳排列。
4. DS18B20 接腳定義:(如下圖所示)
- DQ 為數位資號輸入/輸出端。
- GND 為電源地。
- VDD 為外接供電電源輸入端。
▲ DS18B20腳位一覽圖
DS18B20溫度感測模組的連接電路可以參考下圖與下表所示,進行電路組立。
▲ DS18B20範例電路圖
參考資料:Arduino練習:溫度感測DS18B20(http://yehnan.blogspot.tw/2013/01/arduinods18b20.html)
表 1 DS18B20溫度感測模組接腳表
|
模組接腳 |
Arduino開發板接腳 |
解說 |
DS18B20 |
VDD(Pin 3) |
Arduino +5V |
|
GND(Pin 1) |
Arduino GND(共地接點) |
||
DQ(Pin 2) |
Arduino Pin 2 |
||
4.7K 電阻A端 |
DQ(Pin 2) |
||
4.7K 電阻B端 |
Arduino +5V |
||
|
|
完成Arduino開發板與DS18B20溫度感測模組連接之後,將下表之DS18B20溫度感測模組測試程式一鍵入Arduino Sketch 之中,完成編譯後,上載到Arduino開發板進行測試,可以見到每隔兩秒鐘(delay(2000)),可以看到讀取到溫度的資料。
表 2 DS18B20溫度感測模組測試程式一
DS18B20溫度感測模組測試程式一(DS18B20_test01) |
#include <OneWire.h> #include <DallasTemperature.h>
// Arduino數位腳位2接到1-Wire裝置 #define ONE_WIRE_BUS 2
// 運用程式庫建立物件 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);
void setup(void) { Serial.begin(9600); Serial.println("Temperature Sensor"); // 初始化 sensors.begin(); }
void loop(void) { // 要求匯流排上的所有感測器進行溫度轉換 sensors.requestTemperatures();
// 取得溫度讀數(攝氏)並輸出, // 參數0代表匯流排上第0個1-Wire裝置 Serial.println(sensors.getTempCByIndex(0));
delay(2000); } |
程式下載處:https://github.com/brucetsao/ePower
由下圖所示,可以看到透過DS18B20溫度感測模組可以讀取到外界溫度,並且該溫度式非常準確的溫度。
▲ DS18B20溫度感測模組測試程式一結果畫面
由於使用DS18B20溫度感測模組DS18B20溫度感測模組需要DallasTemperature函式庫,所以我們也介紹DallasTemperature函式庫的基本用法。
DallasTemperature函式庫介紹
Arduino開發板驅動DS18B20溫度感測模組,需要DallasTemperature函數庫,而DallasTemperature函數庫則需要OneWire函數庫,網友可以在https://github.com/brucetsao/libraries,下載到DallasTemperature、OneWire等函數庫,相關其它資源也可以到作者Github(https://github.com/brucetsao)網站中搜尋之。
下列簡單介紹DallasTemperature函式庫內各個函式的解釋與用法:
- uint8_t getDeviceCount(void),回傳1-Wire匯流排上有多少個裝置。
- typedef uint8_t DeviceAddress[8],裝置的位址。
- bool getAddress(uint8_t*, const uint8_t),回傳某個裝置的位址。
- uint8_t getResolution(uint8_t*),取得某裝置的溫度解析度(9~12 bits,分別對應 0.5°C、0.25°C、0.125°C、0.0625°C),參數為位址。
- bool setResolution(uint8_t*, uint8_t),設定某裝置的溫度解析度。
- bool requestTemperaturesByAddress(uint8_t*),命令某感測器進行溫度轉換,參數為位址。
- bool requestTemperaturesByIndex(uint8_t),同上,參數為索引值。
- float getTempC(uint8_t*),取得溫度讀數,參數為位址。
- float getTempCByIndex(uint8_t),取得溫度讀數,參數為索引值。
另有兩個靜態成員函式可作攝氏華氏轉換。
- static float toFahrenheit(const float)
- static float toCelsius(const float)
作者介紹
曹永忠 (Yung-Chung Tsao):目前為自由作家、台灣資訊傳播學會秘書長,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。 Email:prgbruce@gmail.com ,Line ID:dr.brucetsao Arduino部落格:http://taiwanarduino.blogspot.tw/ 範例原始碼網址:https://github.com/brucetsao/arduino_RFProgramming 臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/ Arduino活動官網:http://arduino.kktix.cc/ Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ |
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!