帶有Arduino的DS18B20溫度傳感器程序流程圖和原理

2021-05-2721:06:45帶有Arduino的DS18B20溫度傳感器程序流程圖和原理已關(guān)閉評(píng)論

 

DS18B20 1-Wire溫度傳感器的原理

DS18B20是由Maxim Integrated(以前的Dallas Semiconductor)生產(chǎn)的數(shù)字溫度傳感器。它是市場上最受歡迎的溫度傳感器之一,在較大的溫度范圍(-55°C至+ 125°C)內(nèi)提供相當(dāng)高的精度(±0.5°C)。由于傳感器的工作電壓為3.0至5.5 V,因此您可以將其與Arduino(以5 V工作)一起使用,也可以與具有3.3 V GPIO引腳的ESP32和Raspberry Pi等設(shè)備一起使用。

該傳感器的主要優(yōu)點(diǎn)之一是,它僅需要Arduino的一個(gè)數(shù)字引腳即可進(jìn)行通信。使用Dallas Semiconductor的傳感器連通的1-Wire??協(xié)議。該協(xié)議的工作方式與I2C相似,但數(shù)據(jù)速率較低,范圍更廣。

另一個(gè)優(yōu)點(diǎn)是,每個(gè)DS18B20傳感器都有一個(gè)唯一的64位串行代碼,該代碼允許多個(gè)傳感器在同一1-Wire總線上工作。因此,您可以從僅用一個(gè)Arduino引腳連接在一起的多個(gè)傳感器讀取數(shù)據(jù)(請(qǐng)參見下面的代碼示例)。

傳感器的分辨率可以通過編程方式設(shè)置為9、10、11或12位。這分別對(duì)應(yīng)于0.5°C,0.25°C,0.125°C和0.0635°C的溫度增量。上電時(shí)的默認(rèn)分辨率為12位。

您可以在下表中找到更多規(guī)格。

DS18B20數(shù)字溫度傳感器規(guī)格

電源電壓3.0至5.5 V
待機(jī)電流1微安
有功電流1.5毫安
測量范圍-55°C至+ 125°C(-67°F至+257°F)
精度
(溫度計(jì)誤差)
從-10°C到+85°C
為±0.5°C從-30°C到+100°C為
±1°C從-55°C到+125°C為±2°C
解析度9位至12位(可編程)
轉(zhuǎn)換時(shí)間<750毫秒(12位分辨率)
通訊協(xié)議1-Wire?總線協(xié)議
包裹3針TO-92
制造商Maxim Integrated
成本查看價(jià)格

有關(guān)更多信息,您也可以在此處查看數(shù)據(jù)表:

DS18B20傳感器的類型

傳感器通常以三種形式出現(xiàn)。最常見的類型是3引腳TO-92封裝,看起來就像一個(gè)晶體管。

 

這種類型的傳感器有時(shí)安裝在分線板上,該分線板上可以包括電源LED和所需的4.7kΩ上拉電阻。始終確保檢查PCB上的標(biāo)記,因?yàn)橐_的順序可能因制造商而異。

 

最后,您可以購買已連接電纜的防水探頭型傳感器。如果要測量遠(yuǎn)處,水下或地下的物體,則此樣式很有用。

 

請(qǐng)注意,防水傳感器的電纜通常使用PVC護(hù)套,因此建議將其保持在100°C以下。


接線–將DS18B20連接到Arduino

將DS18B20連接到Arduino相當(dāng)容易,因?yàn)槟恍枰B接3個(gè)引腳即可。首先將GND引腳接地,并將V?DD引腳連接至Arduino的5 V輸出。

接下來,將中間引腳(DQ)連接到Arduino的任何數(shù)字引腳。在這種情況下,我使用了數(shù)字引腳2。您還必須在DQ引腳和5 V之間添加一個(gè)4.7kΩ的上拉電阻。這將使1-Wire總線的空閑狀態(tài)保持高電平。

DS18B20數(shù)字溫度傳感器與Arduino的連接接線圖原理圖電路教程
具有Arduino Uno的DS18B20數(shù)字溫度傳感器接線圖

下表中也提供了連接。

DS18B20-數(shù)字溫度傳感器引腳排列

