使用i2c、python和树莓pi读取14位数据



我正试图使用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)可能应该这样做。

前两位是状态位,所以如果设置了它们,有时它们可能意味着:正常模式或过时的数据指示器。

最新更新