BME280设备是数字气压传感器,是BMP180的略微升级版本。这在一个小模块上可用,该模块可通过I2C接口访问传感器。这使我们可以轻松地将其连接到Raspberry Pi并使用Python读取数据。 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 | 描述 | 通用输入输出接头引脚 |
---|---|---|
VCC | 3.3V | P1-01 |
地线 | 地面 | P1-06 |
SCL | I2C SCL | P1-05 |
SDA | I2C SDA | P1-03 |
这是面包板设置图。如果要连接模块’只需将四个针脚直接连接到Pi,您只需要四根母-母线即可。
可用的其他模块具有不同的针脚排列,因此,如果您的针脚与本教程中显示的针脚不同,请确保将正确的针脚连接到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上看到的输出:
脚本细目
该脚本相当简单,但是其中包含一些令人恐惧的数学公式。这是在数据表中定义的,不用担心它如何工作,您将被原谅!如果您想更详细地了解脚本,请参见下面的脚本摘要:
- 导入一些库
- 定义一些功能
- 函数主体使用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条留言
谢谢你!该脚本很好用,我用你的例子作为‘library’ –我需要做的就是导入一个功能,并且有一个可以显示周围环境的工作显示器!做得好!
嗨,这也可以与似乎有额外引脚的BMP280一起使用吗?谢谢你。
嘿。由于I2C,BME280的线长限制是多少?一世’我前段时间读过I2C导线较长的问题,您对此一无所知吗?
我认为i2c的上限为几米,但这取决于许多因素,包括电阻和i2c时钟频率。
我的BME280模块没有’t具有SDA连接,但有两个标记为SDI和SDO–我应该使用SDO来输出数据吗?因此,我’m接收到I / O错误(IOError:[Errno 5]输入/输出错误)。
您也有一个SCK引脚吗? SDO / SDI通常用于SPI接口,但是某些模块允许您使用SCK / SDI引脚执行i2c。
我有同样的问题。通过将SDO连接到GND进行修复。
太感谢了
我意识到,第一次阅读是不正确的,只有第二次和第二次是不正确的。
你好,
现在工作正常。
下一步是:
1.将详细信息记录到文件中,以便我可以将手册导出到excel
2.未来的出口汽车自动制作图形’s for it
3.使BME280在OpenPlotter中工作
但是作为Python中的新手,我想一步一步地做,所以我也将对Python有一些了解。
有人可以为下一步指示日志脚本指出正确的方向吗?
谢谢
铝
谢谢你,马特。在找到您的博客文章之前,我很难找到有关如何使用此模块的信息。
嗨,很棒的网站,注意到此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)#等待所需的时间
你好!
我将代码与数据表进行了比较,我想知道第140行是否有错字:可能是16384.8应该是16384.0,而不是?
I’m也有点困惑,因为优化计算使用的公式与数据表中的公式不同。一世’在调查湿度时,我得到了不同的值(最终%值约为0.001)。移位(根据数据表)的效果可能与将早期转换为浮点的效果不同(如您的代码一样)吗?
非常感谢您的代码!
我对使用此代码从BME280发出的湿度数据感到困惑,因为这些值一直在72%的区域内。调查表明,您没有初始化寄存器0xF2,而是将湿度过采样设置为0。当我添加几行来纠正此问题时,我开始接收与HTU21D匹配的值。
史蒂夫
我很陌生,很困惑。
您能否更详细地说明为纠正此问题而添加的行。
谢谢
该脚本已被更新。之后的两行“#湿度寄存器的过采样设置– page 26”初始化湿度寄存器。
我在使用此脚本时遇到困难。我进行了2次更改,以舍入压力值并输出raw_hum值(用于调试)。湿度始终为0.0%,raw_hum从35152永远不会变化。是否还有其他人遇到此问题,或者我的传感器有问题吗?
pi @ raspberrypi:〜$ python bme280.py
芯片编号:88
版本:0
温度:27.38 C
压力:997.71 mbar
湿度:0.0%
原始湿度:35152
您肯定在使用BME280吗?许多在湿度方面有问题的人正在使用BMP280,它不能’t support it.
我确实有这个问题。我只是注意到我有BMP20而没有BME280。
!!!打扰 !!!
在使用BME280传感器进行了数周的数据采集后,我确认了Matt’s软件的湿度读数有问题。奇怪的是,温度和湿度曲线具有相同的形状。当我安装Adafruit库时,该问题已解决。检查了源代码之后,似乎唯一的区别是Adafruit库在写入注册表和读取湿度值之间执行的暂停,其中Matt’的代码根本不会暂停。从BME数据表,附录B“测量时间和电流计算”似乎确实需要暂停。
谢谢尼科洛。你是对的。一世’ve在等待之前添加了等待“read”根据数据表中给出的方程式“Appendix B: 测量时间和电流计算”.
你好
1 –我想修改此脚本以在microPython MCU(Lopy)上使用它,我该如何处理ctypes库?
2 –由于电线太长,我需要切换到SPI吗?
感谢帮助
阿兰
嗨,它可以正常工作,但从昨天开始,它停止读取任何内容。快速检查后,我得到以下消息作为脚本的响应:
追溯(最近一次通话):
文件“/usr/lib/python2.7/site.py”, line 68, in
导入操作系统
文件“/usr/lib/python2.7/os.py”, line 400, in
导入UserDict
ValueError:错误的元帅数据(字符串引用超出范围)
但是我什么都没做…我的设备坏了吗?
删除.pyc文件。如果它们已损坏,则会发生此错误。当您运行.py脚本时,将重新创建.pyc文件。
嗨,马特,想说谢谢您的工作,这使我的生活变得轻松!
我在Orange-Pi-PC上使用bme280,并且可以很好地用作导入模块/ smbus0 /
真是太好了,感激不尽!
谢谢你的分享。这对我来说非常有效,并节省了大量时间。我很感激!
谢谢马特!你节省了我几个小时的工作。太感谢了!!
马特于2017年1月3日晚上11:39
删除.pyc文件。如果它们已损坏,则会发生此错误。当您运行.py脚本时,将重新创建.pyc文件。
我对测量室外湿度和温度感兴趣–我可以在外面使用吗?我是否需要以某种方式保护它不受元素影响(假设pi本身在防水盒中)
我认为压力传感器是设备中的一个小孔。因此,需要采取防雨防尘措施。
我有这个设备:
底部: //i.imgur.com/epDTAf1.jpg
最佳: //i.imgur.com/mEgQxZN.jpg
这是BMP280还是BME280?
它没有’读取湿度。 (??)
=================================
pi @ raspberrypi2:〜/ test $ python bme280.py
芯片编号:88
版本:1
温度:26.9摄氏度
压力:1012.39631211 hPa
湿度:0.0%<———-?????
================================
芯片ID(88)是否有任何说明?
我认为BMP280是芯片ID 88(0x58),但BME280是96(0x60)。因此,我怀疑您的设备是BMP280。
你好,
您的python脚本运行良好!我将其扩展到两个传感器,用于测量空气除湿机入口和出口的湿度。我想在我的应用热力学课程中将其用于教学目的。当我引用您的参考文献时,您是否可以允许我使用您的脚本并进行发布?
最好的祝福,
安德烈
嗨,安德烈,很高兴您发现该脚本很有用。很高兴您在课堂教学材料中使用它。
这是阅读bme280的最好方法!我尝试了许多其他选项,效果很好,谢谢分享!!!
伟大的!非常感谢。做得好。
伟大的!非常感谢。做得好。
脚本用完了。一世’我会为我做一堂课。
享受!
我也尝试了很多“ways”阅读此传感器,但您的脚本到目前为止是最好的!
非常感谢分享– good work
谢谢!!!!
像魅力一样工作!感谢这个简单的教程。
嗨,马特,辛苦了!温度和湿度读数很好,但压力始终显示在948附近–952 hPa。可能是传感器问题吗?
你好,
为了使它进入循环该怎么做?
谢谢,
卡塔林
很棒的剧本!感谢您的分享和分步说明。
在我终于设法正确连接传感器之后,可以正常工作。
你好,
做得好!
有没有一种方法可以将数据添加到Influx / Grafana?