在Python中使用BME280 I2C温度和压力传感器

43

BME280设备是数字气压传感器,是BMP180的略微升级版本。这在一个小模块上可用,该模块可通过I2C接口访问传感器。这使我们可以轻松地将其连接到Raspberry Pi并使用Python读取数据。 BME280提供温度,压力和湿度。

BME280温度压力传感器BME280由博世(Bosch)和 官方BME280数据表 包括所有技术细节。他们的设备可以同时提供SPI和I2C接口,因此您需要确保您的模块提供了您喜欢的接口。

我的模块是一个小型PCB,尺寸为14x10mm,带有4针I2C接头连接器。其他模块上的针脚顺序可能会有所不同,因此请注意标签,以便从Pi连接正确的电线。

配置I2C接口

为了使用此模块,您必须在Raspberry Pi上启用I2C接口,因为默认情况下未启用它。这是一个相当简单的过程,在我的文章中对此进行了介绍 在Raspberry Pi上启用I2C接口 tutorial.

连接硬件

下表显示了如何将模块连接到Raspberyr Pi’s GPIO头(P1)。请参考我的 通用输入输出头指南 for a diagram.

模块PCB 描述通用输入输出接头引脚
VCC3.3VP1-01
地线地面P1-06
SCLI2C SCLP1-05
SDAI2C SDAP1-03

这是面包板设置图。如果要连接模块’只需将四个针脚直接连接到Pi,您只需要四根母-母线即可。

BME280模块设置

可用的其他模块具有不同的针脚排列,因此,如果您的针脚与本教程中显示的针脚不同,请确保将正确的针脚连接到Pi。

连接设备并给Pi通电后,“i2cdetect”命令应显示地址为0x76或0x77的设备。

下载BME280脚本

要从我的Bitbucket存储库下载BME280 Python脚本,可以使用:

wget -O bme280.py http://bit.ly/bme280py

或者

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bme280.py

或右键单击 这个连结 在您的浏览器中并保存在本地。

运行脚本

在运行脚本之前,应检查设备是否已连接。如果将i2c-tools软件包作为i2c设置的一部分安装,则应使用i2cdetect命令检查它是否返回了设备的地址。该脚本假定地址为0x76。您可以使用喜欢的文本编辑器在bme280,py中编辑DEVICE变量来更改它。

使用以下命令运行脚本:

Python bme280.py

这是我在Pi上看到的输出:

BME280传感器设置

脚本细目

该脚本相当简单,但是其中包含一些令人恐惧的数学公式。这是在数据表中定义的,不用担心它如何工作,您将被原谅!如果您想更详细地了解脚本,请参见下面的脚本摘要:

  • 导入一些库
  • 定义一些功能
  • 函数主体使用readBME280ID函数获取设备的ID
  • 函数main然后调用readBME280All…
    • 设置过采样和模式
    • 读s calibration data from the device that was preset in the factory
    • 读s the raw temperature, pressure and humidity data
    • 使用数据表中的数学方法精炼数据
    • 将值返回给main()

包含在自己的脚本中

您可以只在脚本中修改主要功能,但您可能希望自己包含这些功能。为此,您可以导入我的脚本,然后参考以下示例中的readBME280ID和readBME280All函数:

import bme280

(chip_id, chip_version) = bme280.readBME280ID()
print "Chip ID :", chip_id
print "Version :", chip_version

temperature,pressure,humidity = bme280.readBME280All()

print "Temperature : ", temperature, "C"
print "Pressure : ", pressure, "hPa"
print "Humidity : ", humidity, "%"

其余的取决于您的想象力。

故障排除

  • 如果i2cdetect命令导致错误,则说明您尚未安装i2c-tools,或者需要使用0而不是1
  • 如果未检测到设备而您却没有’看不到您未正确连接设备或未正确启用i2c接口的地址
  • 仔细检查您的接线并重新启动Pi

在大多数情况下,i2c实验无法进行,因为:

  • 未启用i2c
  • 设备未正确连接
  • i2c-tools尚未安装,因此i2cdetect命令不可用

在极少数情况下,您的设备可能有故障,但很可能是上述问题之一。


该模块可从以下位置获得 亚马逊 and many other online electronics shops. You can also find .

分享。

