项目简介
本项目使用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 // 改为0x773. 海拔数据不准确
原因:
海拔是根据当前气压和海平面标准气压(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开发和传感器应用!

