問(wèn):使用Raspberry Pi 從 MCP9808讀取溫度數(shù)據(jù)
MCP9808是一款溫度傳感器,采用I2C通信標(biāo)準(zhǔn)來(lái)傳輸連續(xù)輪詢(xún)溫度。它支持報(bào)警功能和待機(jī)模式,以便在需要時(shí)節(jié)省電力。在本說(shuō)明文檔中,我們將執(zhí)行幾個(gè)python命令來(lái)獲取傳感器的溫度。
MCP9808上的I2C
Microchip將0x18用作此板上的主地址,借助芯片上的3個(gè)引腳來(lái)更改I2C地址沖突時(shí)的地址。當(dāng)調(diào)用傳感器中的任何寄存器時(shí),該板應(yīng)寫(xiě)入或獲得雙字節(jié)響應(yīng)(MSB優(yōu)先,LSB最后)。我使用的是Adafruit的分線板[1528-1032-ND],其中已經(jīng)包含一些正偏電阻。
需注意的寄存器:
0x01:0000000X00011111:這里的X是配置中的備用位,默認(rèn)為0,此為連續(xù)輪詢(xún)模式。溫度寄存器會(huì)不斷更新,但存在功耗問(wèn)題。將此位設(shè)為1將停止輪詢(xún)并節(jié)省功耗。
0x05:AAASMMMMLLLLLLLL:該寄存器包含12位浮點(diǎn)溫度,其中“A”為報(bào)警信息,“S”為符號(hào)位,“M”和“L”分別代表MSB和LSB。最終輸出將顯示為MMMMLLLL.LLLL。
請(qǐng)注意,在本說(shuō)明中,我沒(méi)有設(shè)置符號(hào)位和報(bào)警位,但如果你希望測(cè)量零下溫度,則需要進(jìn)行設(shè)置。
在Raspberry PI上的實(shí)現(xiàn):
使用Raspberry Pi與I2C接口相連的好處在于Python終端的交互性。我使用的是在Raspbian發(fā)行版上啟用了I2C的Raspberry Pi 4。確保你的GPIO支持3V3、GND、SDA并且SCL支持MCP9808上的正確引腳。在Raspbian中打開(kāi)終端并執(zhí)行以下三個(gè)命令:
python
from smbus import SMBus
bus = SMBus(1)
該命令將創(chuàng)建一個(gè)待連接的總線對(duì)象,該對(duì)象將反過(guò)來(lái)收集我們請(qǐng)求的I2C數(shù)據(jù)。接下來(lái),向芯片詢(xún)問(wèn)它的溫度數(shù)據(jù):
temp_binary =format(bus.read_word_data(0x18, 0x05),‘016b’)
該bus.read_byte_data(Address, Register)將從傳感器檢索數(shù)據(jù),我們使用封閉的format()函數(shù)將信息讀取為二進(jìn)制數(shù),這樣是為了使提取這兩個(gè)字節(jié)變得簡(jiǎn)單。Python通常喜歡使用int或float,但這會(huì)造成妨礙,因?yàn)闀?huì)由多個(gè)字節(jié)返回值。我們將按照[0:8][8:16]順序?qū)⑵渚幹?a target="_blank">索引,而MSB位于數(shù)組的后半部分。
計(jì)算輸出:
我們可以利用以下函數(shù)來(lái)正確地獲取輸出值
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.
請(qǐng)查看下圖,了解我們所需的輸出。
最后,將這二者結(jié)合在一起,再加上一些浮點(diǎn)運(yùn)算即可。
LSB, MSB =word_To_LSB_MSB(temp_binary)
float(int(MSB + LSB,2)) / 16
除以16可將結(jié)果轉(zhuǎn)為MMMMLLLL.LLLL,并獲得十進(jìn)制精度。注意,返回的結(jié)果應(yīng)以攝氏為單位。在上圖所示的情況下,我們從二進(jìn)制浮動(dòng)數(shù)00010111.0101計(jì)算出的溫度是23.3125攝氏度。
完成后進(jìn)入省電模式:
如果你希望在完成操作后關(guān)閉器件,只需將待機(jī)位設(shè)置為省電模式:
bus.write_byte_data(0x18,0x01,0b00000001)
由于只需更改MCP9809配置寄存器中的MSB,所以我們寫(xiě)入一個(gè)字節(jié),不過(guò)我們將字符縮短了,因此不會(huì)更改寄存器中的LSB。
要使MCP9808恢復(fù)到完全工作功能狀態(tài),必須使傳感器獲得動(dòng)力循環(huán)或使用寄存器的零刷新模式。
Microchip的規(guī)格書(shū)在此傳感器的應(yīng)用中仍然非常有用,如果你要使用MCP9808,請(qǐng)務(wù)必定期查詢(xún)。注意,本文未涉及此傳感器的一些重要功能,例如中斷、負(fù)溫度的符號(hào)位和待機(jī)工作。
使用的項(xiàng):
Raspberry Pi:1690-RASPBERRYPI4B/4GB-ND
母頭到公頭的面包板線:1568-1511-ND
用于MCP9808的Adafruit分線板:1528-1032-ND
審核編輯:劉清
-
溫度傳感器
+關(guān)注
關(guān)注
48文章
2940瀏覽量
156015 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
樹(shù)莓派
+關(guān)注
關(guān)注
116文章
1706瀏覽量
105607 -
MSB
+關(guān)注
關(guān)注
0文章
13瀏覽量
8258 -
MCP
+關(guān)注
關(guān)注
0文章
254瀏覽量
13900
原文標(biāo)題:攻略來(lái)了:用樹(shù)莓派讀取溫度傳感器MCP9808的數(shù)據(jù)
文章出處:【微信號(hào):得捷電子DigiKey,微信公眾號(hào):得捷電子DigiKey】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論