請(qǐng)注意,當(dāng)傳感器的平坦側(cè)面(上面印有文字)朝向您時(shí),引腳1(GND)是最左側(cè)的引腳。

DS18B20數(shù)字溫度傳感器連接

DS18B20Arduino的
引腳1(GND)地線
針腳2(DQ)Pin 2 Arduino并通過4.7kΩ電阻器達(dá)到5V
PIN 3(V?DD5伏

防水DS18B20傳感器的連接方法相同。但是,導(dǎo)線的顏色可能會(huì)因制造商而異。地線(GND)通常為黑色或藍(lán)色,電源線(VDD)通常為紅色,信號(hào)線(DQ)通常為黃色或白色。如果不確定,我強(qiáng)烈建議您始終檢查傳感器的數(shù)據(jù)表。

防水DS18B20數(shù)字溫度傳感器連接

防水DS18B20Arduino的
黑線(GND)地線
黃線(DQ)Pin 2 Arduino并通過4.7kΩ電阻器達(dá)到5V
紅線(V?DD5伏

 


安裝DallasTemperature和OneWire Arduino庫

1-Wire通信協(xié)議有些復(fù)雜,需要一堆代碼才能解析出該通信。因此,我們將使用Miles Burton的DallasTemperature Arduino庫來簡化這些傳感器的編程。

該庫允許您發(fā)出簡單的命令以從傳感器中讀取溫度數(shù)據(jù)。

您可以在GitHub上找到此庫的源代碼。

要安裝庫,請(qǐng)?jiān)贏rduino IDE中轉(zhuǎn)到“工具”>“管理庫”(在Windows上為Ctrl + Shift + I)??。庫管理器將打開并更新已安裝庫的列表。

安裝Arduino庫步驟1打開Library Manager

您可以搜索“?ds18b20?”,并通過Miles Burton查找DallasTemperature庫。選擇最新版本,然后單擊“安裝”。

DallasTemperature庫依賴于您還需要安裝的OneWire Arduino庫。該庫負(fù)責(zé)1-Wire通信協(xié)議。

搜索“ onewire”,然后查找Jim StudtOneWire庫。

 


具有Arduino示例代碼的DS18B20溫度傳感器

使用以下示例代碼,您可以從DS18B20傳感器讀取溫度并將其顯示在串行監(jiān)視器中。

您可以使用Arduino IDE將示例代碼上傳到?Arduino。

要復(fù)制代碼,請(qǐng)單擊代碼字段右上角的按鈕。

/ * DS18B20 1-Wire數(shù)字溫度傳感器,帶有Arduino示例代碼。更多信息:https://www.makerguides.com * /
//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>
//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2
//創(chuàng)建一個(gè)oneWire類的新實(shí)例以與任何OneWire設(shè)備通信:
OneWire oneWire ONE_WIRE_BUS ;
//將oneWire引用傳遞給DallasTemperature庫:
達(dá)拉斯溫度傳感器&oneWire ;
無效設(shè)置(){
//以9600的波特率開始串行通信:
序列號(hào)。開始9600 ;
//啟動(dòng)庫:
傳感器。開始();
}
無效循環(huán)(){
//向總線上的所有設(shè)備發(fā)送命令以執(zhí)行溫度轉(zhuǎn)換:
傳感器。requestTemperatures ();
//獲取以攝氏度為單位的溫度以獲取設(shè)備索引:
浮動(dòng)溫度=傳感器。getTempCByIndex 0 ; //索引0指向第一個(gè)設(shè)備
//獲取以華氏度為單位的溫度以獲取設(shè)備索引:
float tempF =傳感器。getTempFByIndex 0 ;
//在串行監(jiān)視器中以攝氏度為單位打印溫度:
序列號(hào)。打印“溫度:”
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
//以華氏度打印溫度
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”
//等待1秒鐘:
延遲1000 ;
}

您應(yīng)該在“串行監(jiān)視器”中看到以下輸出(Ctrl + Shift + M)。

串行監(jiān)視器輸出

確保串行監(jiān)視器的波特率也設(shè)置為9600。

代碼如何工作

第一步是包括所需的Arduino庫:

//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>

接下來,我定義了傳感器的DQ引腳連接到Arduino的哪個(gè)引腳。語句#define可用于為常數(shù)指定名稱。編譯程序時(shí),編譯器將使用定義的值替換對(duì)此常量的所有引用。因此,在您提到的所有地方ONE_WIRE_BUS,編譯程序時(shí),編譯器都會(huì)將其替換為值2。

//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2

此后,我創(chuàng)建了OneWire類的新對(duì)象,并將DQ引腳傳遞給其構(gòu)造函數(shù)。您還需要?jiǎng)?chuàng)建DallasTemperature類的對(duì)象,并將oneWire對(duì)象作為參數(shù)傳遞。

