BMP280 气压/海拔传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| BMP280 模块 | 1 | — |
价格随渠道波动,以购买页实时为准。
做一个气象站的时候,温度湿度都搞定了,总觉得缺点什么——天气预报里那个"气压 1013 hPa",还有"今天海拔多少米",靠 DHT22 是测不出来的。气压这件事得交给专门的器件。BMP280 就是干这个的:它是一颗指甲盖大小的 MEMS 气压传感器,能测出大气压强,顺带把温度也给你测了,再换算一下还能告诉你大概在多高的海拔。一个气象站、一个海拔计、甚至无人机的"定高",核心都是它。
工作原理
BMP280 的核心是一片 MEMS 压阻膜片。把它想象成一张极薄的硅薄膜,膜的一面封着已知的参考腔,另一面对着外界大气。大气压越大,膜片被压得越弯,膜上做的压阻电桥阻值就随形变改变,输出一个微弱的模拟电压。芯片内部的 ADC 把这个电压数字化,再用出厂时烧进 NVM 的标定系数做温度补偿,最后通过 I2C 把一个数字气压值递出来。所以严格说它是个"压力计",海拔是算出来的。
气压和海拔的关系是物理规律:海拔越高、头顶的空气柱越短,压强越低。标准大气下,海平面约 1013.25 hPa,每往上爬约 8.3 米气压掉 1 hPa(越高越缓)。工程上常用国际气压公式做近似换算:
海拔(m) = 44330 × (1 - (P / P0) ^ 0.1903)
其中 P 是当前实测气压,P0 是当地海平面气压。注意 P0 不是固定的 1013.25——它每天随天气变化,差几个 hPa 很正常。所以想测准绝对海拔,必须拿当地实时的海平面气压去校准;不校准的话,算出来的海拔可能偏几十上百米。但如果只关心相对高度变化(比如爬了几层楼、升降了多少),那不校准也很准,能分辨出电梯上下一层的气压差,相对精度可达约 ±1 米。
接线
BMP280 是标准 I2C 器件,两根信号线加电源地,共四根:
| BMP280 | ESP32 | 说明 |
|---|---|---|
| VCC | 3.3V | 3.3V 器件,不要接 5V |
| GND | GND | 共地 |
| SDA | GPIO21 | I2C 数据线,默认 SDA |
| SCL | GPIO22 | I2C 时钟线,默认 SCL |
SDA/SCL 需要上拉电阻(一般 4.7kΩ),绝大多数模块板上已经焊好,直接接即可,原理见 上拉电阻。I2C 总线能挂多个设备,BMP280 占用一个地址。
关于地址:模块的地址是 0x76 或 0x77,取决于 SDO 引脚拉高还是拉低。市面上不同卖家的模块默认值不一样——同样标着 BMP280,有的是 0x76 有的是 0x77。初始化时地址写错,库就会报 begin 失败。I2C 的总线规则见 I2C 原理。
地址只有 0x76 和 0x77 两种,一个不行就换另一个。最稳的办法是先跑一遍 I2C Scanner,把扫到的实际地址填进代码,省得来回猜。另外再强调一次:BMP280 是 3.3V 器件,接 5V 有烧片风险。
完整代码
用 Adafruit_BMP280 库(库管理器里搜 "Adafruit BMP280" 安装,会一并拉上 Adafruit Unified Sensor 依赖)。下面这段读气压、温度,并按当地海平面气压算出海拔:
#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // 默认走 I2C
// 当地实时海平面气压(hPa),从天气 App 或机场 METAR 查
// 不校准就用标准值 1013.25,但绝对海拔会不准
#define SEALEVEL_HPA 1013.25
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // ESP32 指定 SDA=21, SCL=22
// 地址先试 0x76,失败再换 0x77
if (!bmp.begin(0x76)) {
Serial.println("没找到 BMP280,换 0x77 再试...");
if (!bmp.begin(0x77)) {
Serial.println("还是没找到,检查接线和地址");
while (1) delay(100);
}
}
// 推荐的采样配置:标准室内/天气场景
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2, // 温度过采样
Adafruit_BMP280::SAMPLING_X16, // 气压过采样(高精度)
Adafruit_BMP280::FILTER_X16, // IIR 滤波,抑制抖动
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
float tempC = bmp.readTemperature(); // 摄氏度
float pressPa = bmp.readPressure(); // 帕斯卡 Pa
float pressHpa = pressPa / 100.0; // 换算成 hPa
float altM = bmp.readAltitude(SEALEVEL_HPA); // 海拔(米)
Serial.print("温度: "); Serial.print(tempC, 1); Serial.print(" C ");
Serial.print("气压: "); Serial.print(pressHpa, 2); Serial.print(" hPa ");
Serial.print("海拔: "); Serial.print(altM, 1); Serial.println(" m");
delay(1000);
}
气压过采样开到 X16、加 IIR 滤波,是为了让读数稳,否则手一靠近、门一开就跳。
你应该看到什么
打开串口监视器(波特率 115200),正常会持续刷出一行行数据:
温度: 24.6 C 气压: 1008.32 hPa 海拔: 43.2 m
温度: 24.6 C 气压: 1008.30 hPa 海拔: 43.4 m
温度: 24.7 C 气压: 1008.35 hPa 海拔: 42.9 m
把传感器从桌上举到头顶(升高约 1.5 米),多看几秒,海拔读数会跟着上抬零点几到一米多——这就是它能分辨楼层高度的灵敏度。气压数字在小数点后第二位轻微跳动是正常的,那是真实的空气扰动加噪声。
读数解读 / 校准
- 气压单位:芯片输出的是 Pa(帕),除以 100 得到天气预报常用的 hPa(百帕,等于旧单位毫巴)。海平面附近通常在 980~1040 hPa 之间。
- 气压精度:BMP280 的相对精度约 ±1 hPa,对应约 ±8 米的绝对高度不确定度——所以单看一次读数推绝对海拔,误差是米级到十米级的。
- 相对高度:连续测量、看变化量时精度高得多,可达约 ±1 米,这正是它做爬楼统计、电梯检测的底气。
- 关于校准:
readAltitude()里那个SEALEVEL_HPA必须填当地当时的海平面气压才准。这个值天天变,可以从天气 App、机场 METAR 报文里查到。填错或用默认 1013.25,温度气压照样准,唯独绝对海拔会整体偏移几十上百米。
选型 / 避坑
BMP280 属于博世环境传感器家族,几个同系列型号接线几乎一致,按需求往上加:
| 型号 | 多出来的能力 | 适用场景 |
|---|---|---|
| BMP280 | 气压 + 温度 | 海拔计、定高、楼层检测 |
| BME280 | 再加湿度 | 完整气象站(温湿压三合一) |
| BME680 | 再加空气质量 VOC | 室内空气监测、IAQ |
它们都是 I2C/SPI、3.3V、地址同样是 0x76/0x77,库也基本通用——今天用 BMP280 写好的代码,换成 BME280 几乎只改库名和多读一个湿度值。所以如果气象站日后要加湿度,直接选 BME280 一步到位最省事。
模块地址在 0x76 和 0x77 之间,不同卖家默认值不同,别假定一定是 0x76。代码里养成"先试 0x76 再试 0x77"的习惯,或者先扫总线,能少踩很多"明明接好了却 begin 失败"的坑。
故障排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| begin 一直失败 | 地址填错 | 0x76 / 0x77 互换试,或先跑 I2C Scanner |
| 扫不到任何 I2C 设备 | SDA/SCL 接反或虚焊 | 检查接线,确认两根线没插反 |
| 读数全是 0 或乱跳 | 供电不稳 / 接了 5V | 确认接 3.3V,电源地接牢 |
| 海拔严重不准 | 没用当地海平面气压校准 | 填入实时 SEALEVEL_HPA |
| 气压读数小数位狂跳 | 没开滤波 | 打开 IIR FILTER 和过采样 |
| 温度偏高 1~2 度 | 自发热 / 贴近主控 | 远离发热器件,或软件减偏置 |
进阶 / 变体
把 BMP280 配一块 OLED 屏,就是一个独立的气压海拔计:屏上实时显示 hPa 和米数,举高放低数字跟着动,做成口袋小工具很直观,做法可参考 显示屏小项目。再进一步,把气压数据定时上传到云端,画成 24 小时气压曲线——气压持续走低往往预示天气转坏,这就是最朴素的"自制天气预报"。如果想让设备自动判断"是不是要下雨了""是不是在爬楼梯",可以把气压时间序列喂给轻量模型做判断,思路见 传感器 + AI。
典型应用
- 气象站:测大气压,配 BME280 还能一起出温湿度,画气压趋势预判天气。
- 海拔计 / 登山表:用相对高度变化统计爬升,运动手环的"爬楼层数"就是这么来的。
- 无人机定高:气压变化反映高度变化,是无人机悬停保持高度的关键传感器之一。
- 室内楼层检测:靠层与层之间约 4 hPa 的气压差,判断在第几层、是否在乘电梯。
小结
BMP280 用 MEMS 压阻膜片测大气压,I2C 接 SDA/SCL、3.3V 供电,地址 0x76 或 0x77 两选一。气压单位 hPa、相对精度约 ±1 hPa,换算海拔需要当地海平面气压校准才能测准绝对值,但相对高度变化能精确到约 ±1 米。要加湿度选 BME280、要加空气质量选 BME680,接线和代码几乎不用改。
相关阅读:I2C 原理 · 上拉电阻 · DHT22 温湿度 · 传感器 + AI · 回到 传感器目录
参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。