使用Sensirion SGP30的Python smbus lib

时间:2017-10-19 17:04:09

标签: python-2.7 sensor raspberry-pi3 i2c

我试图用Raspberry Pi 3读取和写入来自Sensirion SGP30传感器的i2c消息,但是我很难把头包裹在smbus lib上。

SGP30文档(https://cdn.sos.sk/productdata/46/c9/ba351164/sgp30.pdf)有一个表格,显示init到十六进制并开始测量:

SGP30 commands

以下是我尝试启动并运行的方法:

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)相同的假人的教程。似乎我看到的每个教程都是“只是将这些字节放在这里,你就可以了”。

那我怎么能让它发挥作用呢?谢谢! :)

3 个答案:

答案 0 :(得分:0)

不确定您是否意识到这一点,但SGP30要求VDD为+ 1.8V。如果你将i2c门拉到那个电压,Pi i2c可能无法正常工作,或者,如果你从+ 3.3V给SGP30供电它可能有一个短暂但快乐的生活,现在已经死了。您是否正确为SGP30供电,并使用i2c电平转换器进行通信?否则你提到的问题是可以预料的。

答案 1 :(得分:0)

让它发挥作用。

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”命令必须以1s的固定间隔发送,以确保正常运行   动态基线补偿算法。

似乎睡眠时间需要略大,因为在树莓派上循环运行不太顺畅。

仍然没有找到很好的解释为什么我需要将该字节分成两部分。

答案 2 :(得分:0)

我有同样的问题,这应该有效。 每次给总线命令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)