ESP8266 will not compile with I2Cdev.h

I want to compile files, it is about MPU6050, using ESP8266, hoping anyone help me

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps612.h"
#include "Wire.h"
#include <Adafruit_Sensor_Calibration.h>
#include <Adafruit_AHRS.h>
#include <Adafruit_FXAS21002C.h>
#include <Adafruit_FXOS8700.h>

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <espnow.h>

Adafruit_Sensor *accelerometer, *gyroscope, *magnetometer;
Adafruit_NXPSensorFusion filter;
#if defined(ADAFRUIT_SENSOR_CALIBRATION_USE_EEPROM)
  Adafruit_Sensor_Calibration_EEPROM cal;
#else
  Adafruit_Sensor_Calibration_SDFat cal;
#endif

#define FILTER_UPDATE_RATE_HZ 25
//#define FILTER_UPDATE_RATE_HZ 34
Adafruit_FXOS8700 fxos = Adafruit_FXOS8700(0x8700A, 0x8700B);
Adafruit_FXAS21002C fxas = Adafruit_FXAS21002C(0x0021002C);


const int offsets[30] = {
  -2250,  733,  360,  37, 21, -167,
  -3392,  347,  176,  -39,  39, -45,
  -1518,  2031, 1416, 62, -6, 52,
  -312, -3249,  1576, -354, 33, 66,
  -348, 523,  848,  67, 128,  9
};

const int I2C_BUS0_SDA = 12;
const int I2C_BUS0_SCL = 14;
const int I2C_BUS12_SDA = 2;
const int I2C_BUS12_SCL = 0;
const int I2C_BUS34_SDA = 4;
const int I2C_BUS34_SCL = 5;

const int I2C_FREQ = 400000;
const int DMP_PACKET_SIZE = 28;

MPU6050 sensor0(0x68);
MPU6050 sensor1(0x68);
MPU6050 sensor2(0x69);
MPU6050 sensor3(0x68);
MPU6050 sensor4(0x69);

bool dmpReady = false;  // set true if DMP init was successful
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

uint8_t broadcastAddress[] = {0xB4, 0xE6, 0x2D, 0xF9, 0x90, 0x45};

typedef struct {
  float euler0[3];
  float euler1[3];
  float euler2[3];
  float euler3[3];
  float euler4[3];
  float euler5[3];
} data_t;

data_t angles;
Quaternion nxp_q, zRotation0, zRotation1, zRotation2, zRotation3, zRotation4;

void setup() {
  Serial.begin(115200);
  Serial.println("Setting up wifi...");
  
  WiFi.mode(WIFI_STA);
  
  // Get Mac Add
  Serial.print("Mac Address: ");
  Serial.println(WiFi.macAddress());
  Serial.println("ESP-Now Sender");
  
  // Initializing the ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Problem during ESP-NOW init");
    return;
  }
  
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  Serial.println("Added peer ESP32.");
  
  esp_now_register_send_cb(onSent);
  
  Serial.println("Successfully initialized wifi.");
  
  Serial.println(F("\nInitializing I2C devices..."));
  Serial.println(F("Sensor0:"));
  init_sensor(sensor0, &offsets[0], I2C_BUS0_SDA, I2C_BUS0_SCL);
  Serial.println(F("Sensor1:"));
  init_sensor(sensor1, &offsets[6], I2C_BUS12_SDA, I2C_BUS12_SCL);
  Serial.println(F("Sensor2:"));
  init_sensor(sensor2, &offsets[12], I2C_BUS12_SDA, I2C_BUS12_SCL);
  Serial.println(F("Sensor3:"));
  init_sensor(sensor3, &offsets[18], I2C_BUS34_SDA, I2C_BUS34_SCL);
  Serial.println(F("Sensor4:"));
  init_sensor(sensor4, &offsets[24], I2C_BUS34_SDA, I2C_BUS34_SCL);
  Serial.println(F("Sensor5:"));
  init_NXP(I2C_BUS34_SDA, I2C_BUS34_SCL);

  Serial.println(F("\nInitializing I2C devices..."));
  Serial.println(F("Sensor0:"));
  program_sensor(sensor0, I2C_BUS0_SDA, I2C_BUS0_SCL);
  Serial.println(F("Sensor1:"));
  program_sensor(sensor1, I2C_BUS12_SDA, I2C_BUS12_SCL);
  Serial.println(F("Sensor2:"));
  program_sensor(sensor2, I2C_BUS12_SDA, I2C_BUS12_SCL);
  Serial.println(F("Sensor3:"));
  program_sensor(sensor3, I2C_BUS34_SDA, I2C_BUS34_SCL);
  Serial.println(F("Sensor4:"));
  program_sensor(sensor4, I2C_BUS34_SDA, I2C_BUS34_SCL);
  
  filter.begin(FILTER_UPDATE_RATE_HZ);
  unsigned long t;
  while (true) {
    t = millis();
    read_sensors();
    print_euler(angles.euler0);
    Serial.print(" | ");
    print_euler(angles.euler1);
    Serial.print(" | ");
    print_euler(angles.euler2);
    Serial.print(" | ");
    print_euler(angles.euler3);
    Serial.print(" | ");
    print_euler(angles.euler4);
    Serial.print(" | ");
    print_euler(angles.euler5);
    
    Serial.print(" - ");
    Serial.println(millis() - t);

    send_data();
  }
}

