Are you sure you're not running out of RAM? Seems like you're being pretty liberal with use of floating points as well as the String class - which tends to be pretty fat and bloated.
DateTime now = RTC.now();
sprintf(date_time,"%d/%d/%d %d:%d:%d",now.day(),now.month(),now.year(),now.hour(),now.minute(),now.second());
String dataString = String(date_time) + ", " + String(cel) + ", " + String(hum) + ", " + String(e_NO2_Vout) + ", " + String(e_NO_Vout) + ", " + String(e_CO_Vout) + ", " + String(CO_Vout) + ", " + String(NO2_Vout) + ", " + String(O3_Vout) + ", " + String(dust_Vout);
Serial.println(dataString);
pinMode(SD_led, OUTPUT);
digitalWrite(SD_led, HIGH);
delay(59000);
digitalWrite(SD_led, LOW);
delay(1000);
Could be re-written like so:
#include <avr/pgmspace.h>
int _outputserialchar( char c, FILE *t) {
Serial.write( c );
return 1;
}
void setup()
{
fdevopen( &_outputserialchar, 0);
//All your other setup stuff here
}
void loop()
{
//All your other loop stuff here
DateTime now = RTC.now();
sprintf_P(date_time,PSTR("%d/%d/%d %d:%d:%d"),now.day(),now.month(),now.year(),now.hour(),now.minute(),now.second());
printf_P(PSTR("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s\r\n"), date_time, cel, hum, e_N02_Vout, e_NO2_Vout, e_CO_Vout, CO_Vout, NO2_Vout, O3_Vout, dust_Vout);
pinMode(SD_led, OUTPUT);
digitalWrite(SD_led, HIGH);
delay(59000);
digitalWrite(SD_led, LOW);
delay(1000);
}
It should compile, but I couldn't test it since i don't have the DateTime library. That alone would free up a huge chunk of memory.
Edit: Yes, you can argue that printf isn't the most efficient of things to do either, but it's still going to be better than declaring 10 new string classes just for ease of concatenation.
If memory really is the issue (quite possible), you'd probably want to re-write the printf again and do it in small steps with minimal variable usage.