Datenlogging

Hallo, ich bin ein Arduino Neuling bzw Quereinsteiger und messe für eine wissenschaftliche Arbeit UNO mittels einem MPU6050 die Neigung und mit einem einfachen Anemometer die Windgeschwindigkeit. Das funktioniert mit einem Arduino UNO bisher ganz gut. Nun möchte ich die Daten auf eine Sd Karte speichern um das gerät mobil einsetzen zu können. Habe mir ein einfaches SD Karten Modul bestellt und angeschlossen. Die Tests laufen.
Jegliche Versuche meine Daten auf die SD-Karte zu schreiben schlugen bisher jedoch fehl. Vielleicht hat ja jemand die Zeit und Muse mir etwas dabei zu helfen :slight_smile:

Den Code habe ich mal angehängt

Vielen Dank schon im Vorraus

0309.ino (4.48 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hallo,

du hast doch überhaupt nichts von "SD" drin in deinem Sketch. :o
Meine wärmste Empfehlung, schau dir die SD Lib Beispiele an die in der IDE vorhanden sind.
Datei > Beispiele ...

Oder schaue Dir die Beispiele der SdFat-Bibliothek an, da gibt es auch welche zur Datenspeicherung.

Vielen Dank schon mal für Eure Antworten.

Habe leider den falschen Code ohne SD hochgeladen.

Ich habe ein bisschen weiter gebastelt und mittlerweile scheint es, aus welchen Gründen auch immer, zu funktionieren :slight_smile:

Leider schreibt er mir die Werte nur auf 2 Kommastellen in die Datei, weiss jemand wo ich das ändern kann ?

[*code]
#include<Wire.h>

const int MPU_addr1=0x68;
double AcX1,AcY1,AcZ1,Tmp1,GyX1,GyY1,GyZ1;
const int MPU_addr2=0x69;
double AcX2,AcY2,AcZ2,Tmp2,GyX2,GyY2,GyZ2;
uint32_t timer;
double compAngleX1, compAngleY1;
double compAngleX2, compAngleY2;
#define degconvert 57.2957786

const int m_time = 1; //Meassuretime in Seconds
int wind_ct = 0;
float wind = 0.0;
unsigned long time = 0;
bool MessungGestarted = false;

#include <SD.h> //SD Card Bibliothek
#include <SPI.h> //Bibliothek zum zugriff auf die SPI Schnittstelle des Arduinos

File outFile; // Die Datei welche geschrieben bzw. gelesen werden soll
int pinCS = 53; // Chip Select Pin 10 auf dem Arduino Uno
String filename = "Wind.csv"; //Dateiname der zu lesenden bzw. schreibenden Datei

int val;
int dat;
int index = 0;

void setup(){

// Set up First Sensor
Serial.begin(9600);
time = millis();
Serial.println("CLEARDATA");
Serial.println("LABEL,time,compAngleX1,compAngleY1, km/h - ");
delay(100);

// Set up Second Sensor:

Wire.begin();
#if ARDUINO >= 157
Wire.setClock(400000UL);
#else
TWBR = ((F_CPU / 400000UL) - 16) / 2;
#endif

Wire.beginTransmission(MPU_addr1);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Wire.beginTransmission(MPU_addr2);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);

Wire.beginTransmission(MPU_addr1);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr1,14,true);

AcX1=Wire.read()<<8|Wire.read();
AcY1=Wire.read()<<8|Wire.read();
AcZ1=Wire.read()<<8|Wire.read();
Tmp1=Wire.read()<<8|Wire.read();
GyX1=Wire.read()<<8|Wire.read();
GyY1=Wire.read()<<8|Wire.read();
GyZ1=Wire.read()<<8|Wire.read();

double roll1 = atan2(AcY1, AcZ1)*degconvert;
double pitch1 = atan2(-AcX1, AcZ1)*degconvert;

//3) set the starting angle to this pitch and roll

double gyroXangle1 = roll1;
double gyroYangle1 = pitch1;
double compAngleX1 = roll1;
double compAngleY1 = pitch1;

Wire.beginTransmission(MPU_addr2);

Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr2,14,true);
AcX2=Wire.read()<<8|Wire.read();
AcY2=Wire.read()<<8|Wire.read();
AcZ2=Wire.read()<<8|Wire.read();

Tmp2=Wire.read()<<8|Wire.read();

GyX2=Wire.read()<<8|Wire.read();
GyY2=Wire.read()<<8|Wire.read();
GyZ2=Wire.read()<<8|Wire.read();

double roll2 = atan2(AcY2, AcZ2)*degconvert;
double pitch2 = atan2(-AcX2, AcZ2)*degconvert;
double gyroXangle2 = roll2;
double gyroYangle2 = pitch2;
double compAngleX2 = roll2;
double compAngleY2 = pitch2;

// Initiate Timer1 at 1 HZ
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624;
// CTC mode
TCCR1B |= (1 << WGM12);
// 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// Enable Timer Compare interrupt
TIMSK1 |= (1 << OCIE1A);