請(qǐng)注意,我將DallasTemperature對(duì)象稱為“傳感器”,但您也可以使用其他名稱。

OneWire oneWire ONE_WIRE_BUS ;
達(dá)拉斯溫度傳感器&oneWire ;

在代碼的設(shè)置部分,我們以9600的波特率開始串行通信。接下來,我使用函數(shù)初始化總線begin()

無效設(shè)置(){
//以9600的波特率開始串行通信:
序列號(hào)。開始9600 ;
//啟動(dòng)庫:
傳感器。開始();
}

在代碼的循環(huán)部分,我們從總線上所有傳感器的命令開始,開始溫度轉(zhuǎn)換。

//向總線上的所有設(shè)備發(fā)送命令以執(zhí)行溫度轉(zhuǎn)換:
傳感器。requestTemperatures ();

接下來,我使用這些函數(shù)getTempCByIndex(deviceIndex)getTempFByIndex(deviceIndex)分別獲取以攝氏度和華氏度為單位的溫度。在這種情況下,我們只有1個(gè)傳感器連接到總線。因?yàn)橛?jì)數(shù)從零開始,所以我將傳感器的索引設(shè)置為0。

//獲取以攝氏度為單位的溫度以獲取設(shè)備索引:
浮動(dòng)溫度=傳感器。getTempCByIndex 0 ; //索引0指向第一個(gè)設(shè)備
//獲取以華氏度為單位的溫度以獲取設(shè)備索引:
float tempF =傳感器。getTempFByIndex 0 ;

最后,溫度在串行監(jiān)視器中打印:

//在串行監(jiān)視器中以攝氏度為單位打印溫度:
序列號(hào)。打印“溫度:”
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
//以華氏度打印溫度
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”

由于12位模式下的溫度轉(zhuǎn)換最多需要750 ms,因此我在每次測量之間增加了1秒的延遲。


在Arduino上使用多個(gè)DS18B20傳感器

正如我在簡介中提到的那樣,您可以僅使用Arduino的一個(gè)引腳就可以從多個(gè)DS18B20傳感器讀取溫度。您可以在下面找到兩個(gè)示例代碼。在第一個(gè)示例中,您可以通過連接的傳感器的索引讀取溫度。因?yàn)樗袀鞲衅鞫歼B接到相同的1-Wire總線,所以第一個(gè)傳感器的索引為0,第二個(gè)索引為1,依此類推。

在第二個(gè)示例中,我將向您展示如何讀取每個(gè)傳感器的唯一64位地址。然后可以使用該地址單獨(dú)讀取每個(gè)傳感器。

接線–將多個(gè)DS18B20傳感器連接到Arduino

將多個(gè)DS18B20傳感器連接到Arduino就像連接一個(gè)一樣簡單。所有傳感器都并聯(lián)連接,即所有相同的引腳都連接在一起。就像以前一樣,GND引腳接地,V?DD引腳連接到5 V,DQ引腳連接到Arduino的引腳2。不要忘記DQ引腳和5 V之間的4.7kΩ上拉電阻。

請(qǐng)注意,我使用了一塊面包板將所有引腳連接在一起。如果您不熟悉面包板的工作原理,請(qǐng)在此處找到說明。

多個(gè)DS18B20 1-Wire數(shù)字溫度傳感器連接到Arduino

多個(gè)帶Arduino示例代碼的DS18B20傳感器

在下面的示例中,您可以按索引讀取每個(gè)傳感器的溫度,并將其顯示在串行監(jiān)視器中。

