問:使用Raspberry Pi 從 MCP9808讀取溫度數據
MCP9808是一款溫度傳感器,采用I2C通信標準來傳輸連續輪詢溫度。它支持報警功能和待機模式,以便在需要時節省電力。在本說明文檔中,我們將執行幾個python命令來獲取傳感器的溫度。
MCP9808上的I2C
Microchip將0x18用作此板上的主地址,借助芯片上的3個引腳來更改I2C地址沖突時的地址。當調用傳感器中的任何寄存器時,該板應寫入或獲得雙字節響應(MSB優先,LSB最后)。我使用的是Adafruit的分線板[1528-1032-ND],其中已經包含一些正偏電阻。
需注意的寄存器:
0x01:0000000X00011111:這里的X是配置中的備用位,默認為0,此為連續輪詢模式。溫度寄存器會不斷更新,但存在功耗問題。將此位設為1將停止輪詢并節省功耗。
0x05:AAASMMMMLLLLLLLL:該寄存器包含12位浮點溫度,其中“A”為報警信息,“S”為符號位,“M”和“L”分別代表MSB和LSB。最終輸出將顯示為MMMMLLLL.LLLL。
請注意,在本說明中,我沒有設置符號位和報警位,但如果你希望測量零下溫度,則需要進行設置。
在Raspberry PI上的實現:
使用Raspberry Pi與I2C接口相連的好處在于Python終端的交互性。我使用的是在Raspbian發行版上啟用了I2C的Raspberry Pi 4。確保你的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位于數組的后半部分。
計算輸出:
我們可以利用以下函數來正確地獲取輸出值
defword_To_LSB_MSB(word):
return word[0:8], word[12 :16] // note that word indices [8,9,10,11] are notused 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:1690-RASPBERRYPI4B/4GB-ND
母頭到公頭的面包板線:1568-1511-ND
用于MCP9808的Adafruit分線板:1528-1032-ND
審核編輯:劉清
-
溫度傳感器
+關注
關注
48文章
2940瀏覽量
156020 -
python
+關注
關注
56文章
4792瀏覽量
84628 -
樹莓派
+關注
關注
116文章
1706瀏覽量
105608 -
MSB
+關注
關注
0文章
13瀏覽量
8258 -
MCP
+關注
關注
0文章
254瀏覽量
13900
原文標題:攻略來了:用樹莓派讀取溫度傳感器MCP9808的數據
文章出處:【微信號:得捷電子DigiKey,微信公眾號:得捷電子DigiKey】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論