Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)
溫度傳感器是指能感受溫度并轉換成可用輸出信號的傳感器。按測量方式分為接觸式和非接觸式,按照傳感器材料及電子元件分為熱電阻和熱電偶兩類,按照工作原理分為模擬式和數字式。本篇主要介紹數字溫度傳感器 DS18B20的使用。
1 簡介:Why DS18B20?
????????以往的溫度傳感器輸出的是模擬量,我們還要增加額外的 A/D 和 D/A 芯片進行轉換,那么對于 Arduino 外部接口資源并不豐富是一大挑戰,同時利用率不高,那么 DS18B20 Temperature Sensor Module 就很好的解決了這個問題,DS18B20數字溫度傳感器采用單總線模式,和MCU通訊僅需要一個IO,完全適用 Arduino 平臺,使用戶可輕松地組建傳感器網絡。
DS18B20使用集成芯片,采用單總線技術,能夠有效的減小外界的干擾,提高測量的精度。其輸出的是數字信號,接線非常方便,封裝成不同方式可以應用于不同場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式。
1.1 技術參數
(1)供電方便。單總線數字溫度傳感器 DS18B20,外界供電電壓范圍為 3.0 V 至 5.5 V,無需備用電源。
(2)測量范圍寬,精度高。測量溫度范圍為 -55°C 至 +125℃,華氏相當于是 67°F 到 257°F,-10°C 至 +85°C 范圍內精度為 ±0.5°C。
(3)測量參數可配置。溫度傳感器可編程的分辨率為 9~12 位,用戶課通過程序設定。
(4)多點組網。每一個 DS18B20 包含一個獨特的序號,多個 DS18B20 可以同時存在于一條總線,實現多點測溫。
(5)掉電保護功能。內部含有EEPROM,在系統掉電以后,仍可保存分辨率及報警溫度的設定值。
1.2 實驗材料
1.3 相關庫導入
????????本實驗用到兩個庫,分別為 OneWire 和 DallasTemperature ,前者是單總線庫,后者是在前者基礎上針對Dallas溫度傳感器封裝的庫。可以采用下面兩種方法導入:
- 下載相關庫文件,兩個庫均在GitHub上。下載兩個庫的zip包后,在Arduino IDE中選擇:項目 → 加載庫 → 添加一個 .ZIP庫 ,兩個庫添加完成后就可以使用了。
- 在Arduino IDE中點擊 項目 → 加載庫 → 管理庫 ,查找 [OneWire] 和 [DallasTemperature],選擇最新版本進行安裝。
1.4 實驗步驟
1、搭建電路圖
????????找出 DS18B20 Temperature Sensor Module 的電源線,地線和數據線;電源線,地線分別連到 Arduino 實驗板的+5V,GND 端口,數據總線連至數字端口。實驗原理圖如下圖所示。
2、代碼測試
????????本篇主要實現 Arduino 讀取溫度傳感器DS18B20的值,然后計算出當前溫度,通過串口發送給PC,PC串口調試助手顯示。程序設計流程如下:
測試代碼:
/*********************************************************************——————1.開發環境:Arduino IDE————————————————————————————————————————2.使用開發板型號:Arduino UNO————————————————————————————3.傳感器類型:DS18B20數字溫度傳感器——————————————————————— *********************************************************************/ #include <OneWire.h> #include <DallasTemperature.h>#define ONE_WIRE_BUS 2 // 定義DS18B20數據口連接UNO的2腳OneWire oneWire(ONE_WIRE_BUS); // 聲明連接在單總線上的單總線設備 DallasTemperature sensors(&oneWire); // 聲明一個傳感器對象void setup(){Serial.begin(9600); // 設置串口通信波特率sensors.begin(); // 初始總線 }void loop(){sensors.requestTemperatures(); // 向總線上的設備發送溫度轉換請求,默認情況下該方法會阻塞Serial.print("此時測量的溫度為:");Serial.print(sensors.getTempCByIndex(0)); // 獲取索引號0的傳感器攝氏溫度數據,并串口輸出Serial.println(" ℃\n");delay(500); }3、效果演示
1.5 相關庫說明
1、OneWire庫
????????這是用于1-Wire總線通訊的庫,單總線(One-Wire)是Dallas公司的一項特有的總線技術,它采用單根信號線實現數據的雙向傳輸,具有節省I/O口資源、結構簡單、便于擴展和維護等優點。One-Wire適用于單個主機的系統,能夠控制一個或多個從機設備。OneWire庫是針對單總線推出的擴展庫,想要了解更多,請閱讀:OneWire和DallasTemperature庫。
2、DallasTemperature庫
????????這個庫在上面那個庫之上再封裝了一層,方便直接使用DS18B20等系列的溫度傳感器。DallasTemperature庫常用的成員函數:
// 構造函數 DallasTemperature(OneWire*) DallasTemperature sensor(OneWire*) // 構造一個溫度傳感器對象。void begin() // 初始化總線,獲取總線上有多少OneWire設備和其中多少為DS18等系列設備,,并為每個傳感器設置位分辨率(12位)。void requestTemperatures(void) /* 向總線上所有設備發送溫度轉換指令,阻塞模式下該方法將阻塞一定時間;阻塞時間和全局設備最大分辨率以及 是否在阻塞時檢查轉換完成標志有關,分辨率影響: 9:最大94ms;10:最大188ms;11:最大375ms;其它:最大750ms;*/float getTempFByIndex(uint8_t deviceIndex) // 功能讀取并返回傳感器的溫度讀數,如果發送錯誤則返回默認值。deviceIndex只是總線上傳感器的位置。 如果您僅在總線上使用一個DS18B20,請將其設置為0。uint8_t getDS18Count() // 返回DS18等系列設備數量。void setResolution(uint8_t newResolution) // 該功能將DS18B20的內部模數轉換器的分辨率設置為9位,10位,11位或12位,分別對應于0.5°C,0.25°C,0.125°C和0.0625°C的增量。bool getWaitForConversion() // 函數返回waitForConversion標志的值。當您要檢查溫度轉換是否完成時,此功能很有用。setHighAlarmTemp()&setLowAlarmTemp() // 功能可設置設備的內部高溫和低溫警報(以攝氏度為單位)。有效范圍是-55至125°Cbool hasAlarm() // 如果溫度超過上限和下限警報溫度設置時設備處于警報狀態,此功能將返回true。uint8_t getResolution() // 返回全局設備最大分辨率;補充
- OneWire庫:https://github.com/PaulStoffregen/OneWire
- DallasTemperature庫:https://github.com/milesburton/Arduino-Temperature-Control-Library
總結
以上是生活随笔為你收集整理的Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麒麟操作系统基于linux哪个版本_如今
- 下一篇: 简单易懂应如何快速掌握超长激光测距仪相关