/ *多個(gè)帶Arduino示例代碼的DS18B20 1-Wire數(shù)字溫度傳感器。更多信息:https://www.makerguides.com * /
//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>
//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2
//創(chuàng)建一個(gè)oneWire類的新實(shí)例以與任何OneWire設(shè)備通信:
OneWire oneWire ONE_WIRE_BUS ;
//將oneWire引用傳遞給DallasTemperature庫:
達(dá)拉斯溫度傳感器&oneWire ;
int deviceCount = 0;
浮動(dòng)溫度
浮動(dòng)溫度
無效設(shè)置(){
//以9600的波特率開始串行通信:
序列號(hào)。開始9600 ;
//啟動(dòng)庫:
傳感器。開始();
//找到總線上的設(shè)備:
序列號(hào)。println “定位設(shè)備...”
序列號(hào)。打印“找到” ;
deviceCount =傳感器。getDeviceCount ();
序列號(hào)。打印deviceCount ;
序列號(hào)。println “設(shè)備”
}
無效循環(huán)(){
//向總線上的所有設(shè)備發(fā)送命令以執(zhí)行溫度轉(zhuǎn)換:
傳感器。requestTemperatures ();
//顯示每個(gè)傳感器的溫度
for int i = 0; i < deviceCount; i ++ {
序列號(hào)。打印“傳感器” ;
序列號(hào)。打印i + 1 ;
序列號(hào)。打印“:” ;
tempC =傳感器。getTempCByIndex i ;
tempF =傳感器。getTempFByIndex i ;
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”
}
序列號(hào)。println ();
延遲1000 ;
}

串行監(jiān)視器中的輸出應(yīng)如下所示:

多個(gè)DS18B20溫度傳感器串行監(jiān)控器輸出
多個(gè)DS18B20傳感器串行監(jiān)視器輸出

代碼如何工作

此示例中的代碼與之前的代碼基本相同。

在設(shè)置部分,我添加了一個(gè)額外的功能,該功能可以計(jì)算連接到1-Wire總線的設(shè)備數(shù)量。

//找到總線上的設(shè)備:
序列號(hào)。println “定位設(shè)備...”
序列號(hào)。打印“找到” ;
deviceCount =傳感器。getDeviceCount ();
序列號(hào)。打印deviceCount ;
序列號(hào)。println “設(shè)備”

在代碼的循環(huán)部分中,我使用了for循環(huán)來循環(huán)遍歷代碼的一部分,該部分通過其索引為連接到總線的每個(gè)傳感器獲取溫度。

//顯示每個(gè)傳感器的溫度
for int i = 0; i < deviceCount; i ++ {
序列號(hào)。打印“傳感器” ;
序列號(hào)。打印i + 1 ;
序列號(hào)。打印“:” ;
tempC =傳感器。getTempCByIndex i ;
tempF =傳感器。getTempFByIndex i ;
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”
}

 


按地址讀取傳感器

為了按傳感器的單個(gè)地址讀取傳感器,我們首先需要知道每個(gè)傳感器的地址是什么。為此,您可以使用下面的示例草圖。

草圖在串行監(jiān)視器中打印連接的傳感器的地址。為了知道哪個(gè)傳感器,您可以一次僅連接一個(gè)傳感器,也可以依次添加一個(gè)新傳感器。然后,您可以標(biāo)記連接到1-Wire總線的每個(gè)傳感器。

DS18B20地址查找器

