DS18B20 1-Wire溫度傳感器的原理
DS18B20是由Maxim Integrated(以前的Dallas Semiconductor)生產的數字溫度傳感器。它是市場上最受歡迎的溫度傳感器之一,在較大的溫度范圍(-55°C至+ 125°C)內提供相當高的精度(±0.5°C)。由于傳感器的工作電壓為3.0至5.5 V,因此您可以將其與Arduino(以5 V工作)一起使用,也可以與具有3.3 V GPIO引腳的ESP32和Raspberry Pi等設備一起使用。
該傳感器的主要優點之一是,它僅需要Arduino的一個數字引腳即可進行通信。使用Dallas Semiconductor的傳感器連通的1-Wire??協議。該協議的工作方式與I2C相似,但數據速率較低,范圍更廣。
另一個優點是,每個DS18B20傳感器都有一個唯一的64位串行代碼,該代碼允許多個傳感器在同一1-Wire總線上工作。因此,您可以從僅用一個Arduino引腳連接在一起的多個傳感器讀取數據(請參見下面的代碼示例)。
傳感器的分辨率可以通過編程方式設置為9、10、11或12位。這分別對應于0.5°C,0.25°C,0.125°C和0.0635°C的溫度增量。上電時的默認分辨率為12位。
您可以在下表中找到更多規格。
DS18B20數字溫度傳感器規格
電源電壓 | 3.0至5.5 V |
待機電流 | 1微安 |
有功電流 | 1.5毫安 |
測量范圍 | -55°C至+ 125°C(-67°F至+257°F) |
精度 (溫度計誤差) | 從-10°C到+85°C 為±0.5°C從-30°C到+100°C為 ±1°C從-55°C到+125°C為±2°C |
解析度 | 9位至12位(可編程) |
轉換時間 | <750毫秒(12位分辨率) |
通訊協議 | 1-Wire?總線協議 |
包裹 | 3針TO-92 |
制造商 | Maxim Integrated |
成本 | 查看價格 |
有關更多信息,您也可以在此處查看數據表:
DS18B20傳感器的類型
傳感器通常以三種形式出現。最常見的類型是3引腳TO-92封裝,看起來就像一個晶體管。
這種類型的傳感器有時安裝在分線板上,該分線板上可以包括電源LED和所需的4.7kΩ上拉電阻。始終確保檢查PCB上的標記,因為引腳的順序可能因制造商而異。
最后,您可以購買已連接電纜的防水探頭型傳感器。如果要測量遠處,水下或地下的物體,則此樣式很有用。
請注意,防水傳感器的電纜通常使用PVC護套,因此建議將其保持在100°C以下。
接線–將DS18B20連接到Arduino
將DS18B20連接到Arduino相當容易,因為您只需要連接3個引腳即可。首先將GND引腳接地,并將V?DD引腳連接至Arduino的5 V輸出。
接下來,將中間引腳(DQ)連接到Arduino的任何數字引腳。在這種情況下,我使用了數字引腳2。您還必須在DQ引腳和5 V之間添加一個4.7kΩ的上拉電阻。這將使1-Wire總線的空閑狀態保持高電平。

下表中也提供了連接。

請注意,當傳感器的平坦側面(上面印有文字)朝向您時,引腳1(GND)是最左側的引腳。
DS18B20數字溫度傳感器連接
DS18B20 | Arduino的 |
---|---|
引腳1(GND) | 地線 |
針腳2(DQ) | Pin 2 Arduino并通過4.7kΩ電阻器達到5V |
PIN 3(V?DD) | 5伏 |
防水DS18B20傳感器的連接方法相同。但是,導線的顏色可能會因制造商而異。地線(GND)通常為黑色或藍色,電源線(VDD)通常為紅色,信號線(DQ)通常為黃色或白色。如果不確定,我強烈建議您始終檢查傳感器的數據表。
防水DS18B20數字溫度傳感器連接
防水DS18B20 | Arduino的 |
---|---|
黑線(GND) | 地線 |
黃線(DQ) | Pin 2 Arduino并通過4.7kΩ電阻器達到5V |
紅線(V?DD) | 5伏 |
安裝DallasTemperature和OneWire Arduino庫
1-Wire通信協議有些復雜,需要一堆代碼才能解析出該通信。因此,我們將使用Miles Burton的DallasTemperature Arduino庫來簡化這些傳感器的編程。
該庫允許您發出簡單的命令以從傳感器中讀取溫度數據。
您可以在GitHub上找到此庫的源代碼。
要安裝庫,請在Arduino IDE中轉到“工具”>“管理庫”(在Windows上為Ctrl + Shift + I)??。庫管理器將打開并更新已安裝庫的列表。

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

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

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