void loop() {
//  Serial.println(F("\ni=init, p=program, c=calibrate, r=read: "));
//  while (!Serial.available());
//  char c = Serial.read();
//
//  if (c == 'i') {
//    Serial.println(F("\nInitializing I2C devices..."));
//    Serial.println(F("Sensor0:"));
//    init_sensor(sensor0, &offsets[0], I2C_BUS0_SDA, I2C_BUS0_SCL);
//    Serial.println(F("Sensor1:"));
//    init_sensor(sensor1, &offsets[6], I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor2:"));
//    init_sensor(sensor2, &offsets[12], I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor3:"));
//    init_sensor(sensor3, &offsets[18], I2C_BUS34_SDA, I2C_BUS34_SCL);
//    Serial.println(F("Sensor4:"));
//    init_sensor(sensor4, &offsets[24], I2C_BUS34_SDA, I2C_BUS34_SCL);
//    Serial.println(F("Sensor5:"));
//    init_NXP(I2C_BUS34_SDA, I2C_BUS34_SCL);
//  } else if (c == 'p') {
//    Serial.println(F("\nInitializing I2C devices..."));
//    Serial.println(F("Sensor0:"));
//    program_sensor(sensor0, I2C_BUS0_SDA, I2C_BUS0_SCL);
//    Serial.println(F("Sensor1:"));
//    program_sensor(sensor1, I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor2:"));
//    program_sensor(sensor2, I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor3:"));
//    program_sensor(sensor3, I2C_BUS34_SDA, I2C_BUS34_SCL);
//    Serial.println(F("Sensor4:"));
//    program_sensor(sensor4, I2C_BUS34_SDA, I2C_BUS34_SCL);
//  } else if (c == 'c') {
//    Serial.println(F("\nInitializing I2C devices..."));
//    Serial.println(F("Sensor0:"));
//    calibrate_sensor(sensor0, I2C_BUS0_SDA, I2C_BUS0_SCL);
//    Serial.println(F("Sensor1:"));
//    calibrate_sensor(sensor1, I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor2:"));
//    calibrate_sensor(sensor2, I2C_BUS12_SDA, I2C_BUS12_SCL);
//    Serial.println(F("Sensor3:"));
//    calibrate_sensor(sensor3, I2C_BUS34_SDA, I2C_BUS34_SCL);
//    Serial.println(F("Sensor4:"));
//    calibrate_sensor(sensor4, I2C_BUS34_SDA, I2C_BUS34_SCL);
//  } else if (c == 'r') {
//    filter.begin(FILTER_UPDATE_RATE_HZ);
//    unsigned long t;
//    while (true) {
//      t = millis();
//      read_sensors();
//      print_euler(angles.euler0);
//      Serial.print(" | ");
//      print_euler(angles.euler1);
//      Serial.print(" | ");
//      print_euler(angles.euler2);
//      Serial.print(" | ");
//      print_euler(angles.euler3);
//      Serial.print(" | ");
//      print_euler(angles.euler4);
//      Serial.print(" | ");
//      print_euler(angles.euler5);
//      
////      Serial.println();
//      Serial.print(" - ");
//      Serial.println(millis() - t);
//
//      send_data();
//    }
//  }
}

void print_euler(float* euler) {
  Serial.print(euler[0] * 180/M_PI);
  Serial.print(" ");
  Serial.print(euler[1] * 180/M_PI);
  Serial.print(" ");
  Serial.print(euler[2] * 180/M_PI);
}