/ *多個(gè)帶Arduino示例代碼的DS18B20 1-Wire數(shù)字溫度傳感器。
//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>
//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2
//創(chuàng)建一個(gè)oneWire類的新實(shí)例以與任何OneWire設(shè)備通信:
OneWire oneWire ONE_WIRE_BUS ;
//將oneWire引用傳遞給DallasTemperature庫:
達(dá)拉斯溫度傳感器&oneWire ;
//創(chuàng)建變量:
int deviceCount = 0; //變量以存儲(chǔ)連接的設(shè)備數(shù)
DeviceAddress設(shè)備地址;//變量以存儲(chǔ)設(shè)備地址
無效設(shè)置(){
//以9600的波特率開始串行通信:
序列號(hào)。開始9600 ;
//啟動(dòng)庫:
傳感器。開始();
//找到總線上的設(shè)備:
序列號(hào)。println “定位設(shè)備...”
序列號(hào)。打印“找到” ;
deviceCount =傳感器。getDeviceCount ();
序列號(hào)。打印deviceCount ;
序列號(hào)。println “設(shè)備”
序列號(hào)。println “打印地址...”
for int i = 0; i < deviceCount; i ++ {
序列號(hào)。打印“傳感器” ;
序列號(hào)。打印i + 1 ;
序列號(hào)。打印“:” ;
傳感器。getAddress deviceAddress,i ;
printAddress deviceAddress ;
}
}
無效循環(huán)(){
}
void printAddress DeviceAddress deviceAddress {
對(duì)于uint8_t i = 0; i < 8; i ++ {
序列號(hào)。打印“ 0x” ;
如果deviceAddress [ i ] < 0x10 {
序列號(hào)。打印“ 0” ;
}
序列號(hào)。打印deviceAddress [ i ] ,HEX ;
如果i < 7 {
序列號(hào)。打印“,” ;
}
}
序列號(hào)。println ();
}

串行監(jiān)視器中的輸出應(yīng)如下所示:

DS18B20-地址查找器

現(xiàn)在記下所有傳感器的地址,因?yàn)樵谙乱粋€(gè)示例中將需要它們。

通過地址Arduino示例代碼讀取傳感器

在以下示例中,您可以通過指定每個(gè)傳感器的唯一地址來讀取它們的溫度。

/ *通過地址讀取多個(gè)DS18B20 1-Wire數(shù)字溫度傳感器。
//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>
//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2
//創(chuàng)建一個(gè)oneWire類的新實(shí)例以與任何OneWire設(shè)備通信:
OneWire oneWire ONE_WIRE_BUS ;
//將oneWire引用傳遞給DallasTemperature庫:
達(dá)拉斯溫度傳感器&oneWire ;
//連接到1-Wire總線的DS18B20傳感器的地址
字節(jié)傳感器1 [ 8 ] = { 0×28 為0x18 0xB4 ×49 0x0C 0×00 0×00 0x7C } ;
字節(jié)傳感器2 [ 8 ] = { 0×28 的0xCC 0x19 ×49 0x0C 0×00 0×00 為0xBB } ;
字節(jié)傳感器3 [ 8 ] = { 0×28 0x19 0xEF 0x48 0x0C 0×00 0×00 0×21 } ;
無效設(shè)置(){
//以9600的波特率開始串行通信:
序列號(hào)。開始9600 ;
//啟動(dòng)庫:
傳感器。開始();
}
無效循環(huán)(){
//向總線上的所有設(shè)備發(fā)送命令以執(zhí)行溫度轉(zhuǎn)換:
傳感器。requestTemperatures ();
序列號(hào)。打印“傳感器1:” ;
printTemperature sensor1 ; //以sensor1的地址作為輸入調(diào)用printTemperature函數(shù)
序列號(hào)。打印“傳感器2:” ;
printTemperature sensor2 ;
序列號(hào)。打印“傳感器3:” ;
printTemperature sensor3 ;
序列號(hào)。println (); //打印一個(gè)空行
延遲1000 ;
}
void printTemperature DeviceAddress address {
//獲取以攝氏溫度為單位的設(shè)備地址:
浮動(dòng)溫度=傳感器。getTempC 地址;
//獲取以華氏度為單位的設(shè)備地址的溫度:
float tempF =傳感器。getTempF 地址;
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
//以華氏度打印溫度
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”
}

請(qǐng)注意,您必須用在前面的示例代碼中找到的地址替換第17至19行中的地址。

//連接到1-Wire總線的DS18B20傳感器的地址
字節(jié)傳感器1 [ 8 ] = { 0×28 為0x18 0xB4 ×49 0x0C 0×00 0×00 0x7C } ;
字節(jié)傳感器2 [ 8 ] = { 0×28 的0xCC 0x19 ×49 0x0C 0×00 0×00 為0xBB } ;
字節(jié)傳感器3 [ 8 ] = { 0×28 0x19 0xEF 0x48 0x0C 0×00 0×00 0×21 } ;

