MPU6050 und BMP280 gemeinsam verwenden

Hallo liebes Forum,
das ist die Fortsetzung meines Raketenprojekts (siehe MPU6050 Messwerte auf SD-Karte speichern)
Nun möchte ich zusätzlich einen BMP280 Sensor hinzufügen, welcher den Druck und die Höhe messen soll. Diese Daten werden ebenfalls auf einer SD Karte gespeichert.

Das Problem, vor dem ich nun stehe, sieht wiefolgt aus:
Beide Sensoren verwenden die Pins A4 und A5 bzw. SCL und SDA; aber wie kann ich nun die Messwerte abfragen?
Ich habe mich bereits etwas über das I2C Bussystem informiert, komme aber nicht so recht weiter.
Die Adressen der Sensoren: MPU 0x68 und BMP 0x76
Gibt es nun ein Vorgehen um die verschiedenen Sensoren über ihre Adressen aufzurufen?
Falls "Ja", könntet ihr mir einen Tipp geben, wo ich dafür einen Beispielsketch finde?

Bzw. ist das Bussystem überhaupt notwendig, oder kann ich nicht auch anderweitig vorgehen?

Zur Vollständigkeit:
Ich arbeite mit einem Arduino Mini Pro (von AZDelivery)

Mein bisheriger Code:

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

//define relevant pins
const int chipSelectPin = 10; //ChipSelect-Pin für SD Karte (ggf. abändern)
#define LEDrot    3
#define LEDgruen  4
#define LEDblau   2

//create objects
File file;
String dataFile = "datafile.txt"; //Die Datei dataFile heißt auf der SD Karte "datafile.txt"
Adafruit_MPU6050 mpu;

