Arduino unable to store data in SD properly

Hi,

I am learning arduino for the last two years and the last months I'm working with the creation of my own weather station.

Well, I needed to find a place to store data in a temporary place every 4 seconds to later send them at my server (it doesnt realy matters right now). So I chose the SD card memory.

After a lot of time trying to figure out the best way to make it possible which fits in my situation I came up with the following code(I deleted the server part for easier debugging).

However, I have a very strange problem that i cant solve for a long time! After the SD card has been initialized it sometimes strugles to save the data into the SD for an uknown reason and this is not a stable preformance.

I tried getting rid of almost every String by making char* but there's still the same problem.

Please, I realy need your help because is also a project for our school team and I know that most of you have more experiance than me.

Even if you had maybe a similar problem and you found a type of solution please do not overlook to reply.

Thank you!

Here's the code.

//Libraries
#include <dht.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_SI1145.h>
#include "RTClib.h"

//Constants

//Temperature Sensor
#define DHT21_PIN 5     // DHT 21  (AM2301) - what pin we're connected to

//Cloud Sensor
#define cloudSensor_PIN A0

//Rain Meter
#define Rain_PIN 1

//Rain Sensor
#define RainSensor_PIN A1

//Wind Gauge
#define WindGauge_PIN 0

//Wind Vane
#define WindVane_PIN A2

//Dust Sensor
#define measurePin A6
#define ledPower 12

#define samplingTime 280
#define deltaTime 40
#define sleepTime 9680

//Sets
dht DHT;
Adafruit_BMP280 bme;
Adafruit_SI1145 uv = Adafruit_SI1145();
RTC_DS3231 rtc;
File myFile;
File readFile;

//Sensors' Variables
boolean FirstTimeDATA = true;
unsigned long DataCatch_DelayTick;

//Temperature Sensor
float hum;  //Stores humidity value
float temp; //Stores temperature value

//Atmospheric Pressure Sensor
float airpress;

//Cloud Sensor
int cloudata;

//Rain Meter
int RainPulses = 0;

//Rain Sensor
int rainDensity;

//Wind Gauge
int wPulses;

//Wind Vane
int WindDirection = 0;

//Dust Sensor
bool dustFirstTime = true;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
long dustTimer = 0;

//UV Sensor
float UVindex;


//Main System
boolean tester;

//Save SD
const int chipSelect = 53;
boolean SD_begun;

