技术文章大纲:ESP32 + MPU6050 + OLED 实验
实验简介
- 介绍实验目标:通过ESP32读取MPU6050传感器的加速度和陀螺仪数据,并在OLED屏幕上实时显示
- 适用场景:姿态检测、运动追踪、物联网设备监控
硬件清单
- ESP32开发板的主要特性(Wi-Fi/蓝牙、GPIO、ADC等)
- MPU6050六轴传感器(加速度计+陀螺仪)的功能与通信方式(I²C)
- OLED屏幕(SSD1306驱动,I²C接口)的特性与显示优势
电路连接
- ESP32与MPU6050的接线图(SCL→GPIO22,SDA→GPIO21,VCC→3.3V,GND→GND)
- ESP32与OLED的接线图(SCL→同一GPIO22,SDA→同一GPIO21,共享I²C总线)
- 注意事项:I²C地址冲突的解决方法(MPU6050默认0x68,OLED通常0x3C)
![]()
软件环境配置
- 开发工具:Arduino IDE或PlatformIO
- 必需库的安装:
Adafruit_MPU6050(或MPU6050_tockn)用于传感器数据读取Adafruit_SSD1306和Adafruit_GFX用于OLED显示
- ESP32开发板包的安装(Arduino IDE中的板管理)
代码实现:
// 引入IIC核心库、MPU6050库、OLED显示库 #include <Wire.h> #include <Adafruit_MPU6050.h> #include <U8g2lib.h> // 初始化OLED屏幕(IIC版本12864) U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // 初始化MPU6050传感器 Adafruit_MPU6050 mpu; // 定义姿态数据变量 float pitch, roll, yaw; void setup(void) { Serial.begin(115200); // 启动IIC总线 Wire.begin(21,22); // SDA=21, SCL=22(ESP32默认IIC引脚) // 初始化OLED屏幕 u8g2.begin(); u8g2.clearBuffer(); u8g2.drawStr(0,15,"IIC Init Success!"); u8g2.drawStr(0,35,"MPU6050 Ready"); u8g2.sendBuffer(); delay(1000); // 初始化MPU6050 if (!mpu.begin()) { Serial.println("MPU6050初始化失败!"); while (1) delay(10); // 初始化失败卡死提示 } Serial.println("MPU6050初始化成功!"); // 设置传感器测量范围 mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); delay(100); } void loop(void) { // 读取MPU6050原始数据 sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); // 姿态角度计算(适配追光系统姿态检测) pitch = (atan2(a.acceleration.y, a.acceleration.z) * 180.0 / PI); roll = (atan2(-a.acceleration.x, sqrt(a.acceleration.y*a.acceleration.y + a.acceleration.z*a.acceleration.z)) * 180.0 / PI); // 串口打印数据(调试用) Serial.print("俯仰角(Pitch): ");Serial.print(pitch);Serial.println(" °"); Serial.print("横滚角(Roll): ");Serial.print(roll);Serial.println(" °"); Serial.println("-------------------"); // OLED屏幕实时显示数据 u8g2.clearBuffer(); u8g2.drawStr(0,15,"Pitch:"); u8g2.drawNum(50,15,3,abs(pitch)); u8g2.drawStr(80,15,"deg"); u8g2.drawStr(0,40,"Roll:"); u8g2.drawNum(50,40,3,abs(roll)); u8g2.drawStr(80,40,"deg"); u8g2.sendBuffer(); delay(200); // 刷新频率 }
校准与优化
- MPU6050的校准方法(静态偏移补偿)
- 数据滤波处理(如简单移动平均或卡尔曼滤波)
- 降低刷新频率以优化显示稳定性
实验结果与验证
- 预期输出:OLED屏幕实时显示三轴加速度(m/s²)和角速度(rad/s)
- 常见问题排查:
- 无数据:检查I²C地址与接线
- 数据抖动:确保传感器放置平稳
扩展应用
- 结合Wi-Fi上传数据至云端(如MQTT协议)
- 增加姿态解算(如互补滤波或DMP库实现欧拉角计算)
- 与外部设备联动(如通过蓝牙发送警报)
参考资料
- 关键库的GitHub链接(Adafruit、Arduino社区)
- 数据手册:MPU6050寄存器配置说明、SSD1306驱动协议