#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
// 定义I2C地址
#define MPU6050_ADDR 0x69 // MPU6050地址(通过AD0引脚设置为高电平改变地址)
#define DS1307_ADDR 0x68 // DS1307地址
#define OLED_ADDR 0x3C // OLED显示屏地址
// MPu6050 AD0
const uint8_t AD0 = 7;
// 创建设备对象
Adafruit_MPU6050 mpu;
RTC_DS1307 rtc;
Adafruit_SSD1306 display(128, 64, &Wire);
// 存储传感器数据的结构
struct SensorData {
float accX, accY, accZ; // 加速度数据
float gyroX, gyroY, gyroZ; // 陀螺仪数据
float temp; // 温度
};
void setup() {
pinMode(AD0, OUTPUT);
digitalWrite(AD0, HIGH);
Serial.begin(9600);
Wire.begin();
// 初始化MPU6050
if (!mpu.begin(MPU6050_ADDR)) {
Serial.println("MPU6050初始化失败");
while (1) { delay(10); }
}
// 配置MPU6050
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
// 初始化DS1307
if (!rtc.begin()) {
Serial.println("DS1307初始化失败");
while (1) { delay(10); }
}
// 如果RTC断电,重新设置时间
if (!rtc.isrunning()) {
Serial.println("RTC未运行,设置时间");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// 初始化OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("OLED初始化失败");
while (1) { delay(10); }
}
// OLED显示设置
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
}
void loop() {
// 读取并显示所有传感器数据
SensorData sensorData = readMPU6050();
DateTime now = rtc.now();
updateDisplay(sensorData, now);
delay(100); // 刷新间隔
}
// 读取MPU6050数据
SensorData readMPU6050() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
SensorData data;
data.accX = a.acceleration.x;
data.accY = a.acceleration.y;
data.accZ = a.acceleration.z;
data.gyroX = g.gyro.x;
data.gyroY = g.gyro.y;
data.gyroZ = g.gyro.z;
data.temp = temp.temperature;
return data;
}
// 更新OLED显示
void updateDisplay(SensorData data, DateTime now) {
display.clearDisplay();
display.setCursor(0,0);
// 显示时间
display.print(now.year(), DEC);
display.print('/');
display.print(now.month(), DEC);
display.print('/');
display.print(now.day(), DEC);
display.print(' ');
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
// 显示MPU6050数据
display.setCursor(0, 16);
display.print("Acc: ");
display.print(data.accX, 1);
display.print(" ");
display.print(data.accY, 1);
display.print(" ");
display.print(data.accZ, 1);
display.setCursor(0, 32);
display.print("Gyr: ");
display.print(data.gyroX, 1);
display.print(" ");
display.print(data.gyroY, 1);
display.print(" ");
display.print(data.gyroZ, 1);
display.setCursor(0, 48);
display.print("Temp: ");
display.print(data.temp, 1);
display.print("C");
display.display();
}