#include <Wire.h>
// I2C addresses
#define RTC_ADDR 0x68 // DS1307 RTC
#define MPU_ADDR 0x68 // MPU6050
void setup() {
Serial.begin(115200);
Wire.begin(); // ESP32 I2C Master
delay(1000);
Serial.println("I2C: RTC + MPU6050 Example");
// ---- Wake up MPU6050 ----
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B); // Power management register
Wire.write(0x00); // Wake up sensor
Wire.endTransmission();
// ---- Set time in RTC (One time only) ----
// Format: Seconds, Minutes, Hours, Day, Date, Month, Year
setRTCtime(0, 30, 12, 2, 3, 9, 25); // 12:30:00 3-Sep-2025 Wednesday
}
void loop() {
// 1. Read time from RTC
readRTCtime();
// 2. Read accel X from MPU6050
readMPU();
delay(2000);
}
// ---- Function to set RTC time ----
void setRTCtime(byte sec, byte min, byte hr, byte day, byte date, byte month, byte year) {
Wire.beginTransmission(RTC_ADDR);
Wire.write(0x00); // Start at register 0
Wire.write(decToBcd(sec));
Wire.write(decToBcd(min));
Wire.write(decToBcd(hr));
Wire.write(decToBcd(day));
Wire.write(decToBcd(date));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
// ---- Function to read RTC time ----
void readRTCtime() {
Wire.beginTransmission(RTC_ADDR);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(RTC_ADDR, 7);
byte sec = bcdToDec(Wire.read() & 0x7F);
byte min = bcdToDec(Wire.read());
byte hr = bcdToDec(Wire.read());
Wire.read(); // Day of week, ignore
byte date = bcdToDec(Wire.read());
byte month = bcdToDec(Wire.read());
byte year = bcdToDec(Wire.read());
Serial.print("Time: ");
Serial.print(hr); Serial.print(":");
Serial.print(min); Serial.print(":");
Serial.print(sec);
Serial.print(" Date: ");
Serial.print(date); Serial.print("/");
Serial.print(month); Serial.print("/20");
Serial.println(year);
}
// ---- Function to read MPU6050 ----
void readMPU() {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // ACCEL_XOUT_H register
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 2, true);
if (Wire.available() == 2) {
int16_t accelX = (Wire.read() << 8) | Wire.read();
Serial.print("Accel X: ");
Serial.println(accelX);
}
}
// ---- Helper functions ----
byte decToBcd(byte val) { return ((val / 10 * 16) + (val % 10)); }
byte bcdToDec(byte val) { return ((val / 16 * 10) + (val % 16)); }