5.1 簡介
使用數字式溫度傳感器DS18B20實現溫度測量,並且串口輸出溫度測量值
5.2 關於DS18B20
DS18B20元件官方鏈接如下:
https://www.maximintegrated.com/cn/products/sensors/DS18B20.html
DS18B20引腳定義:
- DQ爲數字信號輸入/輸出端;
- GND爲電源地;
- VDD爲外接供電電源輸入端(在寄生電源接線方式時接地)
5.3 原理圖
添加DS18B20元件,在元器件搜索欄中輸入“DS18B20”,並添加至元器件選擇欄,如圖
並將其DQ管腳接至數字口2腳,也就是ATmega328P的4管腳,同時接10kΩ的上拉電阻,VCC接至+5V,GND接至地端,修改後的Arduino UNO仿真圖如圖所示
編輯DS18B20參數屬性,彈出如圖所示的DS18B20設置框。設置框裏有內部序列號、當前溫度值、調節的最小變化量。
內部序列號用於單總線上掛有多個DS18B20的情況下,甄別不同的傳感器。只有內部序列號相同的DS18B20纔會響應單總線上的命令並作出相應的響應。
5.4 編輯代碼
DS18B20設置完成後,下面進入Arduino編程部分。
相關庫引入
兩個庫均在GitHub上,可以在release標籤頁中下載最新項目文件。
-
OneWire庫
項目地址:https://github.com/PaulStoffregen/OneWire,官網地址 -
DallasTemperature庫
項目地址:https://github.com/milesburton/Arduino-Temperature-Control-Library
下載兩個庫的zip包後在Arduino IDE中選擇:項目 > 加載庫 > 添加一個 .ZIP庫 ,兩個庫添加完成後就可以使用了。
在開始編寫代碼之前將Paul Stoffregen的OneWire包括在庫管理器中,這是爲了 DallasTemperature庫的調用,在編寫代碼時,可以不用包含此庫。
啓動arduino IDE,選擇DallasTemperature中示例simple文件並打開,複製代碼,在protues中切換到“Source Code”標籤,粘貼代碼,然後編譯代碼。
5.5 運行仿真
oneWire 和DallasTemperature庫說明
OneWire庫
這是用於1-Wire總線通訊的庫,1-Wire總線是達拉斯半導體(已經被美信收購)推出的一種總線技術,一根線完成數據雙向通訊,甚至總線上的設備還能從這條線取電。對於佈線和現場施工來說這個技術蠻好的,但是這方面方便了別的地方就需要犧牲點了,具體來說1-Wire總線對通訊時間控制有些要求,通常通過程序來讀寫的話就需要犧牲一些性能了,因爲讀寫過程中很多時候是阻塞的,OneWire庫中可以看到很多延時存在。只用OneWire庫就可以操作DS18B20了,可以參考該庫的例程。
下面是OneWire庫中部分方法說明(這個庫不用太在意因爲我們主要用的是下面那個庫):
- OneWire(uint8_t pin) { begin(pin); }
構造方法,指定總線接入的pin號; - void begin(uint8_t pin)
初始化總線接口; - uint8_t reset(void)
復位總線,如果總線上有可用設備則返回1,沒有則返回0; - void select(const uint8_t rom[8])
選擇指定設備,rom[8]爲設備序列號; - void skip(void)
發送跳過指令(0xCC); - void write(uint8_t v, uint8_t power = 0)
- void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0)
- uint8_t read(void)
- void read_bytes(uint8_t *buf, uint16_t count)
- void write_bit(uint8_t v)
- uint8_t read_bit(void)
讀寫相關操作; - void depower(void)
停止向總線供電; - void reset_search()
- void target_search(uint8_t family_code)
- bool search(uint8_t *newAddr, bool search_mode = true)
搜索設備相關操作; - static uint8_t crc8(const uint8_t *addr, uint8_t len)
- static bool check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc = 0)
- static uint16_t crc16(const uint8_t* input, uint16_t len, uint16_t crc = 0)
計算CRC校驗;
DallasTemperature庫
這個庫在上面那個庫之上再封裝了一層,方便直接使用DS18B20等系列的溫度傳感器。這個庫中溫度轉換可以設置爲阻塞或非阻塞模式,阻塞模式下運行溫度轉換請求方法時會阻塞一段時間。這個庫中訪問設備可以通過設備地址(序列號)或是索引,通過索引方式訪問相對會耗更多時間。
部分方法說明如下:
- DallasTemperature(OneWire*)
構造函數; - void begin(void)
初始化總線,獲取總線上有多少OneWire設備和其中多少爲DS18等系列設備; - uint8_t getDS18Count(void)
返回DS18等系列設備數量; - bool getAddress(uint8_t* deviceAddress, uint8_t index)
獲取指定索引設備的地址到deviceAddress對象; - bool isConnected(const uint8_t* deviceAddress, uint8_t* scratchPad)
返回指定地址(序列號)設備是否連接到總線,並讀取設備寄存器數據到scratchPad對象; - uint8_t getResolution()
返回全局設備最大分辨率; - void setResolution(uint8_t newResolution)
設置所有設備數據分辨率; - uint8_t getResolution(const uint8_t* deviceAddress)
返回指定地址(序列號)設備分辨率; - bool setResolution(const uint8_t* deviceAddress, uint8_t newResolution, bool skipGlobalBitResolutionCalculation)
設置指定地址(序列號)設備分辨率; - void setWaitForConversion(bool flag)
設置溫度轉換時是否阻塞,true則阻塞,默認爲true; - bool getWaitForConversion(void)
返回溫度轉換時是否阻塞; - void setCheckForConversion(bool flag)
設置是否在阻塞時檢查轉換完成,true則檢查,默認爲true; - bool getCheckForConversion(void)
返回是否在阻塞時檢查轉換完成; - void requestTemperatures(void)
向總線上所有設備發送溫度轉換指令,阻塞模式下該方法將阻塞一定時間;
阻塞時間和全局設備最大分辨率以及是否在阻塞時檢查轉換完成標誌有關,
分辨率影響: 9:最大94ms;10:最大188ms;11:最大375ms;其它:最大750ms; - bool requestTemperaturesByAddress(const uint8_t* deviceAddress)
向總線上指定地址(序列號)設備發送溫度轉換指令,阻塞模式下該方法將阻塞一定時間; - bool requestTemperaturesByIndex(uint8_t deviceIndex)
向總線上指定索引設備發送溫度轉換指令,阻塞模式下該方法將阻塞一定時間; - int16_t getTemp(const uint8_t* deviceAddress)
返回指定地址(序列號)設備溫度數據,數據分辨率爲1/128℃,如果發生錯誤則返回DEVICE_DISCONNECTED_RAW(-7040,默認值);
爲了兼容性考慮這裏溫度數據的分辨率和DS18B20有所不同,DS18B20默認分別率爲1/16℃; - float getTempC(const uint8_t* deviceAddress)
返回指定地址(序列號)設備攝氏溫度,如果發生錯誤則返回DEVICE_DISCONNECTED_C(-127,默認值); - float getTempF(const uint8_t* deviceAddress)
返回指定地址(序列號)設備華氏溫度,如果發生錯誤則返回DEVICE_DISCONNECTED_F(-196.6,默認值); - float getTempCByIndex(uint8_t deviceIndex)
- float getTempFByIndex(uint8_t deviceIndex)
返回指定索引設備溫度,如果發送錯誤則返回默認值; - bool isParasitePowerMode(void)
返回是否需要總線寄生供電,需要則返回true;
警報相關方法不在此列出,請自行查詢源碼 - static float toFahrenheit(float)
將攝氏溫度轉爲華氏溫度; - static float toCelsius(float)
將華氏溫度轉爲攝氏溫度; - static float rawToCelsius(int16_t)
將原始溫度轉換爲攝氏溫度; - static float rawToFahrenheit(int16_t)
將原始溫度轉換爲華氏溫度;
總結
基於OneWire和DallasTemperature庫使用DS18B20主要內容就是上面這些了,更多信息可以參考美信對於1-Wire總線的引用筆記:
https://www.maximintegrated.com/cn/app-notes/index.mvp/id/126
https://www.maximintegrated.com/cn/app-notes/index.mvp/id/187