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)保持高電平。

下表中也提供了連接。

請(qǐng)注意,當(dāng)傳感器的平坦側(cè)面(上面印有文字)朝向您時(shí),引腳1(GND)是最左側(cè)的引腳。
DS18B20數(shù)字溫度傳感器連接
DS18B20 | Arduino的 |
---|---|
引腳1(GND) | 地線 |
針腳2(DQ) | Pin 2 Arduino并通過4.7kΩ電阻器達(dá)到5V |
PIN 3(V?DD) | 5伏 |
防水DS18B20傳感器的連接方法相同。但是,導(dǎo)線的顏色可能會(huì)因制造商而異。地線(GND)通常為黑色或藍(lán)色,電源線(VDD)通常為紅色,信號(hào)線(DQ)通常為黃色或白色。如果不確定,我強(qiáng)烈建議您始終檢查傳感器的數(shù)據(jù)表。
防水DS18B20數(shù)字溫度傳感器連接
防水DS18B20 | Arduino的 |
---|---|
黑線(GND) | 地線 |
黃線(DQ) | Pin 2 Arduino并通過4.7kΩ電阻器達(dá)到5V |
紅線(V?DD) | 5伏 |
安裝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)??。庫管理器將打開并更新已安裝庫的列表。

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

DallasTemperature庫依賴于您還需要安裝的OneWire Arduino庫。該庫負(fù)責(zé)1-Wire通信協(xié)議。
搜索“ onewire”,然后查找Jim Studt的OneWire庫。

具有Arduino示例代碼的DS18B20溫度傳感器
使用以下示例代碼,您可以從DS18B20傳感器讀取溫度并將其顯示在串行監(jiān)視器中。
您可以使用Arduino IDE將示例代碼上傳到?Arduino。
要復(fù)制代碼,請(qǐng)單擊代碼字段右上角的按鈕。
您應(yīng)該在“串行監(jiān)視器”中看到以下輸出(Ctrl + Shift + M)。

確保串行監(jiān)視器的波特率也設(shè)置為9600。
代碼如何工作
第一步是包括所需的Arduino庫:
接下來,我定義了傳感器的DQ引腳連接到Arduino的哪個(gè)引腳。語句#define可用于為常數(shù)指定名稱。編譯程序時(shí),編譯器將使用定義的值替換對(duì)此常量的所有引用。因此,在您提到的所有地方ONE_WIRE_BUS
,編譯程序時(shí),編譯器都會(huì)將其替換為值2。
此后,我創(chuàng)建了OneWire類的新對(duì)象,并將DQ引腳傳遞給其構(gòu)造函數(shù)。您還需要?jiǎng)?chuàng)建DallasTemperature類的對(duì)象,并將oneWire對(duì)象作為參數(shù)傳遞。
請(qǐng)注意,我將DallasTemperature對(duì)象稱為“傳感器”,但您也可以使用其他名稱。
在代碼的設(shè)置部分,我們以9600的波特率開始串行通信。接下來,我使用函數(shù)初始化總線begin()
。
在代碼的循環(huán)部分,我們從總線上所有傳感器的命令開始,開始溫度轉(zhuǎn)換。
接下來,我使用這些函數(shù)getTempCByIndex(deviceIndex)
并getTempFByIndex(deviceIndex)
分別獲取以攝氏度和華氏度為單位的溫度。在這種情況下,我們只有1個(gè)傳感器連接到總線。因?yàn)橛?jì)數(shù)從零開始,所以我將傳感器的索引設(shè)置為0。
最后,溫度在串行監(jiān)視器中打印:
由于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è)帶Arduino示例代碼的DS18B20傳感器
在下面的示例中,您可以按索引讀取每個(gè)傳感器的溫度,并將其顯示在串行監(jiān)視器中。
串行監(jiān)視器中的輸出應(yīng)如下所示:

代碼如何工作
此示例中的代碼與之前的代碼基本相同。
在設(shè)置部分,我添加了一個(gè)額外的功能,該功能可以計(jì)算連接到1-Wire總線的設(shè)備數(shù)量。
在代碼的循環(huán)部分中,我使用了for循環(huán)來循環(huán)遍歷代碼的一部分,該部分通過其索引為連接到總線的每個(gè)傳感器獲取溫度。
按地址讀取傳感器
為了按傳感器的單個(gè)地址讀取傳感器,我們首先需要知道每個(gè)傳感器的地址是什么。為此,您可以使用下面的示例草圖。
草圖在串行監(jiān)視器中打印連接的傳感器的地址。為了知道哪個(gè)傳感器,您可以一次僅連接一個(gè)傳感器,也可以依次添加一個(gè)新傳感器。然后,您可以標(biāo)記連接到1-Wire總線的每個(gè)傳感器。
DS18B20地址查找器
串行監(jiān)視器中的輸出應(yīng)如下所示:

現(xiàn)在記下所有傳感器的地址,因?yàn)樵谙乱粋€(gè)示例中將需要它們。
通過地址Arduino示例代碼讀取傳感器
在以下示例中,您可以通過指定每個(gè)傳感器的唯一地址來讀取它們的溫度。
請(qǐng)注意,您必須用在前面的示例代碼中找到的地址替換第17至19行中的地址。
您應(yīng)該在串行監(jiān)視器中看到以下輸出。

代碼說明
每個(gè)傳感器的地址由64位組成。在代碼中,我們將地址指定為八個(gè)8位字節(jié)的數(shù)組。
該代碼的設(shè)置部分與前面的示例相同。
在循環(huán)中,我們調(diào)用該printTemperature(DeviceAddress address)
函數(shù)。在此自定義函數(shù)中,我們使用getTempC(address)
和getTempF(address)
從地址作為參數(shù)傳遞的傳感器中獲取溫度。
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°C | 187.5毫秒 |
11位 | 0.125°攝氏度 | 375毫秒 |
12位 | 0.0625°C | 750毫秒 |
DallasTemperature庫允許您使用函數(shù)設(shè)置分辨率setResolution()
。可以將此功能添加到代碼的設(shè)置或循環(huán)部分。
您可以如下設(shè)置所有連接的傳感器的分辨率:
或者,您可以通過指定其地址為特定傳感器單獨(dú)設(shè)置它:
toFahrenheit()
此功能可用于將以攝氏度為單位的溫度轉(zhuǎn)換為華氏溫度。
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

下表中也提供了連接:
I2C LCD連接
I2C字符LCD | Arduino的 |
---|---|
地線 | 地線 |
VCC | 5伏 |
SDA | A4 |
SCL | A5 |
要使用I2C LCD,您將需要安裝LiquidCrystal_I2C?Arduino庫。
在Arduino IDE中打開庫管理器,然后搜索“ liquidcrystal_i2c”。現(xiàn)在向下滾動(dòng)并查找Frank de Brabander的圖書館。選擇最新版本,然后單擊“安裝”。

具有I2C LCD的DS18B20示例代碼
您應(yīng)該在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)行了許可。