传感器 · 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 |
|---|---|---|
| 电源 | VCC | 3.3V(只能 3.3V,接 5V 会烧) |
| 地 | GND | GND |
| 时钟 | SCL | PB8 |
| 数据 | SDA | PB9 |
| 模式 | CSB | 悬空(板载上拉,走 I2C 模式) |
| 地址 | SDO | 悬空 = 0x76;接 VCC = 0x77 |
OLED(与 BMP280 共用总线):
| 信号 | OLED | STM32F103C8T6 |
|---|---|---|
| 电源 | VCC / VDD | 3.3V |
| 地 | GND | GND |
| 时钟 | SCL / SCK | PB8(与 BMP280 共用) |
| 数据 | SDA | PB9(与 BMP280 共用) |
烧录:ST-Link → SWD 四线;串口:PA9(TX) / PA10(RX) → CP2102(115200,可选)。
最容易接错的三处:
- 供电只能 3.3V。BMP280 板上没有稳压器,接 5V 直接烧坏芯片,这是和大多数 3.3V/5V 都能用的模块最不一样的地方。
- PB8/PB9 是一条总线接两个设备,不是分别接两条总线——OLED 和 BMP280 的 SCL 接一起、SDA 接一起。
- 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 SENSOR | I2C 找不到 BMP280 | 整屏 "NO SENSOR" |
| ERROR | 读数超出量程(气压 300~1100hPa / 温度 -40~85°C) | 整屏 "READ ERROR" |
Code notes
关键代码说明
- 真实 I2C ACK 探测:OLED 初始化前先手动发地址等 ACK(
i2cPresent()),比只看display.begin()返回值更严格,能准确区分"没接"和"接了但初始化失败"。 - 双地址自动尝试:
for (uint8_t addr : {0x76, 0x77})依次尝试,不用手动改代码适配不同 SDO 接法。 - 只在变化时重绘 OLED:温度/气压/状态没变就不重画,减少无谓刷新和闪烁。
- 异常态绝不显示旧数据:
UI_NO_SENSOR/UI_READ_ERROR直接整屏提示,不会把上一次的正常数值继续画在屏幕上误导人。 - 相对高度算法:
relativeAltitude()用标准大气压公式,指数1/5.255和 Adafruit 官方库readAltitude()内部算法一致。 - 浮点 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
实机图片
- bmp280-module.jpg — 模块特写(面包板上,实拍视频原始素材帧截取)
- bmp280-wiring-result.jpg — 实拍接线+结果照片(模块 + 面包板 + STM32 + OLED 显示 TEMP/PRESS/ALT 实测值)
- bmp280-flash-success.jpg — 烧录成功截图(VS Code + PlatformIO 终端 SUCCESS + OLED 同框)
- bmp280-no-sensor.jpg — NO SENSOR 实拍(用户拍摄,模块未接好时 OLED 整屏提示,2026-08-19)
Download
下载
Video
视频演示
本轮未处理视频剪辑(只做网页资料)。已有实拍原始素材:视频/素材/01_实验实拍.MOV(61s,接线+OLED演示+按压感压孔)、视频/素材/02_BMP280焊接.MOV(40s,焊接过程)、视频/素材/03_烧录.mp4(145s,PlatformIO 烧录全过程)。动画工程尚未制作,视频演示板块待成片后再补。
Sources
资料来源
- 接线、代码、OLED UI、状态机、串口输出:本项目实测,2026-08-19 实机测试
- I2C 地址选择、数字气压计原理、过采样/IIR 滤波:资料参考,芯片资料与常规工程实践,由我们重新整理
- 相对高度换算公式(气压高度公式):资料参考,国际标准大气压公式,公开通用算法