Best way to optimize code

I am learning to program in Arduino. In my code I have two sensors of the same type, so to obtain the information I repeat the same data (for MPU1 and MPU2). Is there a way that I only have to put it in once? So the code looks cleaner.

In Python it would be to create a function with a variable that I can always call. How is it in C++?

My code is:

// Basic demo for accelerometer readings from Adafruit MPU6050

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

//Adafruit_MPU6050 mpu;

Adafruit_MPU6050 MPU1;
Adafruit_MPU6050 MPU2;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

  // Try to initialize!
  if (!MPU1.begin() || !MPU2.begin(0x69)) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");

  MPU1.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (MPU1.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  MPU1.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (MPU1.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }
  MPU1.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (MPU1.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }


  MPU2.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (MPU2.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  MPU2.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (MPU2.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }
  MPU2.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (MPU2.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop() {
  GetMPU1();
  GetMPU2();
  Serial.println("-----------");
  delay(500);
}

void GetMPU1(){
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  MPU1.getEvent(&a, &g, &temp);
  
  /* Print out the values */
  //Serial.print("Acceleration X: ");
  //Serial.print(a.acceleration.x);
  //Serial.print(", Y: ");
  Serial.println(a.acceleration.y);
  //Serial.print(", Z: ");
  //Serial.print(a.acceleration.z);
  //Serial.println(" m/s^2");

  //Serial.print("Rotation X: ");
  //Serial.print(g.gyro.x);
  //Serial.print(", Y: ");
  //Serial.print(g.gyro.y);
  //Serial.print(", Z: ");
  //Serial.print(g.gyro.z);
  //Serial.println(" rad/s");

  //Serial.print("Temperature: ");
  //Serial.print(temp.temperature);
  //Serial.println(" degC");
}

void GetMPU2(){
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  MPU2.getEvent(&a, &g, &temp);
  
  /* Print out the values */
  //Serial.print("Acceleration X: ");
  //Serial.print(a.acceleration.x);
  //Serial.print(", Y: ");
  Serial.println(a.acceleration.y);
  //Serial.print(", Z: ");
  //Serial.print(a.acceleration.z);
  //Serial.println(" m/s^2");

  //Serial.print("Rotation X: ");
  //Serial.print(g.gyro.x);
  //Serial.print(", Y: ");
  //Serial.print(g.gyro.y);
  //Serial.print(", Z: ");
  //Serial.print(g.gyro.z);
  //Serial.println(" rad/s");

  //Serial.print("Temperature: ");
  //Serial.print(temp.temperature);
  //Serial.println(" degC");
}

Well you could add code to change the state of the ADO pin making only one object but then the code gets more complicated. What is it that you find wonky about your code?

1 Like

By creating a function and passing a reference to each sensor.

2 Likes

In the code everything is fine, it works.

Check this out: MuttipleMPU/MuttipleMPU.ino · master · Shuvashish Sarker / batikkrom.com · GitLab

He has a function just to void GetMpuValue(const int MPU){

...and calls MPU1 and MPU2:
GetMpuValue(MPU1);
GetMpuValue(MPU2);

In my code I repeat the same for both MPU1 and MPU2, I also repeat it in the setup.

What's wrong with your code?
I don't see a lot of opportunity to optimize the code for compile time or memory used. I would add comments, however. In a few months or a year from now, you will be glad you did.


void GetMPU(Adafruit_MPU6050& MPU)
{
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  MPU.getEvent(&a, &g, &temp);
  
  /* Print out the values */
  //Serial.print("Acceleration X: ");
  //Serial.print(a.acceleration.x);
  //Serial.print(", Y: ");
  Serial.println(a.acceleration.y);
  //Serial.print(", Z: ");
  //Serial.print(a.acceleration.z);
  //Serial.println(" m/s^2");

  //Serial.print("Rotation X: ");
  //Serial.print(g.gyro.x);
  //Serial.print(", Y: ");
  //Serial.print(g.gyro.y);
  //Serial.print(", Z: ");
  //Serial.print(g.gyro.z);
  //Serial.println(" rad/s");

  //Serial.print("Temperature: ");
  //Serial.print(temp.temperature);
  //Serial.println(" degC");
}

(Uncompiled, untested)

Exactly. It works perfectly, that's what I mean.
My error was in "void GetMPU(Adafruit_MPU6050& MPU)"

Another thing, is it possible to do something similar in setup?

MPU1.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (MPU1.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  MPU1.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (MPU1.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }
  MPU1.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (MPU1.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }


  MPU2.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (MPU2.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  MPU2.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (MPU2.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }
  MPU2.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (MPU2.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);

Of course

void initMPU (Adafruit_MPU6050& MPU)
{
  MPU.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print(F("Accelerometer range set to: "));
  switch (MPU.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println(F("+-2G"));
    break;
  case MPU6050_RANGE_4_G:
    Serial.println(F("+-4G"));
    break;
  case MPU6050_RANGE_8_G:
    Serial.println(F("+-8G"));
    break;
  case MPU6050_RANGE_16_G:
    Serial.println(F("+-16G"));
    break;
  }
  MPU.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print(F("Gyro range set to: "));
  switch (MPU.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println(F("+- 250 deg/s"));
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println(F("+- 500 deg/s"));
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println(F("+- 1000 deg/s"));
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println(F("+- 2000 deg/s"));
    break;
  }
  MPU.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print(F("Filter bandwidth set to: "));
  switch (MPU.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println(F("260 Hz"));
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println(F("184 Hz"));
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println(F("94 Hz"));
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println(F("44 Hz"));
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println(F("21 Hz"));
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println(F("10 Hz"));
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println(F("5 Hz"));
    break;
  }
}

(Again, uncompiled, untested)

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