您應(yīng)該在串行監(jiān)視器中看到以下輸出。

代碼說明

每個(gè)傳感器的地址由64位組成。在代碼中,我們將地址指定為八個(gè)8位字節(jié)的數(shù)組。

//連接到1-Wire總線的DS18B20傳感器的地址
字節(jié)傳感器1 [ 8 ] = { 0×28 為0x18 0xB4 ×49 0x0C 0×00 0×00 0x7C } ;
字節(jié)傳感器2 [ 8 ] = { 0×28 的0xCC 0x19 ×49 0x0C 0×00 0×00 為0xBB } ;
字節(jié)傳感器3 [ 8 ] = { 0×28 0x19 0xEF 0x48 0x0C 0×00 0×00 0×21 } ;

該代碼的設(shè)置部分與前面的示例相同。

在循環(huán)中,我們調(diào)用該printTemperature(DeviceAddress address)函數(shù)。在此自定義函數(shù)中,我們使用getTempC(address)getTempF(address)從地址作為參數(shù)傳遞的傳感器中獲取溫度。

void printTemperature DeviceAddress address {
//獲取以攝氏溫度為單位的設(shè)備地址:
浮動(dòng)溫度=傳感器。getTempC 地址;
//獲取以華氏度為單位的設(shè)備地址的溫度:
float tempF =傳感器。getTempF tempC ;
序列號(hào)。打印tempC ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。打印“ C |” ;
//以華氏度打印溫度
序列號(hào)。打印tempF ;
序列號(hào)。打印“ \ xC2 \ xB0” ; //顯示度數(shù)符號(hào)
序列號(hào)。println “ F”
}

 


DallasTemperature Arduino庫的其他功能

DallasTemperature庫具有一些其他有用的內(nèi)置函數(shù),而我在上面的示例中尚未介紹。因此,我在下面列出了其中一些:

setResolution()

此功能可用于設(shè)置溫度數(shù)字轉(zhuǎn)換的分辨率。正如我在引言中提到的那樣,可以將其設(shè)置為9、10、11或12位,分別對(duì)應(yīng)于0.5°C,0.25°C,0.125°C和0.0625°C的增量。

您可能想知道為什么要更改分辨率,不是總是越高越好嗎?選擇較低分辨率的一個(gè)優(yōu)勢是,溫度數(shù)字轉(zhuǎn)換所需的時(shí)間要少得多。這意味著您可以在相同的時(shí)間內(nèi)獲取更多的溫度讀數(shù)。

從數(shù)據(jù)表中,我獲得了以下信息:

解析度溫度增量最長轉(zhuǎn)換時(shí)間
9位0.5°攝氏度93.75毫秒
10位0.25°C187.5毫秒
11位0.125°攝氏度375毫秒
12位0.0625°C750毫秒

DallasTemperature庫允許您使用函數(shù)設(shè)置分辨率setResolution()。可以將此功能添加到代碼的設(shè)置或循環(huán)部分。

您可以如下設(shè)置所有連接的傳感器的分辨率:

//將所有設(shè)備的分辨率設(shè)置為9、10、11或12位:
傳感器。setResolution 9 ;

或者,您可以通過指定其地址為特定傳感器單獨(dú)設(shè)置它:

//連接到1-Wire總線的DS18B20傳感器的地址
字節(jié)傳感器1 [ 8 ] = { 0×28 為0x18 0xB4 ×49 0x0C 0×00 0×00 0x7C } ;
//將特定設(shè)備的分辨率設(shè)置為9、10、11或12位:
傳感器。setResolution sensor1,9 ;

toFahrenheit()

此功能可用于將以攝氏度為單位的溫度轉(zhuǎn)換為華氏溫度。

浮動(dòng)溫度=傳感器。getTempCbyIndex 0 ;
float tempF = DallasTemperature :: toFahrenheit tempC ;

setHighAlarmTemp()和setLowAlarmTemp()

此功能以攝氏度為單位設(shè)置設(shè)備的內(nèi)部高溫和低溫警報(bào)。

布爾hasAlarm()

當(dāng)設(shè)備出現(xiàn)警報(bào)情況時(shí),此函數(shù)返回true。您可以在此處找到這些功能的示例。

 