void mpu_read_sensor(MPU6050 &sensor, float *euler, Quaternion &zRotation) {
  Quaternion q;
  float euler_tmp[3];
  getFIFOReadingAtReset(sensor, fifoBuffer);
  
  sensor.dmpGetQuaternion(&q, fifoBuffer);
//  Quaternion qf = nxp_q.getConjugate().getProduct(q);
//  sensor.dmpGetEuler(euler_tmp, &qf);

  if (abs(angles.euler5[0]) < 0.1 && abs(angles.euler5[1]) < 0.1) {
    float theta_z0 = atan2(q.z, q.w);
    zRotation = {cos(theta_z0), 0, 0, sin(theta_z0)};
  }
  float theta_z1= atan2(nxp_q.z, nxp_q.w);
  Quaternion zRotation5 = {cos(theta_z1), 0, 0, sin(theta_z1)};
  Quaternion qt = zRotation.getConjugate().getProduct(q);
  qt = zRotation5.getProduct(qt);
  Quaternion qf = nxp_q.getConjugate().getProduct(qt);
  
  sensor.dmpGetEuler(euler_tmp, &qf);
  
  euler[0] = -euler_tmp[1];
  euler[1] = euler_tmp[2];
  euler[2] = euler_tmp[0];
}

void nxp_read_sensor(float *euler) {
  sensors_event_t accel, gyro, mag;
  accelerometer->getEvent(&accel);
  gyroscope->getEvent(&gyro);
  magnetometer->getEvent(&mag);
  cal.calibrate(mag);
  cal.calibrate(accel);
  cal.calibrate(gyro);
  float gx, gy, gz;
  gx = gyro.gyro.x * SENSORS_RADS_TO_DPS;
  gy = gyro.gyro.y * SENSORS_RADS_TO_DPS;
  gz = gyro.gyro.z * SENSORS_RADS_TO_DPS;
  filter.update(gx, gy, gz, 
                accel.acceleration.x, accel.acceleration.y, accel.acceleration.z, 
                mag.magnetic.x, mag.magnetic.y, mag.magnetic.z);

  filter.getQuaternion(&nxp_q.w, &nxp_q.x, &nxp_q.y, &nxp_q.z);
  float euler_tmp[3];
  sensor0.dmpGetEuler(euler_tmp, &nxp_q);
  euler[0] = -euler_tmp[1];
  euler[1] = euler_tmp[2];
  euler[2] = euler_tmp[0];
}

void read_sensors() {
  Wire.begin(I2C_BUS0_SDA, I2C_BUS0_SCL, I2C_FREQ);
  sensor0.resetFIFO();
  Wire.begin(I2C_BUS12_SDA, I2C_BUS12_SCL, I2C_FREQ);
  sensor1.resetFIFO();
  sensor2.resetFIFO();
  Wire.begin(I2C_BUS34_SDA, I2C_BUS34_SCL, I2C_FREQ);
  sensor3.resetFIFO();
  sensor4.resetFIFO();

  nxp_read_sensor(angles.euler5);
  
  Wire.begin(I2C_BUS0_SDA, I2C_BUS0_SCL, I2C_FREQ);
  
  mpu_read_sensor(sensor0, angles.euler0, zRotation0);
  
  Wire.begin(I2C_BUS12_SDA, I2C_BUS12_SCL, I2C_FREQ);
  
  mpu_read_sensor(sensor1, angles.euler1, zRotation1);
  
  mpu_read_sensor(sensor2, angles.euler2, zRotation2);
  
  Wire.begin(I2C_BUS34_SDA, I2C_BUS34_SCL, I2C_FREQ);
  
  mpu_read_sensor(sensor3, angles.euler3, zRotation3);

  mpu_read_sensor(sensor4, angles.euler4, zRotation4);
}

void calibrate_sensor(MPU6050 &sensor, int sda, int scl) {
  Wire.begin(sda, scl, I2C_FREQ);

  sensor.CalibrateAccel(6);
  sensor.CalibrateGyro(6);
  sensor.PrintActiveOffsets();
}

