Python 带有 Sensirion SGP30 的 smbus 库
Python smbus lib with Sensirion SGP30
我正在尝试使用 Raspberry Pi 3 读写 i2c 消息 to/from Sensirion SGP30 传感器,但我很难理解 smbus 库。
SGP30 文档 (https://cdn.sos.sk/productdata/46/c9/ba351164/sgp30.pdf) table 显示十六进制以初始化并开始测量:
下面是我尝试将其启动的方法 运行:
bus = smbus.SMBus(1)
address = 0x58
time.sleep(.5)
bus.write_i2c_block_data(address, 0x2003, [])
time.sleep(.5)
bus.write_i2c_block_data(address, 0x2008, [])
time.sleep(.5)
while 1:
print bus.read_i2c_block_data(address, 0)
这会打印我的数组
[0, 0, 129, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
但传感器对酒精没有反应。
我真正需要的是有关 i2c 通信和 smbus 的傻瓜教程 (python)。貌似我看过的教程都是那些"just put these bytes here and you are good to go".
那么我怎样才能让它工作呢?谢谢! :)
不确定您是否知道这一点,但 SGP30 需要 +1.8V 的 VDD。如果将 i2c 门上拉到该电压,Pi i2c 可能无法正常运行,或者,如果您从 +3.3V 为 SGP30 供电,它可能有一个短暂但快乐的生命,现在已经死了。你是否正确地为 SGP30 供电,并使用 i2c 电平转换器进行通信?否则你提到的问题是意料之中的。
成功了。
bus = smbus.SMBus(1)
address = 0x58
bus.write_i2c_block_data(address, 0x20, [0x03])
time.sleep(.5)
while 1:
bus.write_i2c_block_data(address, 0x20, [0x08])
time.sleep(.6)
print bus.read_i2c_block_data(address, 0)
time.sleep(.8)
再次浏览文档,如其所说
“Measure_air_quality” command has to be sent in regular intervals of 1s to ensure proper operation of the
dynamic baseline compensation algorithm.
似乎睡眠时间需要稍微长一些,因为 运行 在 raspberry pi 上循环不是太顺利。
仍然没有找到很好的解释为什么我需要将该字节一分为二。
我遇到了同样的问题,这应该可以。
每次给总线命令 0x2008,传感器都会回复 6 个字节的信息,前 2 个字节包含 CO2 相关信息,第三个字节是校验和,第四和第五个包含 tVOC 信息,最后一个是校验和作为嗯
import time
import sys
import smbus
bus = smbus.SMBus(1)
address = 0x58
reply_buffer = [0,0,0,0,0,0]
reply = [0,0]
bus.write_i2c_block_data(address, 0x20, [0x03])
time.sleep(.5)
while True:
bus.write_i2c_block_data(address,0x20,[0x08])
time.sleep(.6)
block = bus.read_i2c_block_data(address,0)
for i in range(0,6):
reply_buffer[i]=block[i]
for i in range(0,2):
reply[i]=reply_buffer[i*3]
reply[i]<<=8
reply[i]|=reply_buffer[i*3+1]
print ("Co2 = ", reply[0])
print ("\n")
print("TVOC = ", reply[1])
print ("\n")
time.sleep(.2)
我正在尝试使用 Raspberry Pi 3 读写 i2c 消息 to/from Sensirion SGP30 传感器,但我很难理解 smbus 库。
SGP30 文档 (https://cdn.sos.sk/productdata/46/c9/ba351164/sgp30.pdf) table 显示十六进制以初始化并开始测量:
下面是我尝试将其启动的方法 运行:
bus = smbus.SMBus(1)
address = 0x58
time.sleep(.5)
bus.write_i2c_block_data(address, 0x2003, [])
time.sleep(.5)
bus.write_i2c_block_data(address, 0x2008, [])
time.sleep(.5)
while 1:
print bus.read_i2c_block_data(address, 0)
这会打印我的数组
[0, 0, 129, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
但传感器对酒精没有反应。
我真正需要的是有关 i2c 通信和 smbus 的傻瓜教程 (python)。貌似我看过的教程都是那些"just put these bytes here and you are good to go".
那么我怎样才能让它工作呢?谢谢! :)
不确定您是否知道这一点,但 SGP30 需要 +1.8V 的 VDD。如果将 i2c 门上拉到该电压,Pi i2c 可能无法正常运行,或者,如果您从 +3.3V 为 SGP30 供电,它可能有一个短暂但快乐的生命,现在已经死了。你是否正确地为 SGP30 供电,并使用 i2c 电平转换器进行通信?否则你提到的问题是意料之中的。
成功了。
bus = smbus.SMBus(1)
address = 0x58
bus.write_i2c_block_data(address, 0x20, [0x03])
time.sleep(.5)
while 1:
bus.write_i2c_block_data(address, 0x20, [0x08])
time.sleep(.6)
print bus.read_i2c_block_data(address, 0)
time.sleep(.8)
再次浏览文档,如其所说
“Measure_air_quality” command has to be sent in regular intervals of 1s to ensure proper operation of the dynamic baseline compensation algorithm.
似乎睡眠时间需要稍微长一些,因为 运行 在 raspberry pi 上循环不是太顺利。
仍然没有找到很好的解释为什么我需要将该字节一分为二。
我遇到了同样的问题,这应该可以。 每次给总线命令 0x2008,传感器都会回复 6 个字节的信息,前 2 个字节包含 CO2 相关信息,第三个字节是校验和,第四和第五个包含 tVOC 信息,最后一个是校验和作为嗯
import time
import sys
import smbus
bus = smbus.SMBus(1)
address = 0x58
reply_buffer = [0,0,0,0,0,0]
reply = [0,0]
bus.write_i2c_block_data(address, 0x20, [0x03])
time.sleep(.5)
while True:
bus.write_i2c_block_data(address,0x20,[0x08])
time.sleep(.6)
block = bus.read_i2c_block_data(address,0)
for i in range(0,6):
reply_buffer[i]=block[i]
for i in range(0,2):
reply[i]=reply_buffer[i*3]
reply[i]<<=8
reply[i]|=reply_buffer[i*3+1]
print ("Co2 = ", reply[0])
print ("\n")
print("TVOC = ", reply[1])
print ("\n")
time.sleep(.2)