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?
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.
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);
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;
}
}