← 返回传感器图鉴

BMP280 气压/海拔传感器

最后更新 2026-06-20
⏱ 约 6 分钟 🟡 涉接线/强电
🛒 器材清单
器材数量参考
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 为准;本页公开资料整理,接线与代码请结合实物验证。

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明