繁体   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