43条留言

  1. 谢谢你!该脚本很好用,我用你的例子作为‘library’ –我需要做的就是导入一个功能,并且有一个可以显示周围环境的工作显示器!做得好!

  2. 嘿。由于I2C,BME280的线长限制是多少?一世’我前段时间读过I2C导线较长的问题,您对此一无所知吗?

  3. 我的BME280模块没有’t具有SDA连接,但有两个标记为SDI和SDO–我应该使用SDO来输出数据吗?因此,我’m接收到I / O错误(IOError:[Errno 5]输入/输出错误)。

  4. 你好,

    现在工作正常。

    下一步是:
    1.将详细信息记录到文件中,以便我可以将手册导出到excel
    2.未来的出口汽车自动制作图形’s for it
    3.使BME280在OpenPlotter中工作

    但是作为Python中的新手,我想一步一步地做,所以我也将对Python有一些了解。

    有人可以为下一步指示日志脚本指出正确的方向吗?

    谢谢

  5. 嗨,很棒的网站,注意到此BME280代码中的一个问题是您没有为湿度配置过采样模式,因此无法准确读取。在写入BMP180(REG_CONTROL)寄存器之前,我在您的代码中添加了以下3行,

    #添加湿度寄存器的配置
    OVERSAMPLE_HUM = 2
    REG_CONTROL_HUM = 0xF2
    bus.write_byte_data(地址,BME280_REG_CONTROL_HUM,OVERSAMPLE_HUM)

    在写读命令之后还需要增加一个延迟,adafruit这样做是这样的,其中self._mode是每个单位湿度,温度,压力的过采样模式,否则第一个读数将是达芙。

    sleep_time = 0.00125 + 0.0023 *(1<< self._mode)
    sleep_time = sleep_time + 0.0023 *(1<<自我模式)+ 0.000575
    sleep_time = sleep_time + 0.0023 *(1<<自我模式)+ 0.000575
    time.sleep(sleep_time)#等待所需的时间

  6. 你好!
    我将代码与数据表进行了比较,我想知道第140行是否有错字:可能是16384.8应该是16384.0,而不是?

    I’m也有点困惑,因为优化计算使用的公式与数据表中的公式不同。一世’在调查湿度时,我得到了不同的值(最终%值约为0.001)。移位(根据数据表)的效果可能与将早期转换为浮点的效果不同(如您的代码一样)吗?

    非常感谢您的代码!

  7. 我对使用此代码从BME280发出的湿度数据感到困惑,因为这些值一直在72%的区域内。调查表明,您没有初始化寄存器0xF2,而是将湿度过采样设置为0。当我添加几行来纠正此问题时,我开始接收与HTU21D匹配的值。

  8. 西蒙·马多克斯(Simon Maddox) on

    我在使用此脚本时遇到困难。我进行了2次更改,以舍入压力值并输出raw_hum值(用于调试)。湿度始终为0.0%,raw_hum从35152永远不会变化。是否还有其他人遇到此问题,或者我的传感器有问题吗?

    pi @ raspberrypi:〜$ python bme280.py
    芯片编号:88
    版本:0
    温度:27.38 C
    压力:997.71 mbar
    湿度:0.0%
    原始湿度:35152

  9. 在使用BME280传感器进行了数周的数据采集后,我确认了Matt’s软件的湿度读数有问题。奇怪的是,温度和湿度曲线具有相同的形状。当我安装Adafruit库时,该问题已解决。检查了源代码之后,似乎唯一的区别是Adafruit库在写入注册表和读取湿度值之间执行的暂停,其中Matt’的代码根本不会暂停。从BME数据表,附录B“测量时间和电流计算”似乎确实需要暂停。

    • 谢谢尼科洛。你是对的。一世’ve在等待之前添加了等待“read”根据数据表中给出的方程式“Appendix B: 测量时间和电流计算”.

  10. 阿兰·乔安尼(Alain Gioanni) on

    你好

    1 –我想修改此脚本以在microPython MCU(Lopy)上使用它,我该如何处理ctypes库?
    2 –由于电线太长,我需要切换到SPI吗?

    感谢帮助
    阿兰

  11. 嗨,它可以正常工作,但从昨天开始,它停止读取任何内容。快速检查后,我得到以下消息作为脚本的响应:

    追溯(最近一次通话):
    文件“/usr/lib/python2.7/site.py”, line 68, in
    导入操作系统
    文件“/usr/lib/python2.7/os.py”, line 400, in
    导入UserDict
    ValueError:错误的元帅数据(字符串引用超出范围)

    但是我什么都没做…我的设备坏了吗?

  12. 嗨,马特,想说谢谢您的工作,这使我的生活变得轻松!
    我在Orange-Pi-PC上使用bme280,并且可以很好地用作导入模块/ smbus0 /
    真是太好了,感激不尽!

  13. 谢谢马特!你节省了我几个小时的工作。太感谢了!!

    马特于2017年1月3日晚上11:39
    删除.pyc文件。如果它们已损坏,则会发生此错误。当您运行.py脚本时,将重新创建.pyc文件。

  14. 克里斯·琼斯 on

    我对测量室外湿度和温度感兴趣–我可以在外面使用吗?我是否需要以某种方式保护它不受元素影响(假设pi本身在防水盒中)

  15. 你好,
    您的python脚本运行良好!我将其扩展到两个传感器,用于测量空气除湿机入口和出口的湿度。我想在我的应用热力学课程中将其用于教学目的。当我引用您的参考文献时,您是否可以允许我使用您的脚本并进行发布?

    最好的祝福,
    安德烈

  16. 很棒的剧本!感谢您的分享和分步说明。

    在我终于设法正确连接传感器之后,可以正常工作。

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.