传感器 · BMP280 气压传感器模块(GY-BMP280-3.3,I2C,3.3V 专用)

BMP280 气压/温度传感器 STM32F103 接线与代码 实测通过

BMP280 就是给单片机装一个「感知气压和温度」的传感器——摸一下芯片,温度立刻跟着变;按一下模块上的感压孔,气压瞬间跳动。它和 OLED 共用同一条 I2C 总线,两个不同地址互不打架,STM32 一次性把温度、气压、相对高度都读出来显示。 本页是 STM32F103C8T6 + BMP280 + 0.96 OLED 的完整实机验证记录:接线表、完整代码、工程 ZIP 全部实测通过。 最值得看的是「开机为什么要等 5 秒」和「相对高度是怎么算出来的,为什么不是真实海拔」这两段。

Quick Facts

  • 型号:BMP280 气压传感器模块(GY-BMP280-3.3,I2C,3.3V 专用)
  • 平台:STM32F103C8T6 + PlatformIO + Arduino(STM32duino)
  • SKU:M1505
  • 更新:2026-08-19

Verified

实机验证结果

OLED 显示 BMP280 标题 + 右上角状态(OK/CAL/NO SENSOR/ERROR)+ TEMP/PRESS/ALT 三行数值(左标签 + 右大字号数值)。

测试动作OLED 显示
刚上电(前 5 秒)右上角 CAL,TEMP/PRESS 正常,ALT 显示 ---(还没校准出基准气压,不显示假的 0.0m)
校准完成后静置右上角 OK,TEMP≈室温,PRESS≈当地气压,ALT +0.0m 附近
手捂芯片 2~3 秒TEMP 明显上升,PRESS 基本不变
手指按住感压孔PRESS 上升(实测可 +5~30hPa),ALT 变为负值(模型上"气压变高=位置变低")
松手数值逐渐恢复
断开模块或接触不良整屏只显示 NO SENSOR 或 READ ERROR,绝不显示上一次的旧数值

串口输出示例(115200,每 1 秒一行):

BMP280 demo v1.1 starting...
OLED 0x3C: I2C ACK ok
OLED 0x3C: display init ok
BMP280: found at 0x76
BMP280 calibrating 1/5 ... T=26.3 C P=1005.4 hPa
BMP280 calibrating 2/5 ... T=26.3 C P=1005.3 hPa
BMP280 base pressure calibrated: 1005.3 hPa
BMP280 OK | T=26.5 C | P=1005.2 hPa | Alt=+0.1 m (base 1005.3 hPa)

实机验证环境(每一项都是真正用过的):

项目本项目使用
主控STM32F103C8T6(BluePill)
模块BMP280 气压传感器(GY-BMP280-3.3,I2C,3.3V 专用)
显示0.96 寸 OLED,SSD1306,128×64,0x3C
开发工具VS Code + PlatformIO
框架Arduino / STM32duino
烧录ST-Link
串口115200
依赖库Adafruit SSD1306、Adafruit GFX Library、Adafruit BMP280 Library

未测试的环境不当成支持:本项目没有在 Arduino IDE、Keil、STM32CubeIDE 下编译或验证过,不提供这些环境的支持说明。

About

这个模块干什么

BMP280 是一颗数字气压/温度传感器芯片,装在一块小板上(常见丝印 GY-BMP280-3.3),走 I2C 通信,只能 3.3V 供电(板上没有稳压器,接 5V 会烧坏芯片)。

三个要点:

  • 一颗芯片,两个量:同一颗传感器同时给出温度和气压,不需要额外接线。
  • 和 OLED 共用一条 I2C 总线:两个设备地址不同(OLED 0x3C,BMP280 0x76/0x77),接在同一组 SCL/SDA 上互不打架。
  • 相对高度不是绝对海拔:模块本身只测气压,"高度"是程序拿开机时的气压当 0 点,用气压变化换算出来的相对值,和天气变化、真实海拔无关。

Wiring

接线

BMP280 主接线 4 根 + OLED 4 根,两者共用同一条 I2C 总线。

BMP280(丝印 VCC / GND / SCL / SDA / CSB / SDO):

信号模块丝印STM32F103C8T6
电源VCC3.3V(只能 3.3V,接 5V 会烧)
地GNDGND
时钟SCLPB8
数据SDAPB9
模式CSB悬空(板载上拉,走 I2C 模式)
地址SDO悬空 = 0x76;接 VCC = 0x77

OLED(与 BMP280 共用总线):

信号OLEDSTM32F103C8T6
电源VCC / VDD3.3V
地GNDGND
时钟SCL / SCKPB8(与 BMP280 共用)
数据SDAPB9(与 BMP280 共用)

烧录:ST-Link → SWD 四线;串口:PA9(TX) / PA10(RX) → CP2102(115200,可选)。

最容易接错的三处:

  1. 供电只能 3.3V。BMP280 板上没有稳压器,接 5V 直接烧坏芯片,这是和大多数 3.3V/5V 都能用的模块最不一样的地方。
  2. PB8/PB9 是一条总线接两个设备,不是分别接两条总线——OLED 和 BMP280 的 SCL 接一起、SDA 接一起。
  3. PA13/PA14 别占用,留给 ST-Link 调试。

