我试图用Raspberry Pi 3读取和写入来自Sensirion SGP30传感器的i2c消息,但是我很难把头包裹在smbus lib上。
SGP30文档(https://cdn.sos.sk/productdata/46/c9/ba351164/sgp30.pdf)有一个表格,显示init到十六进制并开始测量:
以下是我尝试启动并运行的方法:
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)相同的假人的教程。似乎我看到的每个教程都是“只是将这些字节放在这里,你就可以了”。
那我怎么能让它发挥作用呢?谢谢! :)
答案 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)