使用 BMP280 和 Arduino UNO 实现精准温度、气压与海拔测量
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Adafruit BMP280 气压传感器模块 | 1 |
| Adafruit OLED 128x32 I2C 显示屏 | 1 |
项目简介
本教程将演示如何结合 Arduino UNO 开发板、BMP280 传感器模块与 OLED 显示屏,实时测量并显示温度、气压及海拔高度。BMP280 是一款高精度、低功耗的数字气压传感器,同时支持温度测量,通过气压数据还可推算海拔。以下是该传感器的关键参数(摘自数据手册):

项目将同时支持公制(摄氏度、百帕、米)与英制(华氏度、英寸汞柱、英尺)单位显示,代码中可轻松转换。硬件连接采用 I2C 接口,BMP280 与 OLED 共享 SDA/SCL 线(Arduino UNO 对应 A4/A5),供电方面 BMP280 接 5V,OLED 接 3.3V。
接线与故障排查
1. 基础接线
两个模块均通过 I2C 总线连接:
- SDA → Arduino A4
- SCL → Arduino A5
- BMP280 VCC → 5V,GND → GND
- OLED VCC → 3.3V,GND → GND

2. 常见问题:I2C 地址不匹配
部分 BMP280 模块的默认 I2C 地址为 0x76,而 Adafruit 库默认使用 0x77。若串口监视器提示“Could not find a valid BMP280 sensor”,请按以下步骤修正:
- 断开其他 I2C 设备,上传 I2C 扫描器代码,记录检测到的地址(如 0x76)。
- 打开库文件
Adafruit_BMP280.h(通常位于Documents/Arduino/libraries/Adafruit_BMP280_Library)。 - 在第 41 行左右找到
_i2caddr定义,将默认的0x77修改为扫描到的地址(如0x76)。 - 保存并重新上传测试代码,传感器应能正常识别。
代码示例
提供四个版本的完整代码,分别对应串口输出(公制/英制)与 OLED 显示(公制/英制)。核心库文件均来自 Adafruit 官方仓库:
串口输出版(公制单位)
/* BMP280 公制单位串口输出示例
* 测量温度、气压、海拔并在串口监视器显示
* 基于 Adafruit 官方例程修改
*/
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C 接口
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
// 默认采样设置
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure()/100); // 转换为 hPa
Serial.println(" hPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1019.66)); // 海平面基准气压,需根据当地实况调整
Serial.println(" m");
Serial.println();
delay(2000);
}
OLED 显示版(公制单位)
/* BMP280 + OLED 显示(公制单位)
* 在 128x32 OLED 上显示温度、气压、海拔
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature();
float P = bmp.readPressure()/100;
float A = bmp.readAltitude(1019.66);
display.setCursor(0,0);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("C");
display.setCursor(65,0);
display.print("Pres");
display.setCursor(65,10);
display.print(P);
display.setCursor(110,10);
display.print("hPa");
display.setCursor(65,25);
display.print("Alt");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("m");
display.display();
delay(2000);
}
英制单位版本仅在单位换算上不同(温度转华氏度、气压转 inHg、海拔转英尺),代码结构相同,请参考完整源码。
测试效果展示


若在复现过程中遇到问题,欢迎在评论区留言交流。
制造工艺
- 集成二维码、RFID与体温验证的门禁控制系统
- 树莓派多路DS18B20 1-Wire温度监测:接线与编程全指南
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- 树莓派配合 EzTemp 实现无缝温湿度监测
- DIY 家酿温控系统:Arduino 监测与调节发酵温度
- 树莓派 I2C 接口 BMP085:高精度温度与气压读取
- 实验室级热电偶精密测温与记录:树莓派接 ADS1118
- 树莓派多传感器温度光照监测系统:DS18B20 实战构建
- 基于模拟传感器的高精度压力与气流测量装置
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- 基于Arduino UNO的精准频率与占空比测量
- BME280 环境数据实时显示于 Nextion 触摸屏——Visuino 图形化开发