ESP32-C6 + OLED + BMP280 环境监测显示系统

分享作者:XIUYUAN
作者昵称:XIUYUAN
评测品牌:iCEasy
评测型号:GY-BMP280模块
发布时间:2025-10-14 15:57:20
1
视频链接
【ESP32-C6 + OLED + BMP280 环境监测显示系统-哔哩哔哩】 https://b23.tv/ptnPCJH
概要
本项目使用ESP32-C6微控制器,结合0.96寸OLED显示屏(IIC接口)和BMP280气压传感器,实现实时环境数据的采集与显示。系统可以监测并显示温度、气压和海拔高度等环境参数,适合用于气象站、高度计、环境监测等应用场景。
开源口碑分享内容

项目简介

       本项目使用ESP32-C6微控制器,结合0.96寸OLED显示屏(IIC接口)和BMP280气压传感器,实现实时环境数据的采集与显示。系统可以监测并显示温度、气压和海拔高度等环境参数,适合用于气象站、高度计、环境监测等应用场景。


硬件清单

主要组件

1. ESP32-C6 开发板

       RISC-V 架构单核处理器

       支持WiFi 6 和 Bluetooth 5.3

       丰富的GPIO接口

       工作电压:3.3V

2. 0.96寸 OLED显示屏(SSD1306)

       分辨率:128×64像素

        通信接口:I2C(IIC)

       I2C地址:0x3C(默认)

       工作电压:3.3V - 5V

3. BMP280 气压传感器

       测量范围:温度 -40°C ~ +85°C,气压 300 ~ 1100 hPa

       通信接口:I2C

       I2C地址:0x76(SDO接GND)或 0x77(SDO接VCC)

       工作电压:1.8V - 3.6V

4. 其他配件

       面包板

       杜邦线若干


硬件连接

连线图说明

两个I2C设备(OLED和BMP280)共享同一条I2C总线,连接方式如下:

```
ESP32-C6          OLED SSD1306       BMP280
─────────────────────────────────────────────
GPIO 6 (SDA) ──┬── SDA          ┌── SDA
              │                 │
GPIO 7 (SCL) ──┼── SCL          ├── SCL
              │                 │
3.3V ─────────┼── VCC          ├── VCC
              │                 ├── CSB (I2C模式选择)
              │                 │
GND ──────────┴── GND          ├── GND
                                └── SDO (地址选择)
```

详细连接表格

| ESP32-C6 | OLED | BMP280 | 说明 |
|----------|------|--------|------|
| GPIO 6   | SDA  | SDA    | I2C数据线 |
| GPIO 7   | SCL  | SCL    | I2C时钟线 |
| 3.3V     | VCC  | VCC    | 电源正极 |
| GND      | GND  | GND    | 电源负极 |
| -        | -    | CSB→3.3V | 选择I2C模式 |
| -        | -    | SDO→GND | I2C地址设为0x76 |

软件环境配置

Arduino IDE 设置

1. 安装 ESP32 开发板支持

       打开 Arduino IDE

       进入 `文件` → `首选项`

       在"附加开发板管理器网址"中添加:

https://espressif.github.io/arduino-esp32/package_esp32_index.json

       进入 `工具` → `开发板` → `开发板管理器`

       搜索 "esp32" 并安装最新版本

2. 选择开发板

       `工具` → `开发板` → `ESP32 Arduino` → `ESP32C6 Dev Module`

3. 安装所需库

       进入 `工具` → `管理库`,搜索并安装以下库:

           Adafruit GFX Library - 图形库基础

           Adafruit SSD1306 - OLED驱动库

           Adafruit BMP280 Library - BMP280传感器库

           Adafruit Unified Sensor - Adafruit传感器统一接口(依赖库)

完整代码