在I2C LCD上顯示DS18B20溫度讀數(shù)

如果您想創(chuàng)建一個(gè)不需要計(jì)算機(jī)的獨(dú)立項(xiàng)目,那么最好知道如何在LCD顯示屏上顯示溫度讀數(shù)。

使用下面的示例代碼,您可以在16×2字符的I2C LCD上顯示溫度讀數(shù)。

如下面的接線圖所示,連接I2C LCD非常容易。您可以在下面查看我的詳細(xì)教程以獲取更多信息。

  • 如何使用Arduino控制字符I2C LCD

如果要使用標(biāo)準(zhǔn)的非I2C LCD,請(qǐng)看一下本文:

  • 如何在Arduino上使用16×2字符LCD
具有16×2字符I2C LCD和Arduino的DS18B20

下表中也提供了連接:

I2C LCD連接

I2C字符LCDArduino的
地線地線
VCC5伏
SDAA4
SCLA5

要使用I2C LCD,您將需要安裝LiquidCrystal_I2C?Arduino庫。

在Arduino IDE中打開庫管理器,然后搜索“ liquidcrystal_i2c”。現(xiàn)在向下滾動(dòng)并查找Frank de Brabander的圖書館。選擇最新版本,然后單擊“安裝”。

安裝LiquidCrystal_I2C Arduino庫

具有I2C LCD的DS18B20示例代碼

/ * DS18B20 1-Wire數(shù)字溫度傳感器,帶有16x2 I2C LCD和Arduino示例代碼。
//包括所需的Arduino庫:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
//定義1-Wire總線連接到Arduino的哪個(gè)引腳:
#定義ONE_WIRE_BUS 2
//創(chuàng)建一個(gè)oneWire類的新實(shí)例以與任何OneWire設(shè)備通信:
OneWire oneWire ONE_WIRE_BUS ;
//將oneWire引用傳遞給DallasTemperature庫:
達(dá)拉斯溫度傳感器&oneWire ;
LiquidCrystal_I2C LCD 0×27 ,16,2 ;
//度數(shù)符號(hào):
字節(jié)度[] = {
B00111,
00
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
} ;
無效設(shè)置(){
//啟動(dòng)庫:
傳感器。開始();
//啟動(dòng)LCD并打開背光燈:
液晶顯示器 初始化() ;
液晶顯示器 背光();
//創(chuàng)建一個(gè)自定義字符:
液晶顯示器 createChar 0,Degree ;
}
無效循環(huán)(){
//向總線上的所有設(shè)備發(fā)送命令以執(zhí)行溫度轉(zhuǎn)換:
傳感器。requestTemperatures ();
//獲取以攝氏度為單位的溫度以獲取設(shè)備索引:
浮動(dòng)溫度=傳感器。getTempCByIndex 0 ; //索引0指向第一個(gè)設(shè)備
//在LCD上打印溫度;
液晶顯示器 setCursor 0,0 ;
液晶顯示器 打印“溫度:”
液晶顯示器 setCursor 0,1 ;
液晶顯示器 打印tempC ;
液晶顯示器 0 ; //打印自定義字符
液晶顯示器 打印“ C”
//等待1秒鐘:
延遲1000 ;
}

您應(yīng)該在LCD上看到以下輸出:

DS18B20-16x2-I2C-LCD-輸出

結(jié)論

在本教程中,我向您展示了如何在Arduino上使用DS18B20 1-Wire數(shù)字溫度傳感器。希望您覺得它有用且有用。如果您這樣做了,請(qǐng)分享這篇文章與同樣喜歡電子產(chǎn)品和制作東西的朋友。

我很想知道您計(jì)劃使用這些傳感器構(gòu)建(或已經(jīng)構(gòu)建)哪些項(xiàng)目。如果您有任何疑問,建議或認(rèn)為本教程中缺少任何內(nèi)容,?請(qǐng)?jiān)谙旅媪粝略u(píng)論。

請(qǐng)注意,保留注釋是為了防止垃圾郵件。

這項(xiàng)工作已根據(jù)?知識(shí)共享署名-非商業(yè)性-相同方式共享4.0國際許可進(jìn)行了許可。