Problema con arduino UNO que se reinicia automaticamente cada 30 seg.

Saludos...les comento que voy realizando un pequeño proyecto, donde estoy guardando datos cada segundo (por el momento aleatorios) en una memoria sd, haciendo uso del shield Data Logging, pasado 15 seg. hago que guarden 100 datos en memoria sd lo mas rapido posible, hasta el momento va bien hasta ahi. El problema es que llegado a los 30 seg. despues de haber iniciado el arduino, este se reinicia automaticamente y no entiendo porque. Alguien que pueda ayudarme con este problema por favor. Adjunto mi codigo.

#include <SPI.h>
#include <SdFat.h>
#include <Time.h>//libreria para fecha y hora
#include <TimeLib.h>
SdFat SD;
File dataFile;
unsigned long actual,previo=0,act,prev=0;
double variables [9]= {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
char dateReceiveBT[19],aux='+';
int punt,ref,count;
String date_time="",data_var="";
void setup() {
Serial.begin(115200);
  if(!SD.begin(SS)){//Verificamos si existe Tarjeta SD  
    Serial.println("Tarjeta no presente o mal conectado");
    while(true);  
  }
  Serial.println("Tarjeta SD OK");
  setTime(19,25,0,4,2,2018);
}

void loop() {
  if(Serial.available()>0){
    aux=Serial.read();
    if(aux!='*'&&aux!='+'){
      punt=0;
      while(Serial.available()){
        dateReceiveBT[punt]=Serial.read();
        punt++;
        delay(10);       
      }
      for(punt=0;punt<sizeof(dateReceiveBT);punt++){
        Serial.print(dateReceiveBT[punt]);
      }
      Serial.println();
      punt=0;       
    }
  }else{
    actual = millis();
    if((actual-previo)>=1000){
      concTime();
      date_time+=';';
      for(ref=0;ref<9;ref++){
          data_var+=variables[ref];
          data_var+=';';
      }
      dataFile = SD.open("lectura.txt",FILE_WRITE);
      if(dataFile){
        date_time+=data_var;
        dataFile.println(date_time);
        dataFile.close();
      }
      Serial.println(date_time);
      data_var="";
      date_time="";
      previo=millis();
    }else{
      act=millis();
      if((act-prev)>=15000){
        date_time+='*';
        concTime();
        date_time+='*';
        for(punt=0;punt<9;punt++){
          if(punt==0||punt==1){
            data_var+='

;
            data_var+=variables[punt];//concatenamos variables
          }else{
            data_var+=';';//concatenamos caracter de separacion
            data_var+=variables[punt];//concatenamos los valores de las variables 
          }   
        }
        dataFile = SD.open("lectura.txt", FILE_WRITE);//abrimos el archivo lectura.txt
        if(dataFile){
          date_time+=data_var;
          dataFile.println(date_time);
          dataFile.close(); 
        }
        data_var="";
        date_time="";
        count=0; 
        while(count<100){
          for(punt=0;punt<9;punt++){
            if(punt==0||punt==1){
              data_var+='


![problemaArduinoSD.PNG|877x1012](upload://sGjDgYeW2NfMij5Y9Fi0XKdgLyX.png);
              data_var+=variables[punt];//concatenamos variables
            }else{
              data_var+=';';//concatenamos caracter de separacion
              data_var+=variables[punt];//concatenamos los valores de las variables  
            }    
          }
          dataFile = SD.open("lectura.txt", FILE_WRITE);//abrimos el archivo lectura.txt
          if(dataFile){
            dataFile.println(data_var);
            dataFile.close();  
          }
          variables[0] = random(9,15)*1.0;
          variables[1] = random(50,200)*1.0;
          data_var="";
          count++;          
        }
        date_time="#"; //caracter final
        concTime();
        date_time+=';';
        for(ref=0;ref<9;ref++){
          data_var+=variables[punt];
          data_var+=';';//concatenamos caracter de separacion
        }
        dataFile = SD.open("lectura.txt", FILE_WRITE);//abrimos el archivo lectura.txt
        if(dataFile){//verificamos si existe el archivo en la memoria
          date_time+=data_var;
          dataFile.println(date_time);//guardamos el dato en la memoria
          dataFile.close();//cerramos cesion con la memoria 
        }
        data_var="";//limpiamos el contenido de data_var
        date_time="";//limpiamos el contenido de date_time
        aux='+';
        prev=millis();     
      }else{
        variables[0] = random(9,15)*1.0;
        variables[1] = random(50,200)*1.0;
        variables[2] = random(20,100)*1.0;
        variables[3] = random(10,50)*1.0; 
        variables[4] = random(5,25)*1.0;
        variables[5] = random(10,40)*1.0; 
        variables[6] = random(10,40)*1.0;
        variables[7] = random(10,40)*1.0; 
        variables[8] = random(10,30)*1.0;
      }
    }
  }
}

void concTime(){
  time_t t = now();//se obtiene la hora y fecha actual del sistema segun hora y fecha de referencia  
  date_time+=month(t);
  date_time+='/';
  date_time+=day(t);
  date_time+='/';//concatenamos caracter de separacion
  date_time+=year(t);
  date_time+=';';//concatenamos caracter de separacion
  date_time+=hour(t);
  date_time+=':';
  date_time+=minute(t);
  date_time+=':';
  date_time+=second(t);
}

¿Que te dice el compilador sobre la memoria (RAM) usada?

Mi olfato me indica lo mismo que el de Lucario. Trabajar con la SD consume de por sí un buen pellizco de memoria; y es posible que las operaciones con strings que estás realizando estén provocando en última instancia un desbordamiento de memoria.
Monitoriza en cada loop la memoria que te queda (busca en este foro una función que te devuelve la memoria RAM libre). Si ves que en cada loop va disminuyendo constantemente, ya sabes tu problema.