```cpp
/*
 * ESP32-C6 OLED + BMP280 显示程序
 * 显示内容:
 *   第一行:iCEasy
 *   第二、三、四行:温度、气压、海拔数据
 * 
 * 硬件连接:
 *   OLED & BMP280 共享I2C总线
 *   SDA -> GPIO6
 *   SCL -> GPIO7
 *   VCC -> 3.3V
 *   GND -> GND
 *   
 *   BMP280额外引脚:
 *   CSB -> 3.3V (选择I2C模式)
 *   SDO -> GND (I2C地址0x76) 或 3.3V (I2C地址0x77)
 */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

// OLED显示屏配置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

// I2C引脚定义(ESP32-C6)
#define I2C_SDA 6
#define I2C_SCL 7

// BMP280 I2C地址 (0x76或0x77,根据SDO接线)
#define BMP280_ADDRESS 0x76

// 创建对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;

// 海拔参考值(海平面气压,单位hPa)
#define SEALEVELPRESSURE_HPA (1013.25)

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("\n========================================");
  Serial.println("ESP32-C6 OLED + BMP280 Display System");
  Serial.println("========================================");
  
  // 初始化I2C总线
  Wire.begin(I2C_SDA, I2C_SCL);
  Serial.println("I2C initialized on SDA=GPIO6, SCL=GPIO7");
  
  // 初始化OLED显示屏
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println("ERROR: SSD1306 allocation failed!");
    for(;;); // 死循环
  }
  Serial.println("OLED display initialized successfully");
  
  // 初始化BMP280传感器
  if (!bmp.begin(BMP280_ADDRESS)) {
    Serial.println("ERROR: Could not find BMP280 sensor!");
    Serial.println("Check wiring or try address 0x77");
    
    // 在屏幕上显示错误信息
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.println("iCEasy");
    display.println("");
    display.println("BMP280 Error!");
    display.println("Check wiring");
    display.display();
    
    for(;;); // 死循环
  }
  Serial.println("BMP280 sensor initialized successfully");
  
  // 配置BMP280采样参数
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     // 正常工作模式
                  Adafruit_BMP280::SAMPLING_X2,     // 温度过采样 x2
                  Adafruit_BMP280::SAMPLING_X16,    // 气压过采样 x16
                  Adafruit_BMP280::FILTER_X16,      // 滤波 x16
                  Adafruit_BMP280::STANDBY_MS_500); // 待机时间 500ms
  
  Serial.println("\n========================================");
  Serial.println("System ready! Starting data display...");
  Serial.println("========================================\n");
  
  delay(500);
}

void loop() {
  // 读取BMP280传感器数据
  float temperature = bmp.readTemperature();      // 温度 (°C)
  float pressure = bmp.readPressure() / 100.0;    // 气压 (hPa)
  float altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // 海拔 (m)
  
  // 串口输出数据
  Serial.println("--- BMP280 Data ---");
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" °C");
  Serial.print("Pressure:    ");
  Serial.print(pressure);
  Serial.println(" hPa");
  Serial.print("Altitude:    ");
  Serial.print(altitude);
  Serial.println(" m");
  Serial.println();
  
  // 清空显示缓冲区
  display.clearDisplay();
  
  // ========== 第一行:iCEasy ==========
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("iCEasy");
  
  // ========== 第二行:温度 ==========
  display.setTextSize(1);
  display.setCursor(0, 18);
  display.print("Temp: ");
  display.print(temperature, 1);  // 保留1位小数
  display.print(" C");
  
  // ========== 第三行:气压 ==========
  display.setCursor(0, 32);
  display.print("Pres: ");
  display.print(pressure, 1);     // 保留1位小数
  display.print(" hPa");
  
  // ========== 第四行:海拔 ==========
  display.setCursor(0, 46);
  display.print("Alti: ");
  display.print(altitude, 1);     // 保留1位小数
  display.print(" m");
  
  // 发送到显示屏
  display.display();
  
  // 每2秒更新一次
  delay(2000);
}
```

代码详解

1. 初始化过程

```cpp
Wire.begin(I2C_SDA, I2C_SCL);

       初始化I2C总线,指定ESP32-C6的GPIO6为SDA,GPIO7为SCL。

2. OLED初始化

```cpp
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)

       `SSD1306_SWITCHCAPVCC`:使用内部电荷泵生成显示电压

       `SCREEN_ADDRESS`:I2C地址0x3C

