[TOC]
[玩轉(zhuǎn)樹莓派] DS18B20溫度傳感器
Raspberry connect to DS18B20
0x00 DS18B20
需要一個能測量水溫的溫度計(jì)粉私,淘寶買了高逼格的紅外溫槍柴信,到手后發(fā)現(xiàn)這鬼東西不能測金屬杯里的水溫(好的太貴)忧额。然后又淘寶了下毅臊,一個電子溫度計(jì)都賣三位數(shù),好吧轧邪,我窮…… 忽然想起手上有一個 DS18B20
最易,嗯嗯,拿出來自己做一個溫度計(jì)吧~~
DS18B20
這個傳感器很常見粒没,某寶上一搜一購物車筛婉,價格5到10元不等,當(dāng)然也有更好的癞松,按需購買爽撒,大概參數(shù)如下:
- 獨(dú)特的1-Wire總線接口僅需要一個管腳來通信。
- 每個設(shè)備的內(nèi)部ROM上都燒寫了一個獨(dú)一無二的64位序列號响蓉。
- 多路采集能力使得分布式溫度采集應(yīng)用更加簡單硕勿。
- 無需外圍元件。
- 能夠采用數(shù)據(jù)線供電厕妖;供電范圍為3.0V至5.5V首尼。
- 溫度可測量范圍為:-55℃至+125℃(-67℉至+257℉)。
- 溫度范圍超過-10℃至85℃之外時具有+-0.5℃的精度言秸。
(懷疑有誤)
- 內(nèi)部溫度采集精度可以由用戶自定義為9-Bits至12-Bits软能。
- DS18B20 分辨率可編程 1-Wire數(shù)字溫度傳感器
- 溫度轉(zhuǎn)換時間在轉(zhuǎn)換精度為12-Bits時達(dá)到最大值750ms。
- 用戶自定義非易失性的的溫度報警設(shè)置举畸。 · 定義了溫度報警搜索命令和當(dāng)溫度超過用戶自定義的設(shè)定值時查排。
- 可選擇的8-Pin SO (150 mils), 8-PinμSOP,及3-Pin TO-92封裝抄沮。 · 與DS1822程序兼容跋核。
- 應(yīng)用于溫度控制系統(tǒng),工業(yè)系統(tǒng)叛买,民用產(chǎn)品砂代。
嗯嗯,很多技術(shù)參數(shù)率挣,作為外行人看著就暈刻伊。這里關(guān)注幾個細(xì)節(jié)就好:
- 電壓:3.0V~5.5V
- 溫度范圍:-55℃至+125℃
- 測量精度:可調(diào),0.5℃對我來說可接受椒功,所以暫時沒去細(xì)究
接下來結(jié)合我的樹莓派的板子捶箱,給大家演示如何使用。
0x01 使用
首先按照網(wǎng)上的方法动漾,比如vvbbbbb丁屎,一步步操作,難免遇到一些坑旱眯,我的問題是怎么都不能識別這個傳感器晨川,后來找了很久,無意中解決了删豺,結(jié)合我的實(shí)際础爬,做簡單記錄,具體操作如下:
-
連接傳感器和Raspberry Pi
DS18B20
有三個針腳吼鳞,分別是- VCC 紅色看蚜,連
Raspberry Pi
的 VCC,測試連接 3V3 或 5V5 都可以 - DATA 黃色赔桌,連
Raspberry Pi
的 GPIO4 - GND 黑色供炎,連
Raspberry Pi
的 GND
另外和需要在用一個 4.7K 的電阻連接 VCC 和 DATA (別問我為什么,我也不知道疾党,大學(xué)模電學(xué)的那叫一個渣)音诫,如果你沒有 4.7K 的電阻,聽說大一點(diǎn)或者小一點(diǎn)都可以雪位,我沒試竭钝,反正我有。如果你連電阻都沒有,告訴你某寶上有打包一袋出售的香罐,常用阻值的都有卧波,很便宜,值得你入手庇茫。好了港粱,最終電路如圖:
- VCC 紅色看蚜,連
-
操作
-
更新系統(tǒng)
如果你的系統(tǒng)版本比較舊,建議你更新旦签,否則跳過這一步:
sudo apt-get update sudo apt-get upgrade
更新速度視你的網(wǎng)速和源的速度查坪,怎么切換源,可以參考我之前的文章宁炫。
-
啟用
1-Wire
終端執(zhí)行
sudo raspi-config
偿曙,打開配置界面,找到1-Wire
(我的位于Interfacing Option
下羔巢,不同版本不一樣遥昧,有的可能在Advanced Options
下)啟用它。-
你也可以直接配置:編輯
/boot/config.txt
朵纷,在最后一行添加dtoverlay=w1-gpio
保存即可炭臭。- 終端輸入:
sudo nano /boot/config.txt
-
Ctrl+V
滾到最下面,輸入dtoverlay=w1-gpio
-
Ctrl+O
保存袍辞,Ctrl+X
退出
- 終端輸入:
兩個方法結(jié)果一樣鞋仍,操作完成之后需要重啟機(jī)器,命令:
sudo reboot
-
查看你的傳感器
-
pi@raspberrypi:~ $ cd /sys/bus/w1/devices
pi@raspberrypi:/sys/bus/w1/devices $ ls
28-031561d43aff w1_bus_master1
pi@raspberrypi:/sys/bus/w1/devices $ cat 28-031561d43aff/w1_slave
48 01 01 01 1f ff 0c 10 04 : crc=04 YES
48 01 01 01 1f ff 0c 10 04 t=20500
pi@raspberrypi:/sys/bus/w1/devices $
```
先查看 `w1` 設(shè)備列表搅吁,然后查看里面的 `w1_slave` 文件內(nèi)容威创,即可顯示出溫度信息(這個溫度信息并不是我們最終的溫度,需要經(jīng)過一定的換算)谎懦。
`前方高能`
`前方填坑`
嗯嗯肚豺,坑出現(xiàn)了,我的在查看傳感器的時候顯示如下:
``` shell
pi@raspberrypi:~$ cd /sys/bus/w1/devices/
pi@raspberrypi:/sys/bus/w1/devices $ ls
00-600000000000 00-a00000000000 00-e00000000000 w1_bus_master1
pi@raspberrypi:/sys/bus/w1/devices $
```
網(wǎng)上看到的都是 `28-xxxxxxxxxxxxxx` 這樣的信息界拦,而我的卻不是吸申;這些目錄下也沒有 `w1_slave`文件;而且每次進(jìn)這個目錄 `/sys/bus/w1/devices` 這些文件夾的名字和數(shù)量都有可能會變享甸。好吧截碴,懵逼了。所以去找答案蛉威,果然也有一些人反應(yīng)過這個問題日丹,但大部分對我都沒用,比如 VCC 從 3V3 換到 5V5 蚯嫌,看看時間哲虾,又快12點(diǎn)了丙躏,想放棄了都。此時[佛光乍現(xiàn)](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=106041):可能是 `GPIO` 口的問題束凑,可以換一個試試晒旅,一試果然很爽,操作如下:
編輯 `/boot/config.txt`湘今,將剛才添加的那行修改如下 `dtoverlay=w1-gpio,gpiopin=5,pullup=on` 這里的 `5` 是對應(yīng)的GPIO口敢朱,你也可以用其他的剪菱,高興就好摩瞎。保存重啟即可。
3. 查看溫度數(shù)據(jù)
``` shell
pi@raspberrypi:/sys/bus/w1/devices $ cat 28-031561d43aff/w1_slave
48 01 01 01 1f ff 0c 10 04 : crc=04 YES
48 01 01 01 1f ff 0c 10 04 t=20500
pi@raspberrypi:/sys/bus/w1/devices $
```
這里的 `t=20500` 應(yīng)該就是溫度數(shù)據(jù)孝常,不知道 `crc=40` 是不是校驗(yàn)數(shù)據(jù)旗们,不管了,我也沒時間去計(jì)算构灸。網(wǎng)上肯定有現(xiàn)成的輪子來展示上渴,這里推薦 [w1thermsensor](https://github.com/timofurrer/w1thermsensor)。
- 安裝
`pip install w1thermsensor`
- 使用(ds18b20.py)
``` python
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "031561d43aff")
while True:
temperature_in_celsius = sensor.get_temperature()
print temperature_in_celsius
```
這里的一個常量 `031561d43aff` 就是 `28-031561d43aff` 這里的后半部分喜颁,你的可能跟我不一樣稠氮,請改成你自己看到的。
執(zhí)行:
``` python
pi@raspberrypi:~/python $ cat ds18b20.py
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "031561d43aff")
while True:
temperature_in_celsius = sensor.get_temperature()
print temperature_in_celsius
pi@raspberrypi:~/python $ python ds18b20.py
21.0
21.0
```
完美~
參考:
1半开、https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
2隔披、http://www.wendangku.net/doc/529cf93fc281e53a5802fff5.html
3、http://blog.csdn.net/vvbbbbb/article/details/52053293
4寂拆、https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=106041