void program_sensor(MPU6050 &sensor, int sda, int scl) {
  Wire.begin(sda, scl, I2C_FREQ);
  
  // load and configure the DMP
  Serial.println(F("Initializing DMP..."));
  int devStatus = sensor.dmpInitialize();


  // make sure it worked (returns 0 if so)
  if (devStatus == 0) {
      
      // turn on the DMP, now that it's ready
      Serial.println(F("Enabling DMP..."));
      sensor.setDMPEnabled(true);

      // get expected DMP packet size for later comparison
      packetSize = sensor.dmpGetFIFOPacketSize();
  } else {
      // ERROR!
      // 1 = initial memory load failed
      // 2 = DMP configuration updates failed
      // (if it's going to break, usually the code will be 1)
      Serial.print(F("DMP Initialization failed (code "));
      Serial.print(devStatus);
      Serial.println(F(")"));
  }
}

void send_data() {
  esp_now_send(NULL, (uint8_t *) &angles, sizeof(data_t));
}

void onSent(uint8_t *mac_addr, uint8_t sendStatus) {
//  Serial.print("Status: ");
//  Serial.println(sendStatus);
}

void init_sensor(MPU6050 &sensor, const int *offsets, int sda, int scl) {
  Wire.begin(sda, scl, I2C_FREQ);

  // initialize device
  sensor.initialize();
  sensor.setRate(7);

  // verify connection
  Serial.println(F("Testing device connection..."));
  Serial.println(sensor.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  sensor1.setXAccelOffset(offsets[0]);
  sensor1.setYAccelOffset(offsets[1]);
  sensor1.setZAccelOffset(offsets[2]);
  sensor1.setXGyroOffset(offsets[3]);
  sensor1.setYGyroOffset(offsets[4]);
  sensor1.setZGyroOffset(offsets[5]);
  Serial.println(F("Calibration loaded."));
}

void init_NXP(int sda, int scl) {
  Wire.begin(sda, scl, I2C_FREQ);
  cal.begin();
  if (! cal.loadCalibration()) {
    Serial.println("No calibration loaded/found");
  } else {
    Serial.println("Calibration loaded.");
  }
  if (!fxos.begin() || !fxas.begin()) {
    Serial.println("NXP connection failed");
    return;
  }
  
  accelerometer = fxos.getAccelerometerSensor();
  gyroscope = &fxas;
  magnetometer = fxos.getMagnetometerSensor();

  Serial.println("NXP connection successful");
}

void getFIFOReadingAtReset(MPU6050 &sensor, uint8_t *data) {
  while (sensor.getFIFOCount() < DMP_PACKET_SIZE) {}
  sensor.getFIFOBytes(data, DMP_PACKET_SIZE);
}

message errors:

c:/users/byl/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\MPU6050\I2Cdev.cpp.o: in function `I2Cdev::I2Cdev()':
c:\Users\byl\Documents\Arduino\libraries\MPU6050\src\MPU6050/I2Cdev.cpp:95: multiple definition of `I2Cdev::I2Cdev()'; C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\I2Cdev.cpp.o:c:\Users\byl\Documents\Arduino\libraries\MPU6050\src/I2Cdev.cpp:95: first defined here
c:/users/byl/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\MPU6050\I2Cdev.cpp.o: in function `I2Cdev::I2Cdev()':
c:\Users\byl\Documents\Arduino\libraries\MPU6050\src\MPU6050/I2Cdev.cpp:95: multiple definition of `I2Cdev::I2Cdev()'; C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\I2Cdev.cpp.o:c:\Users\byl\Documents\Arduino\libraries\MPU6050\src/I2Cdev.cpp:95: first defined here
c:/users/byl/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\MPU6050\I2Cdev.cpp.o: in function `I2Cdev::readBytes(unsigned char, unsigned char, unsigned char, unsigned char*, unsigned short, void*)':
c:\Users\byl\Documents\Arduino\libraries\MPU6050\src\MPU6050/I2Cdev.cpp:209: multiple definition of `I2Cdev::readBytes(unsigned char, unsigned char, unsigned char, unsigned char*, unsigned short, void*)'; C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\I2Cdev.cpp.o:c:\Users\byl\Documents\Arduino\libraries\MPU6050\src/I2Cdev.cpp:209: first defined here
c:/users/byl/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\byl\AppData\Local\Temp\arduino\sketches\0592CD0CFE383F78A15FDB4E1EFCD7B0\libraries\MPU6050\MPU6050\I2Cdev.cpp.o: in function `I2Cdev::readByte(unsigned char, unsigned char, unsigned char*, unsigned short, void*)':

That's the standard include for I2C. What if you omit I2Cdev?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.