3. BMP280配置

```cpp
bmp.setSampling(
    Adafruit_BMP280::MODE_NORMAL,     // 正常工作模式
    Adafruit_BMP280::SAMPLING_X2,     // 温度过采样 x2
    Adafruit_BMP280::SAMPLING_X16,    // 气压过采样 x16
    Adafruit_BMP280::FILTER_X16,      // 滤波 x16
    Adafruit_BMP280::STANDBY_MS_500   // 待机时间 500ms
);

这些参数提高了测量精度和稳定性:

       过采样(Oversampling):通过多次采样取平均值减少噪声

       滤波器:平滑短期波动

       待机时间:两次测量之间的间隔

4. 数据读取

```cpp
float temperature = bmp.readTemperature();           // 温度 (°C)
float pressure = bmp.readPressure() / 100.0;         // 气压转换为 hPa
float altitude = bmp.readAltitude(SEALEVELPRESSURE_HPA); // 计算海拔

5. 显示布局

       第1行(像素0-17):大字体显示 "iCEasy"

       第2行(像素18-31):温度数据

       第3行(像素32-45):气压数据

       第4行(像素46-63):海拔数据


上传与测试

上传步骤

       1. 将ESP32-C6通过USB连接到电脑

       2. 在Arduino IDE中选择正确的串口

       3. 点击"上传"按钮

       4. 等待编译和上传完成

预期效果

OLED显示屏显示:

iCEasy
Temp: 25.3 C
Pres: 1013.2 hPa
Alti: 0.5 m

串口监视器输出(115200波特率):

========================================
ESP32-C6 OLED + BMP280 Display System
========================================
I2C initialized on SDA=GPIO6, SCL=GPIO7
OLED display initialized successfully
BMP280 sensor initialized successfully

========================================
System ready! Starting data display...
========================================

--- BMP280 Data ---
Temperature: 25.30 °C
Pressure:    1013.25 hPa
Altitude:    0.50 m

常见问题与解决方案

1. OLED显示屏无显示

可能原因:

       I2C地址错误(有些OLED是0x3D而不是0x3C)

       接线错误

       电源不足

解决方法:

```cpp
// 尝试修改I2C地址
#define SCREEN_ADDRESS 0x3D  // 改为0x3D
```

2. BMP280传感器初始化失败

可能原因:

       I2C地址错误

       CSB引脚未接3.3V

       接线松动

解决方法:

```cpp
// 尝试另一个地址
#define BMP280_ADDRESS 0x77  // 改为0x77

3. 海拔数据不准确

原因:

       海拔是根据当前气压和海平面标准气压(1013.25 hPa)计算的。如果你所在地区的实际海平面气压不同,需要校准。

解决方法:

       查询当地当前海平面气压,修改代码中的常量:

```cpp
#define SEALEVELPRESSURE_HPA (1015.5)  // 使用实际值
```

扩展应用

1. WiFi数据上传

       可以添加WiFi功能,将数据上传到云端或物联网平台(如ThingSpeak、阿里云IoT)。

2. 数据记录

       添加SD卡模块,记录历史数据用于分析。

3. 气象预报

通过监测气压变化趋势,可以进行简单的天气预测:

       气压上升 → 天气转好

       气压下降 → 可能降雨

4. 多传感器融合

可以继续添加其他I2C传感器,如:

       BME280(增加湿度测量)

       AHT20(温湿度传感器)

       CCS811(空气质量传感器)


总结

本项目展示了如何使用ESP32-C6控制OLED显示屏和BMP280传感器,实现环境数据的实时监测与显示。项目具有以下特点:

       ✅ 硬件简单:仅需三个主要组件  

       ✅ 接线清晰:共享I2C总线,只需4根线  

       ✅ 代码完整:包含错误处理和友好提示  

       ✅ 扩展性强:可轻松添加更多功能  

希望这个项目能帮助你入门ESP32-C6开发和传感器应用!



附件
全部评论
暂无评论
0/144