How it works

工作原理

  • 数字气压计:BMP280 内部把气压转换成数字量直接通过 I2C 输出,不需要外部 ADC。
  • I2C 地址选择:SDO 引脚悬空或接地时地址是 0x76,接 VCC 时是 0x77,本项目代码会依次尝试两个地址,自动找到模块。
  • 气压转相对高度:用国际标准大气压公式 ΔH = 44330 × (1 - (P/P0)^(1/5.255)),P0 是基准气压(本项目取开机 5 秒平均值),这是气压计算高度的通用公式,不是我们发明的。
  • 过采样与 IIR 滤波:芯片内部对温度、气压做多次采样平均(过采样),再叠加一层 IIR 低通滤波,读数更稳定、抗突然的气流干扰。

Notes

程序逻辑(本项目实测)

上电 -> I2C 找 OLED(0x3C) 和 BMP280(0x76/0x77)
     -> 前 5 秒:每秒读一次气压求平均 -> 得到基准气压 P0,期间 ALT 显示 "---"
     -> 之后每秒:读温度/气压 -> 算相对高度 -> 状态机判断 OK/ERROR -> OLED + 串口

四态状态机,异常时整屏只显示提示、绝不显示旧数据:

状态触发条件OLED 显示
OK正常读数TEMP / PRESS / ALT 三行数值
CAL开机前 5 秒TEMP / PRESS 正常,ALT 显示 ---
NO SENSORI2C 找不到 BMP280整屏 "NO SENSOR"
ERROR读数超出量程(气压 300~1100hPa / 温度 -40~85°C)整屏 "READ ERROR"

Code notes

关键代码说明

  1. 真实 I2C ACK 探测:OLED 初始化前先手动发地址等 ACK(i2cPresent()),比只看 display.begin() 返回值更严格,能准确区分"没接"和"接了但初始化失败"。
  2. 双地址自动尝试:for (uint8_t addr : {0x76, 0x77}) 依次尝试,不用手动改代码适配不同 SDO 接法。
  3. 只在变化时重绘 OLED:温度/气压/状态没变就不重画,减少无谓刷新和闪烁。
  4. 异常态绝不显示旧数据:UI_NO_SENSOR / UI_READ_ERROR 直接整屏提示,不会把上一次的正常数值继续画在屏幕上误导人。
  5. 相对高度算法:relativeAltitude() 用标准大气压公式,指数 1/5.255 和 Adafruit 官方库 readAltitude() 内部算法一致。
  6. 浮点 printf 修复:platformio.ini 里 build_flags = -Wl,-u,_printf_float 必须保留,否则 newlib-nano 下 %f/%.1f 输出空白。

Code

完整代码

完整代码见 src/main.cpp(v1.1)。依赖库 Adafruit SSD1306、Adafruit GFX Library、Adafruit BMP280 Library 由 PlatformIO 按 platformio.ini 自动下载。

Troubleshooting

常见问题排查

  • OLED 显示 NO SENSOR → 查 VCC 是否 3.3V(5V 会烧)、SCL/SDA 是否接 PB8/PB9、GND 是否共地。
  • OLED 显示 READ ERROR → 读数超出正常量程,一般是接触不良,检查接线是否插紧。
  • ALT 一直是 --- → 正常,开机 5 秒校准期,5 秒后自动切到数值显示。
  • 数值不显示 / 空白 → 检查 platformio.ini 的 -Wl,-u,_printf_float 有没有被删掉。
  • 串口看不到 → pio device list 查 COM,本模块不看串口也能用(OLED 直接看数值)。
  • 相对高度和天气预报的气压不一样 → 正常,本项目的 ALT 是相对开机基准的高度变化,不是绝对海拔,也不追求和气象站数据对齐。

Photos

实机图片

Download

下载

bmp280-pressure-sensor-stm32-platformio.zipPlatformIO 工程(platformio.ini + src/main.cpp + README.md),已去掉本机构建路径,保留浮点 printf 编译参数,解压后 VS Code 打开即可 Build。
下载 ZIP(0.01 MB)

Video

视频演示

本轮未处理视频剪辑(只做网页资料)。已有实拍原始素材:视频/素材/01_实验实拍.MOV(61s,接线+OLED演示+按压感压孔)、视频/素材/02_BMP280焊接.MOV(40s,焊接过程)、视频/素材/03_烧录.mp4(145s,PlatformIO 烧录全过程)。动画工程尚未制作,视频演示板块待成片后再补。

Sources

资料来源

  • 接线、代码、OLED UI、状态机、串口输出:本项目实测,2026-08-19 实机测试
  • I2C 地址选择、数字气压计原理、过采样/IIR 滤波:资料参考,芯片资料与常规工程实践,由我们重新整理
  • 相对高度换算公式(气压高度公式):资料参考,国际标准大气压公式,公开通用算法