問:使用Raspberry Pi 從 MCP9808讀取溫度資料
MCP9808是一款溫度傳感器,采用I2C通信标準來傳輸連續輪詢溫度。它支援報警功能和待機模式,以便在需要時節省電力。在本說明文檔中,我們将執行幾個python指令來擷取傳感器的溫度。
MCP9808 上的 I2C
Microchip 将0x18用作此闆上的主位址,借助晶片上的3個引腳來更改I2C位址沖突時的位址。當調用傳感器中的任何寄存器時,該闆應寫入或獲得雙位元組響應(MSB優先,LSB最後)。我使用的是的分線闆[],其中已經包含一些正偏電阻。
需注意的寄存器:
0x01 : 0000000X 00011111 : 這裡的X是配置中的備用位,預設為0,此為連續輪詢模式。溫度寄存器會不斷更新,但存在功耗問題。将此位設為1将停止輪詢并節省功耗。
0x05 : AAASMMMM LLLLLLLL : 該寄存器包含12位浮點溫度,其中“A”為報警資訊,“S”為符号位,“M”和“L”分别代表MSB和LSB。最終輸出将顯示為MMMMLLLL.LLLL。
請注意,在本說明中,我沒有設定符号位和報警位,但如果你希望測量零下溫度,則需要進行設定。
在Raspberry PI上的實作:
使用Raspberry Pi與I2C接口相連的好處在于Python終端的互動性。我使用的是在Raspbian發行版上啟用了I2C的。確定你的GPIO支援3V3、GND、SDA并且SCL支援MCP9808上的正确引腳。在Raspbian中打開終端并執行以下三個指令:
python
from smbus import SMBus
bus = SMBus(1)
該指令将建立一個待連接配接的總線對象,該對象将反過來收集我們請求的I2C資料。接下來,向晶片詢問它的溫度資料:
temp_binary = format(bus.read_word_data(0x18, 0x05),‘016b’)
該bus.read_byte_data(Address, Register)将從傳感器檢索資料,我們使用封閉的format()函數将資訊讀取為二進制數,這樣是為了使提取這兩個位元組變得簡單。Python通常喜歡使用int或float,但這會造成妨礙,因為會由多個位元組傳回值。我們将按照[0:8][8:16]順序将其編制索引,而MSB位于數組的後半部分。
計算輸出:
我們可以利用以下函數來正确地擷取輸出值
def word_To_LSB_MSB(word):
return word[0:8], word[12 :16] // note that word indices [8,9,10,11] are not used in this example.
請檢視下圖,了解我們所需的輸出。
最後,将這二者結合在一起,再加上一些浮點運算即可。
LSB, MSB = word_To_LSB_MSB(temp_binary)
float(int(MSB + LSB,2)) / 16
除以16可将結果轉為MMMMLLLL.LLLL,并獲得十進制精度。注意,傳回的結果應以攝氏為機關。在上圖所示的情況下,我們從二進制浮動數00010111.0101計算出的溫度是23.3125攝氏度。
完成後進入省電模式:
如果你希望在完成操作後關閉器件,隻需将待機位設定為省電模式:
bus.write_byte_data(0x18,0x01,0b00000001)
由于隻需更改MCP9809配置寄存器中的MSB,是以我們寫入一個位元組,不過我們将字元縮短了,是以不會更改寄存器中的LSB。
要使MCP9808恢複到完全工作功能狀态,必須使傳感器獲得動力循環或使用寄存器的零重新整理模式。
Microchip的規格書在此傳感器的應用中仍然非常有用,如果你要使用MCP9808,請務必定期查詢。注意,本文未涉及此傳感器的一些重要功能,例如中斷、負溫度的符号位和待機工作。
使用的項:
Raspberry Pi:
母頭到公頭的面包闆線:1568-1511-ND
用于MCP9808的Adafruit分線闆:
最後,如果你喜歡這篇文章,快分享給更多的小夥伴吧! 切記點個贊哦!