http://www.geekfan.net/10081/
本文由 極客范 - Boyd Wang 翻譯自 Adafruit.com。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末尾處的要求。
概覽
樹莓派操作系統Occidentalis以及2012年12月之後的Raspbian系統已經能夠支持DS18B20單總線(1-wire)溫度傳感器。這種傳感器由半導體包裹的頭和三個引腳組成,它是一種精確地數字設備。
這節課裡,你將學習如何在樹莓派上使用DS18B20來讀取溫度。
因為樹莓派沒有數模轉換器(ADC, Analog to Digital Converter),因此它不能夠直接讀取像TMP36這樣的模擬信號溫度傳感器,因此,DS18B20是比較合適的。
另外的代碼庫
如果你是一個Python愛好者,這有另外一種在樹莓派上使用DS18B20的類庫。
地址在這裡:https://github.com/timofurrer/ds18b20(作者是Timo!)
你需要的
要完成這個項目,你需要下面的東西:
樹莓派
DS18B20數字溫度傳感器 + 延長線,也可以是濕度或者高溫型號的。另外你需要一個4.7k或者10k歐姆的電阻。
一小塊面包板
一把跳線
擴展板
硬件部分
下圖展示了基本的DS18B20接法。
DS18B20單總線(1-wire)傳感器可以以非並行連接接入,這一點幾乎與其他市售的傳感器都不同!所有傳感器共享相同的針腳,所以你只需要一個4.7k的電阻就夠了。
電阻被用於拉高數據輸出線(data-line),並且保持數據輸出的穩定。
要注意DS18B20的方向,弧形的一邊在圖中的左側。如果你接反了,有可能會燒壞傳感器。
如果你是用的是防水版的DS18B20,那我們需要連接3個針腳,紅,黑,黃,身下一個引腳不用連接。
如果你是用的是高溫版本的DS18B20,把橙色引腳接入3.3V,白色接地,藍色與數據針pin 4相連。
你同樣需要一個4.7k~10k的電阻接在3.3v和數據針之間。
DS18B20
盡管DS18B20看上去就像一個普通的傳感器,但它內部其實大有文章。
它的芯片包含了一個特別的單總線串行接口,邏輯控制部分以及一個溫度傳感器。
它的輸出針輸出數字消息以便Raspbian/Occidentalis能夠在某一針上閱讀。你可以在運行這個項目之前自己通過命令行或者SSH(參見第六課)先試驗一下。
在終端窗口裡輸入下面的命令。當你執行到」devices」目錄下時,目錄名稱開頭的」28-」可能與你的不一樣,所以cd到你看到的目錄下吧。
這個接口有點不太穩定,但如果幸運的話系統會告訴我們有一個可供讀取的溫度。它類似於一個文件,所以我們要做的就是讀這個文件。
在返回消息的第一行末尾都會有一個YES或NO,如果是yes,那第二行緊接著就是溫度,以1/1000攝氏度為單位,所以在上面的例子中,實際讀取到的溫度是20.687和26.125攝氏度。
如果你接入了多個傳感器,那麼你將看到有多個28-xxx的文件,已經插入一個傳感器,然後檢查一下新生成的文件名,然後為這個傳感器做上標記。這樣才能區分出哪個傳感器對應哪個文件。
軟件部分
下面的Python程序處理失敗消息並且每秒返回華氏和攝氏溫度。
在程序的開頭運行了一下modprobe命令,來使接口運行。
緊接著的3行用於尋找哪些文件可以從中讀取消息。
一個已知的問題是在Raspbian下讀取溫度時有時候會假死。如果你有同樣的問題,使用下面的代碼替換掉read_temp_raw方法。然後在程序開頭加入一行」import subprocess」。
讀取溫度是通過兩個方法進行的。read_temp_raw通過接口獲取消息的前兩行。read_temp把它包裝了一層並且加入了失敗消息檢測並且重試直到第一行的末尾有一個YES。這個方法會返回兩個值,第一個是攝氏溫度,第二個是華氏溫度。
你可以像下面這樣把兩個值分開
主方法只是一個循環,讀取溫度,打印出來,然後休息一秒。
要把這個程序傳到樹莓派上,你可以通過SSH在命令行裡打開一個文本編輯器
粘貼上面的代碼,然後按一下Ctrl+X然後按一下Y保存。
測試與配置
運行這個程序需要超級用戶權限,所以在命令行裡運行下面的命令
如果一切ok,那你將會看到像下面一樣的一系列輸出
試試把手指放在溫度傳感器上來給它升溫。
加入更多的傳感器
你可以以並行連接方式DS18B20把其他的DS18B20傳感器接入到VCC,數據和地線針腳。只用一個4.7k電阻。你將會看到多個/sys/bus/w1/devices/28-nnnnn目錄,每一個都有一個唯一的串口編號。目前的python程序只能讀取一個傳感器,所以你需要自己修改使它能夠一次讀取多個傳感器。
原文鏈接: Adafruit.com 翻譯: 極客范 - Boyd Wang
譯文鏈接: http://www.geekfan.net/10081/
[ 轉載請保留原文出處、譯者和譯文鏈接。 ]