//declare MPU vars
sensors_event_t a, g, temp;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
  { delay(10); } // will pause Zero, Leonardo, etc until serial console opens
  Serial.println(F("Adafruit MPU6050 test!")); //F() macro: Moves the constant string 
  // from SRAM to FLAH memory to safe SRAM memory
    
  pinMode(LEDrot, OUTPUT);
  digitalWrite(LEDrot, HIGH);
  pinMode(LEDgruen, OUTPUT);
  digitalWrite(LEDgruen, HIGH);
  pinMode(LEDblau, OUTPUT);
  digitalWrite(LEDblau, HIGH);
  
  // Initializing SD card
  if (!SD.begin(chipSelectPin))
  {
    //serial debugging
    Serial.println(F("SD card not found!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1); //don't do anything more
  }
  else
  {
    Serial.println(F("SD card initialized"));
  }
  // clear data
  SD.remove(dataFile);
  Serial.println(F("removed data"));
  // write headline
  File file = SD.open(dataFile, FILE_WRITE); //diese Operation öffnet den Pfad zur Datei "dataFile"
  if (file)
  {
    file.println(F("X-Acceleration, Y-Acceleration, Z-Acceleration, Gyro-X, Gyro-Y, Gyro-Z, Temperature"));
    file.close();
  }
  else
  {
    Serial.println(F("Error writing to file!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
  }
  //Initializing MPU6050
  if (!mpu.begin())
  {
    Serial.println(F("Failed to find MPU6050 chip"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1)
      ;
    {
      delay(10);
    }
  }
  Serial.println(F("MPU6050 initialized"));
  //An der Initialisierung des MPU6050 liegt das Prblem nicht!
  //set accelerometer range to +-8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  //set gyro range to +-500 deg/s
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  //set filter bandwidth to 21 Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  delay(300);
  //Die Setup-Funktion funktioniert einwandfrei, keinerlei Probleme erkennbar

  delay(2000);
  digitalWrite(LEDrot, LOW);
  //digitalWrite(LEDgruen, HIGH);
  digitalWrite(LEDblau, LOW);
  }


void loop()
{
  // Get new sensor events with the readings
  mpu.getEvent(&a, &g, &temp);
  printSerial();
  printFile();
  delay(100);
}

void printSerial()
{
  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));
}

void printFile()
{
  File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }
  file.print(a.acceleration.x);
  file.print(",");
  file.print(a.acceleration.y);
  file.print(",");
  file.print(a.acceleration.z);
  file.print(",");
  file.print(g.gyro.x);
  file.print(",");
  file.print(g.gyro.y);
  file.print(",");
  file.print(g.gyro.z);
  file.print(",");
  file.println(temp.temperature);
  file.close();
}

Vielen Dank vorab!

Grüße Alex

I2C ist ein Bus wie du schun weist :wink:
einfach erst die Beispiele für den BMP durchspielen und danach in Projekt einbinden.

Hier was zum lesen :wink:

Hi @lexl55,

die Bibliotheken für den MPU6050 und den BMP280 gehen davon aus, dass die von Dir genannten Standardadressen verwendet werden.

Wie @fony schon geschrieben hat, einfach beide Sensoren parallel am I2C Bus anschliessen, die libraries nutzen und es sollte funktionieren. Es ist immer empfehlenswert, jeden Sensor zunächst einmal einzeln zum Laufen zu bringen und danach erst zusammenzuschalten. Das erspart u.U. eine mühsame Fehlersuche ...

Gruß (auch an @fony :wink: )
ec2021

@fony und @ec2021
Vielen Dank für Eure Antworten!

Ich habe mich über den Beitrag (und auch andere) weiter informiert und bin gerade dabei, einen neuen Sketch zu schreiben.
Ich konnte leider noch keinen Testdurchgang starten, werde mich aber melden, sobald ich das gemacht habe.

Sooo,

erst einmal mein aktueller Code:

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

//define relevant pins
const int chipSelectPin = 10; //ChipSelect-Pin für SD Karte (ggf. abändern)
#define LEDrot    3
#define LEDgruen  4
#define LEDblau   2
#define BMP280_ADDRESS 0x76 //Sensor address

//create objects
File file;
String dataFile = "datafile.txt"; //Die Datei dataFile heißt auf der SD Karte "datafile.txt"
Adafruit_MPU6050 mpu;
Adafruit_BMP280 bmp; //I2C

//declare MPU vars
sensors_event_t a, g, temp;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
  { delay(10); } // will pause Zero, Leonardo, etc until serial console opens
  Serial.println(F("Flight data logger test!")); //F() macro: Moves the constant string 
  // from SRAM to FLAH memory to safe SRAM memory
    
  pinMode(LEDrot, OUTPUT);
  digitalWrite(LEDrot, HIGH);
  pinMode(LEDgruen, OUTPUT);
  digitalWrite(LEDgruen, HIGH);
  pinMode(LEDblau, OUTPUT);
  digitalWrite(LEDblau, HIGH);
  
  // Initializing SD card
  if (!SD.begin(chipSelectPin))
  {
    //serial debugging
    Serial.println(F("SD card not found!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1); //don't do anything more
  }
  else
  {
    Serial.println(F("SD card initialized"));
  }
  // clear data
  SD.remove(dataFile);
  Serial.println(F("removed data"));
  // write headline
  File file = SD.open(dataFile, FILE_WRITE); //diese Operation öffnet den Pfad zur Datei "dataFile"
  if (file)
  {
    file.println(F("X-Acceleration, Y-Acceleration, Z-Acceleration, Gyro-X, Gyro-Y, Gyro-Z, Temperature"));
    file.close();
  }
  else
  {
    Serial.println(F("Error writing to file!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
  }
  //Initializing MPU6050
  if (!mpu.begin())
  {
    Serial.println(F("Failed to find MPU6050 chip"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);
      
    {
      delay(10);
    }
  }
  Serial.println(F("MPU6050 initialized"));
  //An der Initialisierung des MPU6050 liegt das Prblem nicht!
  //set accelerometer range to +-8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  //set gyro range to +-500 deg/s
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  //set filter bandwidth to 21 Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  delay(300);
  //Die Setup-Funktion funktioniert einwandfrei, keinerlei Probleme erkennbar

  //Initializing BMP280
  if (!bmp.begin(BMP280_ADDRESS)){
    Serial.println(F("Failed to find BMP280 sensor"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while(1);
  } else {
    Serial.println(F("BMP280 initialized"));
  }

  delay(2000);
  digitalWrite(LEDrot, LOW);
  //digitalWrite(LEDgruen, HIGH);
  digitalWrite(LEDblau, LOW);
  }


void loop()
{
  // Get new sensor events with the readings
  mpu.getEvent(&a, &g, &temp);
  printSerial();
  printFile();
  delay(100);
}

void printSerial()
{
  //MPU6050
  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));
  
  //BMP280
  Serial.print(F("Temperature: "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure: "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude: "));
  Serial.print(bmp.readAltitude(1013.25)); //Adjust to local forecast! 
  Serial.println(" m");

  Serial.println();
}

void printFile()
{
  File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }
  file.print(a.acceleration.x);
  file.print(",");
  file.print(a.acceleration.y);
  file.print(",");
  file.print(a.acceleration.z);
  file.print(",");
  file.print(g.gyro.x);
  file.print(",");
  file.print(g.gyro.y);
  file.print(",");
  file.print(g.gyro.z);
  file.print(",");
  file.println(temp.temperature);
  file.close();
}

Ich rufe den MBP280 Sensor über dessen Adresse auf, die ich unter "//define relevant pins" angegeben habe. (ich hoffe, ich habe das richtig verstanden)

//Initializing BMP280
  if (!bmp.begin(BMP280_ADDRESS)){
    Serial.println(F("Failed to find BMP280 sensor"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while(1);
  } else {
    Serial.println(F("BMP280 initialized"));
  }

Beim MPU6050 habe ich alles gelassen wie es war.
Die Initialisierung klappt und beide Sensoren geben ordentliche Messwerte aus.

Allerdings ist dafür ein neues Problem aufgetreten:
Die SD Karte speichert keine Daten mehr und erstellt nicht einmal mehr eine Datei :frowning:
Die Initialisierung klappt aber trotzdem noch, das verstehe ich nicht!?

Möglicherweise hängt das damit zusammen, dass mein Sketch 29014 Bytes (94%) des Programmspeicherplatzes (Maximum sind 30720 Bytes) verwendet.

Meine Fragen:

  • Warum behindert meine Änderung die SD Karte? Hat jemand eine Idee, wie man das lösen könnte?
  • Wie könnte ich in meinem Fall den benötigten Speicherplatz reduzieren?

LG Alex

Dann versuch das, habe nur ein paar Sachen kommentiert, nicht getestet

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

//define relevant pins
const int chipSelectPin = 10; //ChipSelect-Pin für SD Karte (ggf. abändern)
#define LEDrot    3
#define LEDgruen  4
#define LEDblau   2
#define BMP280_ADDRESS 0x76 //Sensor address

//create objects
File file;
String dataFile = "datafile.txt"; //Die Datei dataFile heißt auf der SD Karte "datafile.txt"
Adafruit_MPU6050 mpu;
Adafruit_BMP280 bmp; //I2C

//declare MPU vars
sensors_event_t a, g, temp;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
  {
    delay(10);  // will pause Zero, Leonardo, etc until serial console opens
  }
  Serial.println(F("Flight data logger test!")); //F() macro: Moves the constant string
  // from SRAM to FLAH memory to safe SRAM memory

  pinMode(LEDrot, OUTPUT);
  digitalWrite(LEDrot, HIGH);
  pinMode(LEDgruen, OUTPUT);
  digitalWrite(LEDgruen, HIGH);
  pinMode(LEDblau, OUTPUT);
  digitalWrite(LEDblau, HIGH);

  // Initializing SD card
  if (!SD.begin(chipSelectPin))
  {
    //serial debugging
    Serial.println(F("SD card not found!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1); //don't do anything more
  }
  else
  {
    Serial.println(F("SD card initialized"));
  }
  // clear data
  SD.remove(dataFile);
  Serial.println(F("removed data"));
  // write headline
  File file = SD.open(dataFile, FILE_WRITE); //diese Operation öffnet den Pfad zur Datei "dataFile"
  if (file)
  {
    file.println(F("X-Acceleration, Y-Acceleration, Z-Acceleration, Gyro-X, Gyro-Y, Gyro-Z, Temperature"));
    file.close();
  }
  else
  {
    Serial.println(F("Error writing to file!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
  }
  //Initializing MPU6050
  if (!mpu.begin())
  {
    Serial.println(F("Failed to find MPU6050 chip"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);

    {
      delay(10);
    }
  }
  Serial.println(F("MPU6050 initialized"));
  //An der Initialisierung des MPU6050 liegt das Prblem nicht!
  //set accelerometer range to +-8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  //set gyro range to +-500 deg/s
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  //set filter bandwidth to 21 Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  delay(300);
  //Die Setup-Funktion funktioniert einwandfrei, keinerlei Probleme erkennbar

  //Initializing BMP280
  if (!bmp.begin(BMP280_ADDRESS)) {
    Serial.println(F("Failed to find BMP280 sensor"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);
  } else {
    Serial.println(F("BMP280 initialized"));
  }

  delay(2000);
  digitalWrite(LEDrot, LOW);
  //digitalWrite(LEDgruen, HIGH);
  digitalWrite(LEDblau, LOW);
}


void loop()
{
  // Get new sensor events with the readings
  mpu.getEvent(&a, &g, &temp);
  printSerial();
 // printFile();
  delay(100);
}

void printSerial()
{
  //MPU6050
  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));

  //BMP280
  Serial.print(F("Temperature: "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure: "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude: "));
  Serial.print(bmp.readAltitude(1013.25)); //Adjust to local forecast!
  Serial.println(" m");

  Serial.println();
  //}

  //void printFile()
  //{
  File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }
  file.print(a.acceleration.x);
  file.print(",");
  file.print(a.acceleration.y);
  file.print(",");
  file.print(a.acceleration.z);
  file.print(",");
  file.print(g.gyro.x);
  file.print(",");
  file.print(g.gyro.y);
  file.print(",");
  file.print(g.gyro.z);
  file.print(",");
  file.println(temp.temperature);
  file.close();
}
1 Like

Den meisten Platz belegt die SD Lib, die Ada Lib für BMP ist auch ziemlich Dick, wen läuft andere Bibliotheken testen

Okay, dann teste ich noch andere Libs

Deine Änderungen allein haben den Fehler leider noch nicht behoben.
Der Code funktioniert, aber die Daten werden immer noch nicht auf die SD Karte übertragen.

Die Datei müsste aber geöffnet werden, da keine Fehlermeldung "No open File" angezeigt wird.

File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }

Da sind wir wieder beim selben Problem angelangt, wie ich schon mal hatte. (MPU6050 Messwerte auf SD-Karte speichern)
Das lies sich aber noch mit F() macro lösen.

Dan schmeiß den

}

void printSerial()
{

auch die Klammer raus oder überträgt

mpu.getEvent(&a, &g, &temp)

in void printSerial() was aber Unsinn ist, ein void ist wie ein käfig es kommt nichts rein und raus

1 Like

Klasse, Danke!

Jetzt funktioniert es wieder so wie es soll :+1:

Schön jetzt nur noch sparsame Libs suchen
ich habe öfters die benutzt

Für MPU habe die gefunden

nur das Problem ist man muss schon alles umbauen. Wie ist jetziger Zustand nach Kompilieren?
Und ob die Serial Ausgabe ist wichtig, normal bei mir wen alles läuft wird die Ausgabe kommentiert, spart auch wider RAM :wink:

1 Like

Wenn ich Lust und Zeit finde, kann ich die anderen Libs mal testen.
Ansonsten passt bis jetzt alles.

Du meinst, wenn alles funktioniert, kann ich die serielle Ausgabe der Daten weglassen oder?

Habe dein PRG gelöscht aber Moment.
du hast ja als erstes

  mpu.getEvent(&a, &g, &temp);

damit werden alle Parameter gelesen und auf die SD geschrieben.
die vier Zeichen /* */ kosten nix == ausprobieren ``

 //MPU6050
/*  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));
  
  //BMP280
  Serial.print(F("Temperature: "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure: "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude: "));
  Serial.print(bmp.readAltitude(1013.25)); //Adjust to local forecast! 
  Serial.println(" m");

  Serial.println();
*/

Muss jetzt weg vermute das war für Heute.
Es lesen bestimmt noch einige meine ich, = bist nicht allein :wink:

Vielleicht kannst Du den aktuellen, lauffähigen Code noch mal posten, damit wir vom gleichen Stand ausgehen...

Und interessant wäre auch, wenn Du den Sketch z.B nur compilierst und die Ausgaben des Compilers postest. Also den Text, in dem die Große des Programms und die Angaben zum dynamischen Speicherbedarf zu lesen sind.

Hast Du schon irgendwo geschrieben, welches Board Du verwendest?

Gruß
ec2021

@ec2021

Das ist der aktuelle, lauffähige Code:

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

//define relevant pins
const int chipSelectPin = 10; //ChipSelect-Pin für SD Karte (ggf. abändern)
#define LEDrot    3
#define LEDgruen  4
#define LEDblau   2
#define BMP280_ADDRESS 0x76 //Sensor address

//create objects
File file;
String dataFile = "datafile.txt"; //Die Datei dataFile heißt auf der SD Karte "datafile.txt"
Adafruit_MPU6050 mpu;
Adafruit_BMP280 bmp; //I2C

//declare MPU vars
sensors_event_t a, g, temp;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
  {
    delay(10);  // will pause Zero, Leonardo, etc until serial console opens
  }
  Serial.println(F("Flight data logger test!")); //F() macro: Moves the constant string
  // from SRAM to FLAH memory to safe SRAM memory

  pinMode(LEDrot, OUTPUT);
  digitalWrite(LEDrot, HIGH);
  pinMode(LEDgruen, OUTPUT);
  digitalWrite(LEDgruen, HIGH);
  pinMode(LEDblau, OUTPUT);
  digitalWrite(LEDblau, HIGH);

  // Initializing SD card
  if (!SD.begin(chipSelectPin))
  {
    //serial debugging
    Serial.println(F("SD card not found!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1); //don't do anything more
  }
  else
  {
    Serial.println(F("SD card initialized"));
  }
  // clear data
  SD.remove(dataFile);
  Serial.println(F("removed data"));
  // write headline
  File file = SD.open(dataFile, FILE_WRITE); //diese Operation öffnet den Pfad zur Datei "dataFile"
  if (file)
  {
    file.println(F("X-Acceleration, Y-Acceleration, Z-Acceleration, Gyro-X, Gyro-Y, Gyro-Z, Temperature, BMP-Temp., Druck, approx. Höhe"));
    file.close();
  }
  else
  {
    Serial.println(F("Error writing to file!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
  }
  //Initializing MPU6050
  if (!mpu.begin())
  {
    Serial.println(F("Failed to find MPU6050 chip"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);

    {
      delay(10);
    }
  }
  Serial.println(F("MPU6050 initialized"));
  //An der Initialisierung des MPU6050 liegt das Prblem nicht!
  //set accelerometer range to +-8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  //set gyro range to +-500 deg/s
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  //set filter bandwidth to 21 Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  delay(300);
  //Die Setup-Funktion funktioniert einwandfrei, keinerlei Probleme erkennbar

  //Initializing BMP280
  if (!bmp.begin(BMP280_ADDRESS)) {
    Serial.println(F("Failed to find BMP280 sensor"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);
  } else {
    Serial.println(F("BMP280 initialized"));
  }

  delay(2000);
  digitalWrite(LEDrot, LOW);
  //digitalWrite(LEDgruen, HIGH);
  digitalWrite(LEDblau, LOW);
}


void loop()
{
  // Get new sensor events with the readings
  mpu.getEvent(&a, &g, &temp);
  printSerial();
  printFile();
  delay(100);
}

void printSerial()
{
  //MPU6050
  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));

  //BMP280
  Serial.print(F("Temperature: "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure: "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude: "));
  Serial.print(bmp.readAltitude(1013.25)); //Adjust to local forecast!
  Serial.println(" m");

  Serial.println();
  }

  void printFile()
  {
  File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }
  file.print(a.acceleration.x);
  file.print(",");
  file.print(a.acceleration.y);
  file.print(",");
  file.print(a.acceleration.z);
  file.print(",");
  file.print(g.gyro.x);
  file.print(",");
  file.print(g.gyro.y);
  file.print(",");
  file.print(g.gyro.z);
  file.print(",");
  file.print(temp.temperature);
  file.print(",");
  file.print(bmp.readTemperature()); 
  file.print(",");
  file.print(bmp.readPressure());  
  file.print(",");
  file.println(bmp.readAltitude(1013.25));
  file.close();
}

Die Funktionen habe ich doch wieder getrennt, finde das etwas übersichtlicher.

Folgendes spricht der Output:

Der Sketch verwendet 29068 Bytes (94%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 1440 Bytes (70%) des dynamischen Speichers, 608 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Die verwendeten Bauteile, habe ich in meinem anderen Post bereits aufgelistet (siehe Link oben)
Da das mit Links aber so eine Sache ist, hier nochmal:

Verwendete Hardware:

  • Arduino Mini Pro (von AZDerlivery) mit Atmega328
  • MPU6050 (AZDelivery)
  • AZDelivery SPI Reader Micro Speicher SD TF Karte Memory Card Shield Modul

Es wurde bereits darauf hingewiesen, dass sich für ein Raketenprojekt ein STM32 "Blue Pill" gut eignen würde. Aber da ich mich noch nicht wirklich gut mit Arduino auskenne, weiß ich nicht ob das die Sache einfacher macht.

LG Alex

Mach mal eine Testversion ohne SD.
Wenn die nur 400 Byte RAM braucht, könntest du Glück haben.

Moin @michael_x ,

ich habe mal den SD-Anteil per #ifdef herausoperiert:

// #define SDCARD

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#ifdef SDCARD
  #include <SD.h>
#endif
#include <Adafruit_BMP280.h>

//define relevant pins
const int chipSelectPin = 10; //ChipSelect-Pin für SD Karte (ggf. abändern)
#define LEDrot    3
#define LEDgruen  4
#define LEDblau   2
#define BMP280_ADDRESS 0x76 //Sensor address

//create objects
#ifdef SDCARD
 File file;
#endif;
String dataFile = "datafile.txt"; //Die Datei dataFile heißt auf der SD Karte "datafile.txt"
Adafruit_MPU6050 mpu;
Adafruit_BMP280 bmp; //I2C

//declare MPU vars
sensors_event_t a, g, temp;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
  {
    delay(10);  // will pause Zero, Leonardo, etc until serial console opens
  }
  Serial.println(F("Flight data logger test!")); //F() macro: Moves the constant string
  // from SRAM to FLAH memory to safe SRAM memory

  pinMode(LEDrot, OUTPUT);
  digitalWrite(LEDrot, HIGH);
  pinMode(LEDgruen, OUTPUT);
  digitalWrite(LEDgruen, HIGH);
  pinMode(LEDblau, OUTPUT);
  digitalWrite(LEDblau, HIGH);

#ifdef SDCARD
  // Initializing SD card
  if (!SD.begin(chipSelectPin))
  {
    //serial debugging
    Serial.println(F("SD card not found!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1); //don't do anything more
  }
  else
  {
    Serial.println(F("SD card initialized"));
  }
  // clear data
  SD.remove(dataFile);
  Serial.println(F("removed data"));
  // write headline
  File file = SD.open(dataFile, FILE_WRITE); //diese Operation öffnet den Pfad zur Datei "dataFile"
  if (file)
  {
    file.println(F("X-Acceleration, Y-Acceleration, Z-Acceleration, Gyro-X, Gyro-Y, Gyro-Z, Temperature, BMP-Temp., Druck, approx. Höhe"));
    file.close();
  }
  else
  {
    Serial.println(F("Error writing to file!"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
  }
#endif
  //Initializing MPU6050
  if (!mpu.begin())
  {
    Serial.println(F("Failed to find MPU6050 chip"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);

    {
      delay(10);
    }
  }
  Serial.println(F("MPU6050 initialized"));
  //An der Initialisierung des MPU6050 liegt das Prblem nicht!
  //set accelerometer range to +-8G
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  //set gyro range to +-500 deg/s
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  //set filter bandwidth to 21 Hz
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  delay(300);
  //Die Setup-Funktion funktioniert einwandfrei, keinerlei Probleme erkennbar

  //Initializing BMP280
  if (!bmp.begin(BMP280_ADDRESS)) {
    Serial.println(F("Failed to find BMP280 sensor"));
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDblau, LOW); //Nur die rote LED leutet -> Fehler!
    while (1);
  } else {
    Serial.println(F("BMP280 initialized"));
  }

  delay(2000);
  digitalWrite(LEDrot, LOW);
  //digitalWrite(LEDgruen, HIGH);
  digitalWrite(LEDblau, LOW);
}


void loop()
{
  // Get new sensor events with the readings
  mpu.getEvent(&a, &g, &temp);
  printSerial();
  printFile();
  delay(100);
}

void printSerial()
{
  //MPU6050
  Serial.print(F("Acceleration X: "));
  Serial.print(a.acceleration.x);
  Serial.print(F(", Y: "));
  Serial.print(a.acceleration.y);
  Serial.print(F(", Z: "));
  Serial.print(a.acceleration.z);
  Serial.println(F(" m/s^2"));
  Serial.print(F("Rotation X: "));
  Serial.print(g.gyro.x);
  Serial.print(F(", Y: "));
  Serial.print(g.gyro.y);
  Serial.print(F(", Z: "));
  Serial.print(g.gyro.z);
  Serial.println(F(" rad/s"));
  Serial.print(F("Temperature: "));
  Serial.print(temp.temperature);
  Serial.println(F(" degC\r\n"));

  //BMP280
  Serial.print(F("Temperature: "));
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");
  Serial.print(F("Pressure: "));
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");
  Serial.print(F("Approx altitude: "));
  Serial.print(bmp.readAltitude(1013.25)); //Adjust to local forecast!
  Serial.println(" m");

  Serial.println();
}

void printFile()
{
#ifdef SDCARD
  File file = SD.open(dataFile, FILE_WRITE);
  if (!file)
  {
    Serial.println(F("No open File"));
    return;
  }
  file.print(a.acceleration.x);
  file.print(",");
  file.print(a.acceleration.y);
  file.print(",");
  file.print(a.acceleration.z);
  file.print(",");
  file.print(g.gyro.x);
  file.print(",");
  file.print(g.gyro.y);
  file.print(",");
  file.print(g.gyro.z);
  file.print(",");
  file.print(temp.temperature);
  file.print(",");
  file.print(bmp.readTemperature());
  file.print(",");
  file.print(bmp.readPressure());
  file.print(",");
  file.println(bmp.readAltitude(1013.25));
  file.close();
#endif
}

Das ergibt dann (Board = Arduino Pro oder Pro Mini);

Der Sketch verwendet 19340 Bytes (62%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 780 Bytes (38%) des dynamischen Speichers, 1268 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Hallo lex55,
habe dir schon geschrieben das die SD ist Speicherfresser, weis nicht warum du die Datei auf der SD im Setup löscht.
Wurde versuchen das kommentieren und schauen was das bringt, 70% ist schon heftig.
Ein ESP ist auch nicht viel größer als dein Board, installiere mall die ESP Board Definitionen und schau ob dein Sketsch sauber kompiliert. Der ESP8266 oder ESP32 haben sehr viel mehr Speicher.
UPPSSS geht nicht wahrscheinlich wegen der MPU6050 wen die unbedingt 5V braucht
Sehe gerade das der ist für 3,3V ausgelegt