確保串行監視器的波特率也設置為9600。
代碼如何工作
第一步是包括所需的Arduino庫:
接下來,我定義了傳感器的DQ引腳連接到Arduino的哪個引腳。語句#define可用于為常數指定名稱。編譯程序時,編譯器將使用定義的值替換對此常量的所有引用。因此,在您提到的所有地方ONE_WIRE_BUS
,編譯程序時,編譯器都會將其替換為值2。
此后,我創建了OneWire類的新對象,并將DQ引腳傳遞給其構造函數。您還需要創建DallasTemperature類的對象,并將oneWire對象作為參數傳遞。
請注意,我將DallasTemperature對象稱為“傳感器”,但您也可以使用其他名稱。
在代碼的設置部分,我們以9600的波特率開始串行通信。接下來,我使用函數初始化總線begin()
。
在代碼的循環部分,我們從總線上所有傳感器的命令開始,開始溫度轉換。
接下來,我使用這些函數getTempCByIndex(deviceIndex)
并getTempFByIndex(deviceIndex)
分別獲取以攝氏度和華氏度為單位的溫度。在這種情況下,我們只有1個傳感器連接到總線。因為計數從零開始,所以我將傳感器的索引設置為0。
最后,溫度在串行監視器中打?。?/p>
由于12位模式下的溫度轉換最多需要750 ms,因此我在每次測量之間增加了1秒的延遲。
在Arduino上使用多個DS18B20傳感器
正如我在簡介中提到的那樣,您可以僅使用Arduino的一個引腳就可以從多個DS18B20傳感器讀取溫度。您可以在下面找到兩個示例代碼。在第一個示例中,您可以通過連接的傳感器的索引讀取溫度。因為所有傳感器都連接到相同的1-Wire總線,所以第一個傳感器的索引為0,第二個索引為1,依此類推。
在第二個示例中,我將向您展示如何讀取每個傳感器的唯一64位地址。然后可以使用該地址單獨讀取每個傳感器。
接線–將多個DS18B20傳感器連接到Arduino
將多個DS18B20傳感器連接到Arduino就像連接一個一樣簡單。所有傳感器都并聯連接,即所有相同的引腳都連接在一起。就像以前一樣,GND引腳接地,V?DD引腳連接到5 V,DQ引腳連接到Arduino的引腳2。不要忘記DQ引腳和5 V之間的4.7kΩ上拉電阻。
請注意,我使用了一塊面包板將所有引腳連接在一起。如果您不熟悉面包板的工作原理,請在此處找到說明。

多個帶Arduino示例代碼的DS18B20傳感器
在下面的示例中,您可以按索引讀取每個傳感器的溫度,并將其顯示在串行監視器中。
串行監視器中的輸出應如下所示:

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

現在記下所有傳感器的地址,因為在下一個示例中將需要它們。
通過地址Arduino示例代碼讀取傳感器
在以下示例中,您可以通過指定每個傳感器的唯一地址來讀取它們的溫度。
請注意,您必須用在前面的示例代碼中找到的地址替換第17至19行中的地址。
您應該在串行監視器中看到以下輸出。

代碼說明
每個傳感器的地址由64位組成。在代碼中,我們將地址指定為八個8位字節的數組。
該代碼的設置部分與前面的示例相同。
在循環中,我們調用該printTemperature(DeviceAddress address)
函數。在此自定義函數中,我們使用getTempC(address)
和getTempF(address)
從地址作為參數傳遞的傳感器中獲取溫度。
DallasTemperature Arduino庫的其他功能
DallasTemperature庫具有一些其他有用的內置函數,而我在上面的示例中尚未介紹。因此,我在下面列出了其中一些:
setResolution()
此功能可用于設置溫度數字轉換的分辨率。正如我在引言中提到的那樣,可以將其設置為9、10、11或12位,分別對應于0.5°C,0.25°C,0.125°C和0.0625°C的增量。
您可能想知道為什么要更改分辨率,不是總是越高越好嗎?選擇較低分辨率的一個優勢是,溫度數字轉換所需的時間要少得多。這意味著您可以在相同的時間內獲取更多的溫度讀數。
從數據表中,我獲得了以下信息:
解析度 | 溫度增量 | 最長轉換時間 |
---|---|---|
9位 | 0.5°攝氏度 | 93.75毫秒 |
10位 | 0.25°C | 187.5毫秒 |
11位 | 0.125°攝氏度 | 375毫秒 |
12位 | 0.0625°C | 750毫秒 |
DallasTemperature庫允許您使用函數設置分辨率setResolution()
??梢詫⒋斯δ芴砑拥酱a的設置或循環部分。
您可以如下設置所有連接的傳感器的分辨率:
或者,您可以通過指定其地址為特定傳感器單獨設置它:
toFahrenheit()
此功能可用于將以攝氏度為單位的溫度轉換為華氏溫度。
setHighAlarmTemp()和setLowAlarmTemp()
此功能以攝氏度為單位設置設備的內部高溫和低溫警報。
布爾hasAlarm()
當設備出現警報情況時,此函數返回true。您可以在此處找到這些功能的示例。
在I2C LCD上顯示DS18B20溫度讀數
如果您想創建一個不需要計算機的獨立項目,那么最好知道如何在LCD顯示屏上顯示溫度讀數。
使用下面的示例代碼,您可以在16×2字符的I2C LCD上顯示溫度讀數。
如下面的接線圖所示,連接I2C LCD非常容易。您可以在下面查看我的詳細教程以獲取更多信息。
- 如何使用Arduino控制字符I2C LCD
如果要使用標準的非I2C LCD,請看一下本文:
- 如何在Arduino上使用16×2字符LCD

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

具有I2C LCD的DS18B20示例代碼
您應該在LCD上看到以下輸出:

結論
在本教程中,我向您展示了如何在Arduino上使用DS18B20 1-Wire數字溫度傳感器。希望您覺得它有用且有用。如果您這樣做了,請分享這篇文章與同樣喜歡電子產品和制作東西的朋友。
我很想知道您計劃使用這些傳感器構建(或已經構建)哪些項目。如果您有任何疑問,建議或認為本教程中缺少任何內容,?請在下面留下評論。
請注意,保留注釋是為了防止垃圾郵件。
這項工作已根據?知識共享署名-非商業性-相同方式共享4.0國際許可進行了許可。