使用i2c,python和raspberry 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可能是唯一的寄存器。
乔纳·格雷厄姆(Jonah Graham)

您应该屏蔽传感器的输出,而不要移动它。例如reading = reading & (max_output-1)可能应该这样做。

前两位是状态位,因此,如果将它们置位,则有时可能表示:正常模式或过时的数据指示器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章