我正在尝试使用 Waveshare BME280 环境传感器 设置 Raspberry Pi 3 B+。我按照本指南连接电缆并运行提供的 bme280.py 脚本。我的传感器有 2 根额外的电缆,即 CS 和 ADDR/MISO,指南上的模型中没有这些电缆,但其余电缆已插入相同的 GPIO 引脚。 I2C 和 SPI 接口已启用,我正在运行最新的 Raspbian OS Lite。
当我运行脚本时,我收到以下消息:
Traceback (most recent call last):
File "bme280.py", line 172, in <module>
main()
File "bme280.py", line 161, in main
(chip_id, chip_version) = readBME280ID()
File "bme280.py", line 56, in readBME280ID
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
OSError: [Errno 121] Remote I/O error
还有另一个奇怪的问题:当我运行
i2cdetect -y 1
时,我得到的每一行都带有破折号,但是如果我立即第二次运行它,我会显示 x77,但 x76 仍然没有。
我发现了一个类似的 thread 并尝试通过添加
i2c_baudrate=100000
并重新启动来修改我的 /boot/config.txt 文件,但这并没有解决问题。
我确保使用 gpiotest 测试 pi,结果返回为
Skipped non-user gpios: 0 1 28 29 30 31
Tested user gpios: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Failed user gpios: None
我在使用 DHT11 传感器并运行 Adafruit 库时遇到了类似的问题,并收到一条错误消息,表明传感器没有数据流。我尝试使用几种不同的传感器和 Raspberry Pi,并多次重新安装操作系统。 此时,我不确定如何继续。如有任何帮助,我们将不胜感激。
我设法为这个问题创建了一个非常hacky的解决方案。 由于 i2cDetect 似乎只在第二次(或以后)运行时读取设备,因此我决定在传感器脚本内模拟运行它。
我在代码中添加了以下几行:
import os
from time import sleep
os.system('i2cdetect -y 1')
sleep(0.1)
os.system('i2cdetect -y 1')
输出仍然显示第一个 i2cdetect 命令未读取任何设备,因此我必须添加第二个命令。我注意到有时它们都没有读取数据,所以我添加了 1/10 秒睡眠命令。
这会从 i2cdetect 命令获得不必要的输出,但我忽略它,只将温度数据发送到我的服务器。
如果您查找 BME280 环境传感器的数据表,您会发现它需要一点延迟才能与 I2C 配合使用。
我根据数据表在代码中添加了以下延迟,现在它工作得很好:
start_delay = 0.002 #for startup
sampling_delay = 0.070 #for the loop
您可以将它们与前面提到的 time.sleep() 函数一起使用。