Skip to main content

大气压强传感器(BMP280)

前言

本实验中大气压强传感器模块使用的是BMP280,这是一款专为移动应用而设计的高精度大气压传感器, 传感器模块采用极其紧凑的封装,其小尺寸和低功耗可以应用在手机、 GPS 模块、 手表的电池供电设备中。 BMP280 传感器除了可以测量大气压强,还可以测量温度(温度精度不高)以及通过计算公式来换算出海拔高度。

实验平台

pyWiFi-ESP32-S3开发套件和大气压强传感器模块,传感器连接到I2C/UART扩展接口。 bmp280_1

实验目的

通过python编程实现测量当前环境的大气压强、温度信息,将大气压强通过公式计算出当前海拔高度,打造自己的气压计!

实验讲解

市面上大多BMP280模块都通用,使用I2C总线通讯,下图是一款BMP280传感器模块:点击购买>>

bmp280_1

模块参数
供电电压3.3V
工作电流<20mA
通信方式I2C总线
I2C地址0x76(BMP280的SDO默认下拉);
当 BMP280 的 SDO 引脚上拉时,I2C 地址为:0x77
引脚说明VCC: 接3.3V
GND: 接地
SDA: I2C数据引脚
SCL: I2C时钟引脚

从上面介绍可以看到,BMP280是一款通过I2C接口驱动的传感器。连接到pyBase左下角的I2C外扩接口上。我们通过前面学习的I2C接口使用的方式,即可以对该模块实现数据通讯。

海拔高度计算:

标准大气压是指把温度为0℃、纬度45度海平面(海拔为0米)上的气压称为1个大气压,其数值为101325 帕斯卡(Pa)。

大气压和海拔高度的关系:P=P0×(1-H/44300)^5.256

因此计算高度公式为:H=44300*(1- (P/P0)^(1/5.256) )

上式中:H为海拔高度,P0=标准大气压(0℃,101325Pa)

从上面公式可以看到,高度是通过大气压强换算出来的,从物理学的角度我们可以知道,高度越高的地方,空气越稀薄,大气压强越低。通过气压的变化我们就可以计算出海拔高度;但是这存在特定条件,那就是温度为0℃的时候,而温度越高的地方,空气越稀薄,大气压强就越低。因此高度数据理论上需要做温度补偿,因此本实验的高度值换算存在一定的误差。有兴趣的小伙伴可以自行深入研究。

Python的强大之处是其有丰富的模块和函数库,一旦模块建立了,那么后来者使用起来就非常简单,无须再去做底层驱动的开发。从而实现面向对象的编程,而当有需要的时候又可以去改底层代码,可以说是进可攻退可守,非常灵活。在这里我们直接调用已经编写好的python驱动文件,该文件实现了对大气压、温度、高度的测量和计算。用户直接使用即可,具体如下:

BMP280对象

构造函数

bmp = bmp280.BMP280(i2c)

构建bmp280对象。

参数说明:

  • i2c :定义好的I2C对象。

使用方法

bmp.getTemp()

返回温度值,单位℃,数据类型为float


bmp.getPress()

返回气压值,单位Pa,数据类型为float


bmp280.pressure()

返回大气压强值,单位hPa (1hPa = 100Pa), 数据类型为float


bmp.getAltitude()

返回海拔高度值,单位m, 数据类型为float


理解了BMP280传感器原理和对象使用方法后,我们可以整理出编程思路,流程图如下 :

参考代码

'''
实验名称:大气压强传感器
版本:v1.0
平台:pyWiFi ESP32-S3
作者:01Studio 【www.01Studio.cc】
说明:测量BMP280温度、气压和计算海拔值,并在OLED上显示。。
'''

import bmp280
from machine import Pin,SoftI2C,Timer
from ssd1306 import SSD1306_I2C

#初始化OLED
i2c = SoftI2C(sda=Pin(42), scl=Pin(40))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)

#初始化BMP280,定义第二个I2C接口i2c2用于连接BMP280
i2c2 = SoftI2C(sda=Pin(9), scl=Pin(8))
BMP = bmp280.BMP280(i2c2)

#中断回调函数
def fun(tim):

oled.fill(0) # 清屏,背景黑色
oled.text('01Studio', 0, 0)
oled.text('Air Pressure:', 0, 15)

# 温度显示
oled.text(str(BMP.getTemp()) + ' C', 0, 35)
# 湿度显示
oled.text(str(BMP.getPress()) + ' Pa', 0, 45)
# 海拔显示
oled.text(str(BMP.getAltitude()) + ' m', 0, 55)

oled.show()

#开启RTOS定时器
tim = Timer(1)
tim.init(period=1000, mode=Timer.PERIODIC, callback=fun) #周期1s

实验结果

由于本例程代码依赖其它py库,所以需要将bmp280.py文件上传到开发板文件系统:

bmp280

使用Thonny IDE运行主程序代码,可以看到终端打印出温度、气压和海拔高度信息:

bmp280

开发板接上锂电池供电,尝试上下楼,会发现气压和海拔数值相应的变化。

bmp280