使用 i2c、python 和 raspberry pi 读取 14 位数据
reading 14-bit data using i2c, python, and raspberry pi
我正在尝试使用 python & i2c/smbus.
从 raspberry pi 上的 this barometric pressure sensor 读取数据
传感器的数据 sheet(第 10 页)表示它将输出 0-16383 (2**14) 范围内的数字值。到目前为止,我似乎必须读取整个字节,所以我不确定如何获得 14 位值。 (我有一个 link 到数据 sheet,但是所以说我需要更多的声誉才能向帖子添加更多 link。)
此示例使用 Adafruit's I2C python library,它基本上是 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 产生的值 似乎 更理智,但我可能在这里混淆了多个问题。
- 我如何知道要读取哪个寄存器?这在 data-sheet 的任何地方都没有提到。我猜寄存器0可能是唯一的。
您应该屏蔽传感器的输出,而不是移动它。例如reading = reading & (max_output-1)
应该可以做到。
前两位是状态位,因此如果有时设置它们可能意味着:正常模式或陈旧数据指示器。
我正在尝试使用 python & i2c/smbus.
从 raspberry pi 上的 this barometric pressure sensor 读取数据传感器的数据 sheet(第 10 页)表示它将输出 0-16383 (2**14) 范围内的数字值。到目前为止,我似乎必须读取整个字节,所以我不确定如何获得 14 位值。 (我有一个 link 到数据 sheet,但是所以说我需要更多的声誉才能向帖子添加更多 link。)
此示例使用 Adafruit's I2C python library,它基本上是 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 产生的值 似乎 更理智,但我可能在这里混淆了多个问题。
- 我如何知道要读取哪个寄存器?这在 data-sheet 的任何地方都没有提到。我猜寄存器0可能是唯一的。
您应该屏蔽传感器的输出,而不是移动它。例如reading = reading & (max_output-1)
应该可以做到。
前两位是状态位,因此如果有时设置它们可能意味着:正常模式或陈旧数据指示器。