Won't write to SD card

'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);
}

Are you closing the file after writing to it ?

Yes - with line 80 in the code:

AccData.close(); Serial.println("File Closed");

I made a function which is causing me problems:

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

If I insert this in the void loop, instead of calling the function, then it works. I can't find the error.

AccData.close(); Serial.println("File Closed");

Unconditionally closing a file that may not have been opened is NOT a good idea.

int i;

One letter global variable names show a complete lack of imagination.

Please use Tools + Auto Format before posting code. It is too hard to guess where blocks start and end in your poorly indented mess.

you open the file to a local variable. the global variable is uninitialized because it is shadowed in setup() by the local variable

EDIT: in loop(), not in setup()

Juraj:
you open the file to a local variable. the global variable is uninitialized because it is shadowed in setup() by the local variable

In loop(), not setup(). I thought I missed something in setup(). I didn't, but I did miss that loop() declared another variable with the same name as the global variable.