'Evening everybody
I hope someone here can help me. I'm trying to build a data logger. It reads data from an MPU 6050. The data is to be stored on an SD card.
At the push of a button, the data logger will take a predetermined number of samples with a specified frequency.
The problem
The data is not saved to the SD card. The Arduino creates the file, but it remains empty. I have tried the Arduino SD Read/Write example and it works without out a problem. So I'm sure the error is in my code and not in the wiring and/or hardware. The data shows up in the serial monitor.
I hope I have provided sufficient information. Thanks in advance.
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
long accelX;
long accelY;
long accelZ;
float gForceX;
float gForceY;
float gForceZ;
//---Input
int sample_rate = 40; //Hz
int sample_time = 2; //s
//---
int sample_time_ms;
int sample_size;
int sample_freq_ms;
int i;
int button = 3;
int buttonState = 0;
int chipSelect = 4;
File AccData;
void setup() {
Serial.begin(9600);
Wire.begin();
setupMPU();
sampleData();
pinMode(10,OUTPUT); //Reserved for output.
SD.begin(chipSelect);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(button, INPUT);
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println(" Card failed, or not present");
// don't do anything more:
while (1);
}
Serial.println(" Card initialized.");
}
void loop() {
buttonState = digitalRead(button);
digitalWrite(LED_BUILTIN,LOW);
if (buttonState == HIGH) {
digitalWrite(LED_BUILTIN, HIGH);
File AccData = SD.open("data.txt", FILE_WRITE);
if (AccData) {
Serial.println("File Open");
for (i = 1; i <= sample_size; i++) {
digitalWrite(LED_BUILTIN, HIGH);
recordAccelRegisters();
printData();
writeToSD();
delay(sample_freq_ms);
}
}
else {
Serial.println("error opening datalog.txt");
}
AccData.close(); Serial.println("File Closed");
}
else{
digitalWrite(LED_BUILTIN,LOW);
}
}
void setupMPU(){
Wire.beginTransmission(0b1101000);
Wire.write(0x6B); // Power Management
Wire.write(0b00000000); //SLEEP = 0
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1C);
Wire.write(0b00000000); //setting +/-2g
Wire.endTransmission();
Wire.beginTransmission(0b1101000);
Wire.write(0x1A); //DLPF
Wire.write(0b00000110);
Wire.endTransmission();
}
void recordAccelRegisters() {
Wire.beginTransmission(0b1101000);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(0b1101000,6);
while(Wire.available() < 6);
accelX = Wire.read() <<8|Wire.read();
accelY = Wire.read() <<8|Wire.read();
accelZ = Wire.read() <<8|Wire.read();
processAccelData();
}
void processAccelData() {
gForceX = accelX/16384.0;
gForceY = accelY/16384.0;
gForceZ = accelZ/16384.0;
}
void printData() {
Serial.print(i);
Serial.print("\t");
Serial.print(sample_freq_ms*i);
Serial.print("\t");
Serial.print(gForceX);
Serial.print("\t");
Serial.print(gForceY);
Serial.print("\t");
Serial.println(gForceZ);
}
void sampleData() {
sample_freq_ms = 1000/sample_rate;
sample_time_ms = sample_time*1000;
sample_size = sample_time_ms / sample_freq_ms;
}
void writeToSD() {
if (i == 1) {
AccData.print("Sample");
AccData.print("\t");
AccData.print("ms");
AccData.print("\t");
AccData.print("gForceX");
AccData.print("\t");
AccData.print("gForceY");
AccData.print("\t");
AccData.println("gForceZ");
}
AccData.print(i);
AccData.print("\t");
AccData.print(sample_freq_ms*i);
AccData.print("\t");
AccData.print(gForceX);
AccData.print("\t");
AccData.print(gForceY);
AccData.print("\t");
AccData.println(gForceZ);
}