簡體   English   中英

使用i2c,python和raspberry pi讀取14位數據

[英]reading 14-bit data using i2c, python, and raspberry pi

我正在嘗試使用python&i2c / smbus從樹莓派上的此氣壓傳感器讀取數據。

傳感器的數據表(第10頁)說它將輸出0-16383(2 ** 14)范圍內的數字值。 到目前為止,似乎我必須讀取整個字節,因此我不確定如何獲取14位值。 (我有一個到數據表的鏈接,但是SO表示我需要更多的聲譽,然后才能為帖子添加更多的鏈接。)

此示例使用Adafruit的I2C python庫 ,該基本上是SMBus的包裝。

import Adafruit_I2C
import time

# sensor returns a 14-bit reading 
max_output = 2**14 
# per data sheet, max_output == 1.6 bar
max_bar = 1.6

# i2c address specified in data sheet
sensor = Adafruit_I2C.Adafruit_I2C(0x78)

while True:
  reading = sensor.readU16(0, little_endian=False)

  # reading is sometimes, but not always, greater than 2**14
  # this adjustment feels pretty hacky/wrong
  while reading > max_output:
    reading = reading >> 1

  bar = reading / float(max_output) * max_bar
  print bar
  time.sleep(1)

我將這些讀數與包括氣壓計的手持式GPS的輸出進行比較。 有時我得到的讀數有些接近(GPS讀數為1001毫巴時為1030毫巴),但是傳感器隨后急劇下降(下降至930毫巴)以獲得一些讀數。 我懷疑這是由於我正在讀取數據而導致的,但是沒有真正的證據來支持這一點。

在這一點上,我不確定下一步該怎么做。

我已經猜到了一些東西,但是希望得到一些更明智的幫助:

  • 如何只讀取傳感器輸出的14位?
  • 返回的值是什么字節順序? 假設big-endian產生的值看起來更理智,但是我可能在這里混淆了多個問題。
  • 我如何知道要讀取哪個寄存器? 數據表中任何地方都沒有提到這一點。 我猜寄存器0可能是唯一的寄存器。

您應該屏蔽傳感器的輸出,而不要移動它。 例如, reading = reading & (max_output-1)可能應該這樣做。

前兩位是狀態位,因此,如果有時將它們置位,則可能表示:正常模式或過時的數據指示器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM