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)