//Sending data to: SerialPort
void setup() {
  //Pin's se
  Serial.begin(9600);
  attachInterrupt(WindGauge_PIN , WindGauge , RISING);
  attachInterrupt(Rain_PIN , RainMeter , RISING);
  pinMode(A0, INPUT);
  pinMode(A2, INPUT);
  pinMode(measurePin, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(ledPower, OUTPUT);
  pinMode(SS, OUTPUT);
  //Beginings
  bme.begin(0x76);
  if (!(SD.begin(chipSelect))) {
    SD_begun = false;
  } else {
    SD_begun = true;
  }
  rtc.begin();
  uv.begin();
  Serial.println(SD_begun);
}

void loop() {
  if (FirstTimeDATA) {
    dataCollecting();
    DataCatch_DelayTick = millis();
    FirstTimeDATA = false;
    //Joins this part every 4sec
  } else if ((millis() - DataCatch_DelayTick) > 4000) {
    if (SD_begun) {
      int n = 0;
      back1:
      //Arduino gets the data from its sensors and stores them in a char*
      dataCollecting();
      DateTime now = rtc.now();
      String Data = ((String)temp+";"+hum+";"+airpress+";"+cloudata+";"+rainDensity+";"+RainPulses+";"+WindDirection+";"+dustDensity+";"+UVindex+";"+(now.hour())+";"+(now.minute())+";"+(now.second())+";"+(now.day())+";"+(now.month())+";"+(now.year()));//18 parts      
      char DATA[Data.length() +1];
      Data.toCharArray(DATA, Data.length() + 1);
      
      //Arduino creates a new file name to store the data in the SD
      String fName = ((String)(now.day()) + (now.hour()) + (now.minute()) + (now.second()) + ".TXT");
      fName = "Data/"+ fName; 
      char FileName[fName.length() + 1];
      fName.toCharArray(FileName, fName.length() + 1);
      //SD.mkdir("Data/")
      myFile = SD.open(FileName, FILE_WRITE);
      if (! myFile) {
        SD.remove(FileName);
        Serial.println("Error");
      }
      Serial.println(myFile.name());
      Serial.println(DATA);
       for(int i = 0; i < Data.length() + 1; i++){
        myFile.print(DATA[i]);
      }
      
      myFile.close();
      tester = TestSData(DATA, FileName);
      //Try another 5 times or stop.
      if (!tester && n < 6) {
        SD.remove(FileName);
        Serial.println("SD fail 1");
        n++;
        goto back1;
      }

    } else {
      //Re-initialize
      Serial.println("TrySD");
      if (!(SD.begin(chipSelect))) {
        SD_begun = false;
      } else {
        SD_begun = true;
      }
    }

    DataCatch_DelayTick = millis();
    wPulses = 0;
    RainPulses = 0;
  }
}

//1.Taking Temperature and Humidity from the sensor
boolean temphum()
{
  int chk = DHT.read21(DHT21_PIN);
  //Read data and store it to variables hum and temp
  hum = DHT.humidity;
  temp = DHT.temperature;
  return true;
  //I use (return) to help the controler to work in a correct row
}


//5. Metering Rain
void RainMeter() {
  RainPulses ++;
}

//6. Metering Wind Speed
void WindGauge() {
  wPulses++;
}


//7. Taking Wind Direction
boolean WindVane()
{
  // Serial.println(analogRead(A2));
  if ((analogRead(A2) > 780) && (analogRead(A2) < 793)) {
    WindDirection = "1"; //N
  }else if ((analogRead(A2) > 400) && (analogRead(A2) < 413)) {
    WindDirection = "2"; //NNE
  }else if ((analogRead(A2) > 455) && (analogRead(A2) < 466)) {
    WindDirection = "3"; //NE
  } else if ((analogRead(A2) > 79) && (analogRead(A2) < 90)) {
    WindDirection = "4"; //NEE
  } else if ((analogRead(A2) > 95) && (analogRead(A2) < 105)) {
    WindDirection = "5"; //E
  } else if ((analogRead(A2) > 61) && (analogRead(A2) < 75)) {
    WindDirection = "6"; //SEE
  } else if ((analogRead(A2) > 181) && (analogRead(A2) < 198)) {
    WindDirection = "7"; //SE
  } else if ((analogRead(A2) > 124) && (analogRead(A2) < 140)) {
    WindDirection = "8"; //SSE
  } else if ((analogRead(A2) > 285) && (analogRead(A2) < 305)) {
    WindDirection = "9"; //S
  } else if ((analogRead(A2) > 244) && (analogRead(A2) < 260)) {
    WindDirection = "10"; //SSW
  } else if ((analogRead(A2) > 625) && (analogRead(A2) < 636)) {
    WindDirection = "11"; //SW
  } else if ((analogRead(A2) > 590) && (analogRead(A2) < 607)) {
    WindDirection = "12"; //SWW
  } else if ((analogRead(A2) > 930) && (analogRead(A2) < 949)) {
    WindDirection = "13"; //W
  } else if ((analogRead(A2) > 820) && (analogRead(A2) < 834)) {
    WindDirection = "14"; //NWW
  } else if ((analogRead(A2) > 874) && (analogRead(A2) < 893)) {
    WindDirection = "15"; //NW
  } else if ((analogRead(A2) > 700) && (analogRead(A2) < 711)) {
    WindDirection = "16"; //NNW
  } else {
    WindDirection = "0"; //NULL
  }
  return true;
}

//8. Metering Dust Density
boolean dustSensor() {

  if (millis() - dustTimer > 32000) {
    digitalWrite(9, LOW);

    digitalWrite(ledPower, LOW); // power on the LED
    delayMicroseconds(samplingTime);

    voMeasured = analogRead(measurePin); // read the dust value

    delayMicroseconds(deltaTime);
    digitalWrite(ledPower, HIGH); // turn the LED off
    delayMicroseconds(sleepTime);
    // digitalWrite(9,LOW);
    // 0 - 3.3V mapped to 0 - 1023 integer values
    // recover voltage
    calcVoltage = voMeasured * (3.3 / 1024);
    // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
    dustDensity = 1000 * 0.17 * calcVoltage ;
    dustTimer = millis();
  } else if (millis() - dustTimer > 28000) {
    digitalWrite(9, HIGH);
  }
  return true;
}



boolean dataCollecting() {
  tester = temphum();
  //2. Taking Air Pressure sensor data
  airpress = bme.readPressure() / 100 + 21;
  //3. Taking Cloud Sensor results
  cloudata = analogRead(cloudSensor_PIN);
  //4. Metering Rain Density
  rainDensity = analogRead(A1);
  //7. Taking Wind Direction
  tester = WindVane();
  //8. Metering Dust Density
  tester = dustSensor();
  //9. UV Sensor
  UVindex = uv.readUV();
  UVindex /= 100.0;
  return true;
}

boolean TestSData(const char* Data, const char* fName) {
   char SDData[70];
  //Serial.println(fileName);
  myFile = SD.open(fName);
  if (myFile) {
    int n = 0;
    while (myFile.available()) {
     char ch = (char)myFile.read();

      if (ch == '\n' || ch == '\r') {
        SDData[n] = '\0';
        break;
      }else{
        SDData[n] = ch;
      }
      n++;
    }
    myFile.close();
  } 
  //Here I compare the data that I sent, with the data that i saved in SD.
  Serial.println(Data);
  Serial.println(SDData);
 
  if (strcmp(SDData, Data) == 0) {
   return true;
 }else{
  return false;
 }
}

And I have some results of my serial print debugging:

1
1231611.TXT
21.30;37.00;1021.73;338;1020;0;615;0.00;0.01;23;16;11;1;1;2020
21.30;37.00;1021.73;338;1020;0;615;0.00;0.01;23;16;11;1;1;2020
21.30;37.00;1021.73;338;1020;0;615;0.00;0.01;23;16;11;1;1;2020
1231615.TXT
19.80;36.30;1021.76;344;1023;0;615;0.00;0.02;23;16;15;1;1;2020
19.80;36.30;1021.76;344;1023;0;615;0.00;0.02;23;16;15;1;1;2020
19.80;36.30;1021.76;344;1023;0;615;0.00;0.02;23;16;15;1;1;2020
1231620.TXT
21.00;36.80;1021.80;325;1020;0;615;0.00;0.02;23;16;20;1;1;2020
21.00;36.80;1021.80;325;1020;0;615;0.00;0.02;23;16;20;1;1;2020
21.00;36.80;1021.80;325;1020;0;615;0.00;0.02;23;16;20;1;1;2020
1231624.TXT
21.10;36.90;1021.86;297;1020;0;615;0.00;0.02;23;16;24;1;1;2020
21.10;36.90;1021.86;297;1020;0;615;0.00;0.02;23;16;24;1;1;2020
21.10;36.90;1021.86;297;1020;0;615;0.00;0.02;23;16;24;1;1;2020
1231628.TXT
21.10;36.90;1021.64;298;1020;0;615;0.00;0.02;23;16;28;1;1;2020
21.10;36.90;1021.64;298;1020;0;615;0.00;0.02;23;16;28;1;1;2020
21.10;36.90;1021.64;298;1020;0;615;0.00;0.02;23;16;28;1;1;2020
1231633.TXT
21.10;37.00;1021.77;295;1022;0;615;0.00;0.02;23;16;33;1;1;2020
21.10;37.00;1021.77;295;1022;0;615;0.00;0.02;23;16;33;1;1;2020
21.10;37.00;1021.77;295;1022;0;615;0.00;0.02;23;16;33;1;1;2020
1231637.TXT
21.20;36.90;1021.74;342;1020;0;615;0.00;0.02;23;16;37;1;1;2020
21.20;36.90;1021.74;342;1020;0;615;0.00;0.02;23;16;37;1;1;2020
21.20;36.90;1021.74;342;1020;0;615;0.00;0.02;23;16;37;1;1;2020
Error

21.10;37.00;1021.84;324;1020;0;615;0.00;0.02;23;16;41;1;1;2020
21.10;37.00;1021.84;324;1020;0;615;0.00;0.02;23;16;41;1;1;2020
O
SD fail 1
Error

21.00;36.90;1021.82;300;1020;0;615;0.00;0.02;23;16;42;1;1;2020
21.00;36.90;1021.82;300;1020;0;615;0.00;0.02;23;16;42;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.83;293;1022;0;615;0.00;0.01;23;16;42;1;1;2020
21.20;37.00;1021.83;293;1022;0;615;0.00;0.01;23;16;42;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.83;292;1020;0;615;0.00;0.02;23;16;43;1;1;2020
21.20;37.00;1021.83;292;1020;0;615;0.00;0.02;23;16;43;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.79;322;1020;0;615;0.00;0.02;23;16;44;1;1;2020
21.20;37.00;1021.79;322;1020;0;615;0.00;0.02;23;16;44;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.76;334;1023;0;615;0.00;0.02;23;16;44;1;1;2020
21.10;37.00;1021.76;334;1023;0;615;0.00;0.02;23;16;44;1;1;2020
O
SD fail 1
Error

21.10;36.90;1021.75;343;1020;0;615;0.00;0.01;23;16;45;1;1;2020
21.10;36.90;1021.75;343;1020;0;615;0.00;0.01;23;16;45;1;1;2020
O
TrySD
Error

21.30;37.00;1021.79;306;1023;0;615;0.00;0.02;23;16;49;1;1;2020
21.30;37.00;1021.79;306;1023;0;615;0.00;0.02;23;16;49;1;1;2020
O
SD fail 1
Error

20.10;36.60;1021.83;290;1020;0;615;0.00;0.02;23;16;50;1;1;2020
20.10;36.60;1021.83;290;1020;0;615;0.00;0.02;23;16;50;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.77;312;1021;0;615;0.00;0.02;23;16;51;1;1;2020
21.20;37.00;1021.77;312;1021;0;615;0.00;0.02;23;16;51;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.81;323;1022;0;615;0.00;0.02;23;16;51;1;1;2020
21.20;37.00;1021.81;323;1022;0;615;0.00;0.02;23;16;51;1;1;2020
O
SD fail 1
Error

21.30;37.10;1021.82;341;1021;0;615;0.00;0.02;23;16;52;1;1;2020
21.30;37.10;1021.82;341;1021;0;615;0.00;0.02;23;16;52;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.79;340;1023;0;615;0.00;0.02;23;16;52;1;1;2020
21.10;37.00;1021.79;340;1023;0;615;0.00;0.02;23;16;52;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.79;315;1020;0;615;0.00;0.01;23;16;53;1;1;2020
21.20;37.00;1021.79;315;1020;0;615;0.00;0.01;23;16;53;1;1;2020
O
TrySD
Error

21.20;37.00;1021.69;339;1022;0;615;0.00;0.03;23;16;57;1;1;2020
21.20;37.00;1021.69;339;1022;0;615;0.00;0.03;23;16;57;1;1;2020
O
SD fail 1
Error

19.80;36.30;1021.69;314;1022;0;615;0.00;0.02;23;16;58;1;1;2020
19.80;36.30;1021.69;314;1022;0;615;0.00;0.02;23;16;58;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.70;298;1021;0;615;0.00;0.02;23;16;59;1;1;2020
21.20;37.00;1021.70;298;1021;0;615;0.00;0.02;23;16;59;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.65;289;1020;0;615;0.00;0.03;23;16;59;1;1;2020
21.20;37.00;1021.65;289;1020;0;615;0.00;0.03;23;16;59;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.70;321;1021;0;615;0.00;0.02;23;17;0;1;1;2020
21.10;37.00;1021.70;321;1021;0;615;0.00;0.02;23;17;0;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.73;343;1020;0;615;0.00;0.02;23;17;0;1;1;2020
21.20;37.00;1021.73;343;1020;0;615;0.00;0.02;23;17;0;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.77;314;1022;0;615;0.00;0.03;23;17;1;1;1;2020
21.20;37.00;1021.77;314;1022;0;615;0.00;0.03;23;17;1;1;1;2020
O
TrySD
Error

21.30;37.00;1021.80;301;1022;0;615;0.00;0.02;23;17;5;1;1;2020
21.30;37.00;1021.80;301;1022;0;615;0.00;0.02;23;17;5;1;1;2020
O
SD fail 1
Error

19.90;36.40;1021.76;343;1022;0;615;0.00;0.02;23;17;6;1;1;2020
19.90;36.40;1021.76;343;1022;0;615;0.00;0.02;23;17;6;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.80;316;1022;0;615;0.00;0.02;23;17;7;1;1;2020
21.20;37.00;1021.80;316;1022;0;615;0.00;0.02;23;17;7;1;1;2020
O
SD fail 1
Error

21.40;37.00;1021.77;296;1020;0;615;0.00;0.02;23;17;7;1;1;2020
21.40;37.00;1021.77;296;1020;0;615;0.00;0.02;23;17;7;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.78;321;1020;0;615;0.00;0.02;23;17;8;1;1;2020
21.20;37.00;1021.78;321;1020;0;615;0.00;0.02;23;17;8;1;1;2020
O
SD fail 1
Error

21.00;36.90;1021.71;342;1023;0;615;0.00;0.02;23;17;8;1;1;2020
21.00;36.90;1021.71;342;1023;0;615;0.00;0.02;23;17;8;1;1;2020
O
SD fail 1
Error

21.20;36.90;1021.72;316;1020;0;615;0.00;0.02;23;17;9;1;1;2020
21.20;36.90;1021.72;316;1020;0;615;0.00;0.02;23;17;9;1;1;2020
O
TrySD
Error

21.40;37.00;1021.72;315;1023;0;615;20.27;0.01;23;17;13;1;1;2020
21.40;37.00;1021.72;315;1023;0;615;20.27;0.01;23;17;13;1;1;2020
O
SD fail 1
Error

21.40;37.00;1021.71;335;1020;0;615;20.27;0.02;23;17;13;1;1;2020
21.40;37.00;1021.71;335;1020;0;615;20.27;0.02;23;17;13;1;1;2020
O
SD fail 1
Error

21.40;37.00;1021.71;335;1021;0;615;20.27;0.02;23;17;14;1;1;2020
21.40;37.00;1021.71;335;1021;0;615;20.27;0.02;23;17;14;1;1;2020
O
SD fail 1
Error

21.40;37.00;1021.72;334;1012;0;615;20.27;0.01;23;17;14;1;1;2020
21.40;37.00;1021.72;334;1012;0;615;20.27;0.01;23;17;14;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.76;330;1020;0;615;20.27;0.02;23;17;14;1;1;2020
21.20;37.00;1021.76;330;1020;0;615;20.27;0.02;23;17;14;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.75;333;1021;0;615;20.27;0.02;23;17;14;1;1;2020
21.20;37.00;1021.75;333;1021;0;615;20.27;0.02;23;17;14;1;1;2020
O
SD fail 1
Error

21.20;37.00;1021.77;319;1020;0;615;20.27;0.02;23;17;14;1;1;2020
21.20;37.00;1021.77;319;1020;0;615;20.27;0.02;23;17;14;1;1;2020
O
TrySD
Error

21.20;37.00;1021.70;304;1022;0;615;20.27;0.03;23;17;19;1;1;2020
21.20;37.00;1021.70;304;1022;0;615;20.27;0.03;23;17;19;1;1;2020
O
SD fail 1
Error

19.90;36.50;1021.70;304;1018;0;615;20.27;0.02;23;17;19;1;1;2020
19.90;36.50;1021.70;304;1018;0;615;20.27;0.02;23;17;19;1;1;2020
O
SD fail 1
Error

21.00;37.00;1021.72;308;1020;0;615;20.27;0.02;23;17;20;1;1;2020
21.00;37.00;1021.72;308;1020;0;615;20.27;0.02;23;17;20;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.75;313;1022;0;615;20.27;0.03;23;17;20;1;1;2020
21.10;37.00;1021.75;313;1022;0;615;20.27;0.03;23;17;20;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.71;304;1020;0;615;20.27;0.02;23;17;21;1;1;2020
21.10;37.00;1021.71;304;1020;0;615;20.27;0.02;23;17;21;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.72;293;1022;0;615;20.27;0.02;23;17;21;1;1;2020
21.10;37.00;1021.72;293;1022;0;615;20.27;0.02;23;17;21;1;1;2020
O
SD fail 1
Error

21.10;37.00;1021.75;317;1019;0;615;20.27;0.03;23;17;21;1;1;2020
21.10;37.00;1021.75;317;1019;0;615;20.27;0.03;23;17;21;1;1;2020
O
TrySD
[code/]

Since, I don't know anything about the Adafruit libraries, I would write a sketch that writes known values as fast as I can to the SD card and see what is going on.

Surely you can explain the problem better than " After the SD card has been initialized it sometimes strugles to save the data into the SD for an uknown reason and this is not a stable preformance. ".

Paul

You (still) seem to be using the String class a lot, which is likely to be fatal - eventually if not already.

the filename stuff seems unnecessarily complicated

char filename[] = "00000000.CSV";
.............
void getFileName(){
sprintf(filename, "%02d%02d%02d.csv", year, month, day);
}

I guess much the same may be said for the rest of the code. The SD datalogger example in the IDE should be all you need.

I didn't understand the .CSV definition. I want to use .TXT files that are stored in a folder named
"Data". (fName = "Data/"+ fName;)
Could you explain how this could help because the length of the date is not the same all the time?

"00000000.CSV";

Also, the Datalogger example is unuseful for my situation because I have floats and ints that must be stored in a char* without using String-class.

I couldn't find a solution for the data logger that uses only char*:

String Data = ((String)temp+";"+hum+";"+airpress+";"+cloudata+";"+rainDensity+";"+RainPulses+";"+WindDirection+";"+dustDensity+";"+UVindex+";"+(now.hour())+";"+(now.minute())+";"+(now.second())+";"+(now.day())+";"+(now.month())+";"+(now.year()));//18 parts     
      char DATA[Data.length() +1];
      Data.toCharArray(DATA, Data.length() + 1);

Oh, and not to forget that I create a new txt file every 4sec because I read them every 5 minutes from my server. Would be a better idea to make a file every 5 min(300 sec) and store the data one below the other (300s/4s = 75 Data rows).

orestis146:
I didn't understand the .CSV definition. I want to use .TXT

The file descriptor is irrelevant to Arduino. CSV is just the common usage for Excel, which is a common destination for comma-separated logged data. You can give it any three character name you like.

files that are stored in a folder named
"Data". (fName = "Data/"+ fName;)

I bet you have no good reason for storing the files in a folder, I have no idea how, or why, you would do that, and I suggest you refrain.

Could you explain how this could help because the length of the date is not the same all the time?

"00000000.CSV";

I suggest you make the lengths the same all the time, like everybody else does. It is time to learn about leading zeros.

Also, the Datalogger example is unuseful for my situation because I have floats and ints that must be stored in a char* without using String-class.

This is nonsense. You can store floats as floats, and ints as ints. I think you are just making things more difficult than they really are.

I couldn't find a solution for the data logger that uses only char*:

String Data = ((String)temp+";"+hum+";"+airpress+";"+cloudata+";"+rainDensity+";"+RainPulses+";"+WindDirection+";"+dustDensity+";"+UVindex+";"+(now.hour())+";"+(now.minute())+";"+(now.second())+";"+(now.day())+";"+(now.month())+";"+(now.year()));//18 parts     

char DATA[Data.length() +1];
      Data.toCharArray(DATA, Data.length() + 1);

No comment - other than that I understand it takes longer to assemble the String, and send it, than it does to send the data individually. And then there all those Strings, big ones. There may be means for assembling data streams, but this is not likely to be one of them, and I'm not aware of any. I just send the data in individual myfile.print statements.

Ok, thanks a lot!!! You gave me a lot of knowleadge to continue and I learned a few facts about Arduino.

You get Karma from me! :slight_smile:

If there's any problem I'll tell you.