相關文章

Df926a3a8b2ce12ca8897b7ec2139427 由於人類不斷破壞地球資源,大氣層的溫室效應越來越嚴重,家中許多長者,面對酷熱的天氣變化無常,常會引起疾病,如果能夠讓創客神器Arduino告訴我們目前的溫度,那該有多好。所以本篇內容就要告訴網友如何使用數位化的DS18B20溫度感測器,來完成我們的心願。

文\曹永忠、許智誠、蔡英德

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

使用 Facebook 留言

發表回應

謹慎發言,尊重彼此。按此展開留言規則