天天看點

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

雕爺學程式設計,Arduino動手做,開源硬體,創客傳感器,DS18B20溫度傳感器

37款傳感器與子產品的提法,在網絡上廣泛流傳,其實Arduino能夠相容的傳感器子產品肯定是不止37種的。鑒于本人手頭積累了一些傳感器和子產品,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這裡準備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠抛磚引玉。 

【Arduino】108種傳感器子產品系列實驗(資料+代碼+圖形+仿真)

實驗三十九:DS18B20單總線數字溫度傳感器子產品

DS18B20

是世界第一片支援"一線總線"接口的溫度傳感器,一線總線獨特而且經濟的特點,使使用者可輕松組建傳感器網絡,為測量系統建構系統引入全新要概念。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

DS18B20 的内部結構主要由64 位ROM、溫度靈敏元件、内部存儲器和配置寄存器4 部分組成,如上圖所示。

( 1) 64 位ROM。它的内容是64 位序列号,它可以被看作是該DS18B20 的位址序列碼,其作用是使每個DS18B20 都各不相同,這樣就可以實作一根總線上挂接多個DS18B20 的目的。

( 2) 溫度靈敏元件。它完成對溫度的測量,測量後的結果存儲在2 個8 b 的溫度寄存器中。

( 3) 内部存儲器。内部存儲器包括一個高速暫存RAM 和一個非易失性的可電擦除的E2 PROM,後者存放高溫度和低溫度觸發器TH、TL 以及配置寄存器。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

測溫原理

用一個高溫度系數的振蕩器确定一個門周期,内部計數器在這個門周期内對一個低溫度系數的振蕩器的脈沖進行計數來得到溫度值。計數器被預置到對應于-55攝氏度的一個值。如果計數器在門周期結束前到達0,則溫度寄存器(同樣初始化到-55攝氏度)的值增加,表明所測溫度大于-55攝氏度。

1。溫度系數振蕩器是指一種振蕩器,它的振蕩頻率與溫度之間有一個特定的關系,即不同的溫度對應不同的振蕩頻率。反之,測量出振蕩器的輸出頻率,就可測量出溫度值。

2.高溫度系數振蕩器:它的振蕩頻率受溫度的影響很大,溫度稍有變化,頻率就會變化很多,即對溫度敏感,多用于溫度傳感器。

3.低溫度系數振蕩器:它的振蕩頻率受溫度的影響很小,即使溫度變化很大,它的頻率也基本不變。 

  同時,計數器被複位到一個值,這個值由斜坡式累加器電路确定,斜坡式累加器電路用來補償感溫振蕩器的抛物線特性。然後計數器又開始計數直到 0,如果門周期仍未結束,将重複這一過程。 斜坡式累加器用來補償感溫振蕩器的非線性,以期在測溫時獲得比較高的分辨力。這是通過改變計數器對溫度每增加一度所需計數的的值來實作的。是以,要想獲得所需的分辨力,必須同時知道在給定溫度下計數器的值和每一度的計數值。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

主要特性

(1) 獨特的單線接口方式,與單片機連接配接時僅需要一條口線;

(2) 測溫範圍為- 55~ + 125℃,在- 10~ + 85℃範圍内精度為±0. 5 ℃;

(3) 通過程式設計可實作9~ 12 位的數字讀數方式;

(4) 使用者可自設定非易失性的報警上下限值;

(5) 外圍電路簡單,使用時不需要外圍元件,可用資料總線供電,電壓範圍為3. 0 ~ 5. 5 V 無需備用電源;

(6)無需外部元件,獨特的一線接口,電源和信号混合在一起;

(7)每個晶片唯一編碼,支援聯網尋址,零功耗等待;

(8)DS18B20 有TO 92、SOIC 及CSP 封裝,其中VDD 為外接供電電源輸入端,GND 為公共地,DQ為數字信号輸出端;

(9)适用于冷凍庫,糧倉,儲罐,GPS衛星定位系統,電訊機房,電力機房,電纜線槽等測溫和控制領域。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

部件描述