// Allow Interrupts
sei();

timer = micros();
pinMode(pinCS, OUTPUT);
if (SD.begin()){ //Wenn die SD Card initialisiert werden konnte dann....
Serial.println("SD Karte konnte erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
} else {
//Dieser Block wird ausgeführt wenn die SD Card nicht initialisiert werden konnte.
Serial.println("SD Karte konnte NICHT erfolgreich geladen werden!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
Serial.println("---Programm wird beendet!"); //Ausgabe des Textes auf der Seriellen Schnittstelle
return; //vorzeitiges beenden der setup Methode
}
}

void writeContent(int wind)
{
outFile = SD.open(filename, FILE_WRITE); //Öffnet bzw. erzeugt die Datei im Modus schreibend
if (outFile) { //Wenn die Datei existiert dann...
outFile.print(++index);
outFile.print(",");
outFile.print(compAngleX1);
outFile.print(",");
outFile.print(compAngleY1);
outFile.print(",");
outFile.print(wind);
outFile.println("");
outFile.close(); //Schließen der Datei (Dieses ist wichtig da sonst beim beenden des Sketches dies Daten verloren gehen können.)
} else {
//Dieser Block wird ausgeführt wenn die Datei nicht erzeugt werden konnte.
Serial.println("Fehler beim öffnen der Datei test.txt"); //Ausgabe des Textes auf der Seriellen Schnittstelle
}
}

int readwind(){
val = analogRead(wind_ct); // Den analogen Wert des Temperatursensors lesen.

return dat; // Temperatur zurück gegeben
}

void loop()
{
int wind = readwind();
writeContent(wind);
delay(1000);
Wire.beginTransmission(MPU_addr1);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr1,14,true);

AcX1=Wire.read()<<8|Wire.read();
AcY1=Wire.read()<<8|Wire.read();
AcZ1=Wire.read()<<8|Wire.read();

Tmp1=Wire.read()<<8|Wire.read();

GyX1=Wire.read()<<8|Wire.read();
GyY1=Wire.read()<<8|Wire.read();
GyZ1=Wire.read()<<8|Wire.read();

double dt1 = (double)(micros() - timer) / 1000000;

timer = micros();

double roll1 = atan2(AcY1, AcZ1)*degconvert;
double pitch1 = atan2(-AcX1, AcZ1)*degconvert;
double gyroXrate1 = GyX1/131.0;
double gyroYrate1 = GyY1/131.0;

compAngleX1 = 0.99 * (compAngleX1 + gyroXrate1 * dt1) + 0.01 * roll1;
compAngleY1 = 0.99 * (compAngleY1 + gyroYrate1 * dt1) + 0.01 * pitch1;

Wire.beginTransmission(MPU_addr2);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr2,14,true);

AcX2=Wire.read()<<8|Wire.read();
AcY2=Wire.read()<<8|Wire.read();
AcZ2=Wire.read()<<8|Wire.read();

Tmp2=Wire.read()<<8|Wire.read();

GyX2=Wire.read()<<8|Wire.read();
GyY2=Wire.read()<<8|Wire.read();
GyZ2=Wire.read()<<8|Wire.read();

double dt2 = (double)(micros() - timer) / 1000000;

timer = micros();

double roll2 = atan2(AcY2, AcZ2)*degconvert;
double pitch2 = atan2(-AcX2, AcZ2)*degconvert;
double gyroXrate2 = GyX2/131.0;
double gyroYrate2 = GyY2/131.0;

compAngleX2 = 0.99 * (compAngleX2 + gyroXrate2 * dt2) + 0.01 * roll2;
compAngleY2 = 0.99 * (compAngleY2 + gyroYrate2 * dt2) + 0.01 * pitch2;

// Second Measurement

if(!MessungGestarted)
{
wind_ct = 0;
attachInterrupt(1, countWind, RISING);
MessungGestarted = true;
// Start Timer
}

// Print Data Measurement 1

Serial.print("DATA, TIME,");
Serial.print(compAngleX1, 5); Serial.print(",");
Serial.print(compAngleY1, 5); Serial.print(",");
Serial.println(wind); //Speed in Km/h

}

ISR(TIMER1_COMPA_vect){

MessungGestarted = false;
wind = (float)wind_ct / (float)m_time * 2.4;
detachInterrupt(1);

}

void countWind() {
wind_ct ++;
}

[*/code]

Schau Dir mal die Doku zu print an. (gilt für alle Print, nicht nur für Serial).

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

... und vorher in der IDE Mal STRG+T drücken, rückt den Code lesbarer ein.

MfG

Tommy56:
Schau Dir mal die Doku zu print an. (gilt für alle Print, nicht nur für Serial).

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Vielen Dank, funktioniert !

Prima. Dann wäre es schön, wenn Du Deinen Code noch zum Abschluss in Codetags hier einstellst.

Gruß Tommy