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