存儲器---DS18B20的存儲器包括高速暫存器RAM和可電擦除RAM,可電擦除RAM又包括溫度觸發器TH和TL,以及一個配置寄存器。存儲器能完整的确定一線端口的通訊,數字開始用寫寄存器的指令寫進寄存器,接着也可以用讀寄存器的指令來确認這些數字。當确認以後就可以用複制寄存器的指令來将這些數字轉移到可電擦除RAM中。當修改過寄存器中的數時,這個過程能確定數字的完整性。高速暫存器RAM是由8個位元組的存儲器組成;用讀寄存器的指令能讀出第九個位元組,這個位元組是對前面的八個位元組進行校驗。

64-位光刻ROM---前8位是DS18B20的自身代碼,接下來的48位為連續的數字代碼,最後的8位是對前56位的CRC校驗。64-位的光刻ROM又包括5個ROM的功能指令:讀ROM,比對ROM,跳躍ROM,查找ROM和報警查找。 

外部電源的連---DS18B20可以使用外部電源VDD,也可以使用内部的寄生電源。當VDD端口接3.0V—5.5V的電壓時是使用外部電源;當VDD端口接地時使用了内部的寄生電源。無論是内部寄生電源還是外部供電,I/O口線要接5KΩ左右的上拉電阻。

配置寄存器---配置不同的位數來确定溫度和數字的轉化。可以知道R1,R0是溫度的決定位,由R1,R0的不同組合可以配置為9位,10位,11位,12位的溫度顯示。這樣就可以知道不同的溫度轉化位所對應的轉化時間,四種配置的分辨率分别為0.5℃,0.25℃,0.125℃和0.0625℃,出廠時以配置為12位。

溫度的讀取---DS18B20在出廠時以配置為12位,讀取溫度時共讀取16位,前5個位為符号位,目前5位為1時,讀取的溫度為負數;目前5位為0時,讀取的溫度為正數。溫度為正時讀取方法為:将16進制數轉換成10進制即可。溫度為負時讀取方法為:将16進制取反後加1,再轉換成10進制即可。例:0550H = +85 度,FC90H = -55 度。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

使用要點

DS18B20 采用的是單線總線協定方式,即在一條資料線上實作資料的雙向傳輸,而單片機硬體上不支援單總線協定,是以必須采用軟體方法來模拟單總線的協定是序來完成對DS18B20 晶片的通路。由于DS18B20 是在一根I/ O 線上讀寫資料,是以對讀寫的資料位有嚴格的時序要求,它有嚴格的通信協定來保證各位資料傳輸的正确性和完整性。該協定定義了幾種信号的時序: 初始化時序、讀時序、寫時序。所有時序都是将單片機作為主裝置,DS18B20 作為從裝置,而每一次指令和資料的傳輸都是從主機主動啟動寫時序開始,如果要求DS18B20 回送資料,在進行寫指令後,主機需啟動讀時序完成資料接收。

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

幾個應用電路

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

DS18B20單總線數字溫度傳感器子產品

一、尺寸:長28mm X寬12mm X高10mm

二、主要晶片:18B20溫度傳感器

三、工作電壓:直流5V

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

子產品特點

1、分辨率調整範圍:9-12位

2、帶安裝孔友善安裝,孔徑:2.5

3、溫度測量範圍:-55~+125℃

4、溫度測量精度:0.5℃

5、工作電壓:DC5V

6、數字信号輸出

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

引腳接線

Arduino Uno      <------>         18B20溫度傳感器子產品  

Pin 3                  <------>          OUT (S)      

5V                      <------>          VCC   

GND                   <------>          GND  

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

搜尋、下載下傳庫檔案-DallasTemperature

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

後來又安裝了一個庫-OneWire

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
/*

【Arduino】108種傳感器子產品系列實驗(資料+代碼+圖形+仿真)

實驗三十九:DS18B20單總線數字溫度傳感器子產品

*/

 

#include <OneWire.h>

#include <DallasTemperature.h>

 

#define ONE_WIRE_BUS 3

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

 

void setup(void)

{

  Serial.begin(9600);

  Serial.println("Dallas Temperature IC Control Library Demo");

 

  sensors.begin();

}

 

void loop(void)

{

  Serial.print(" Requesting temperatures...");

  sensors.requestTemperatures(); 

  Serial.println("DONE");

 

  Serial.print("Temperature for Device 1 is: ");

  Serial.print(sensors.getTempCByIndex(0));  

  

  delay(500);

}
      

  

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器

用手觸摸DS18B20,溫度升高

「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器
「雕爺學程式設計」Arduino動手做(39)——DS18B20溫度傳感器