Problemi arduino sd ethernet

Ciao a tutti sono nuovo del forum e della programmazione con arduino, ho un grosso problema sto tentando di fare un piccolo antifurto che mi avvisa tramite email se vi è stata una variazione di stato tra dei sensori a contatto o vi è stato un aumento della temperatura.
Ho realizzato due sketch nel primo viene inizializzata perfettamente la SD sulla quale vengono salvati gli stati degli ingressi e il valore della temperatura, viene inizializzata correttamente la connessione con un time sever che mi rida il giorno e l’ora, e vengono controllati perfettamente gli stati degli ingressi. Nel secondo vengono verificati perfettamente gli ingressi sia digitali che analogici, la connessione con il time service e riesco a inviare la mail al seguito di un evento.
il problema che non riesco a far coesistere la scrittura del SD e l’invo della mail, quando lo lancio dal monitor seriale solo una serie di numeri e lettere oppure si impianta nell’ inizializzazione della SD come in un loop infinito.
Se qualcuno mi può aiutare sarebbe fantastico.

 #include <SPI.h>
 #include <Ethernet.h>
 
 const unsigned int temp = 0;
 const unsigned int tilt_a = 8;
 const unsigned int tilt_b = 5;
 const unsigned int contatto = 2;
 
 // Local network configuration:
 
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };
 byte ip[] = { 192, 168, 1, 177 };
 
 // Login data:
 
 String UserName64 = "xxxxxxxxxxxxxxxx";
 String Password64 = "xxxxxxxxxxxxxxxxxx";
 byte server[] = { 0, 0, 0, 200 }; // SMTP server
 String ServerName = "pincopallino.it";
 IPAddress time_server (193,204,114,105);
 
 // Mail data:
 
 String Sender = "info@pincopallino.it";
 String Recipient = "topolino@gmail.com";
 String Subject = "Messaggio inviato da Arduino!";
 String Body = "Testo del messaggio.";
 int time = 1000;
 int wait = 1000;
 String ServerResponse="";
 EthernetClient client;
 
 
 
 // Metodo void  per ricevimento chiamate da server SMTP
 
  void GetResponse() {
    if (client.available()) {
         char c = client.read();
         while (client.available()) { // Store command char by char.
           ServerResponse +=c;
           c = client.read();
         }
    Serial.println("<<<" + ServerResponse);
    ServerResponse="";
  }
    }
  
  
  
  // Metodo void per inoltro messaggi al server SMTP
 
   void SendMsg(String m) {
     client.println(m);
       Serial.println(">>>" + m);
         delay(wait); /* wait for a response */
   GetResponse();
 }
 
 
  void setup()
 {
   
  Serial.begin(9600);
  
  pinMode(tilt_a, INPUT);
  pinMode(tilt_b, INPUT);
  pinMode(contatto, INPUT);
  
 }
 
 void loop()
 
 {
 
 
   
  int tempx = analogRead (temp);
  tempx = (5.0 * tempx * 100.0)/1024.0;
  Serial.print("Sensore temperatura: ");
  Serial.println(tempx);
  
  
  int contattox = digitalRead (contatto);
  if ((digitalRead(contattox) == HIGH)){
  Serial.println("Sensore a contatto : OK");
  }else{
  Serial.println("Sensore sensore a contatto : RILEVATO ALLARME");
  }
  
   int tilt_bx = digitalRead (tilt_b);
  if ((digitalRead(tilt_bx) == HIGH)){
  Serial.println("Sensore tilt_b : OK");
  }else{
  Serial.println("Sensore tilt_b : RILEVATO ALLARME");
  }

   int tilt_ax = digitalRead (tilt_a);
  if ((digitalRead(tilt_ax) == HIGH)){
  Serial.println("Sensore tilt_a : OK");
  Serial.println("");
  }else{
  Serial.println("Sensore tilt_a : RILEVATO ALLARME");
  }
  
  if ((tempx >= 30) || (digitalRead(2) == HIGH) || (digitalRead(5) == HIGH) || (digitalRead(8) == HIGH)){
  Serial.println("Programma invio email allarme avviato...");
  Serial.println("");
  delay(time); 
  Serial.println("Inizializzazione modulo network...");
  Ethernet.begin(mac, ip);
  delay(2000);
  Serial.print("in connessione...");
  if (client.connect(server, 25)) {
     Serial.println("connesso");
     SendMsg("HELO " + ServerName); /* say hello*/
     SendMsg("AUTH LOGIN ");
     SendMsg(UserName64); /* Username*/
     SendMsg(Password64); /* Password */
     SendMsg("MAIL From:<" + Sender +">"); /* identify sender */
     SendMsg("RCPT To:<" + Recipient + ">"); /* identify recipient */
     SendMsg("DATA");
     SendMsg("To: " + Recipient); /*  recipient in message header */
     SendMsg("From: " + Sender); /* seder name in message header */
     SendMsg("Subject: "+ Subject); /* insert subject */
     SendMsg(""); /* empty line */
     SendMsg(Body); /* insert body */
     SendMsg(""); /* empty line */
     SendMsg("."); /* end mail */
     SendMsg("QUIT"); /* terminate connection */
     client.println();
  } else {
    Serial.println("connessione fallita");
  }
 
   if (!client.connected()) {
    Serial.println();
    Serial.println("disconnesso.");
    client.stop();
   }
  }
  else{
   }
   
  delay(1000);

  Serial.print("In connessione...");
  Ethernet.begin(mac, ip);
  if (client.connect(time_server, 13) <= 0) { // <label id="code.ethernet.connect"/>
  Serial.println("connessione fallita.");
  } else {
  Serial.println("connesso.");
  delay(300);
  while (client.available()) {
  char c = client.read();
  Serial.print(c);
  }
    
  Serial.println("Disconnesso.");
  Serial.println("");
  client.stop();
  }
   
   delay(1000);
 }

Con questo codice riesco a fare tutto ma se inserisco anche la registrazione degli eventi su SD va tutto a farsi benedire.

Grazie

Sarebbe utile una piccola descrizione anche dell'hardware che uno possiede.

aggiungi al tuo setup()

pinMode(10, OUTPUT); 	
digitalWrite(10, 1); 
pinMode(4, OUTPUT);     
digitalWrite(4, 1);

Ciao Pablos, scusa hai ragione sto usando unsa scheda itead Iboard 1.1, ma lo stesso problema si ricrea su arduino 2009 con shield ethernet avevo già provato a settare i pin cs come da tè proposto ma nulla da fare, se allo sketch postato sopra aggiungi la scrittura della sd e provi a fare un collegamento con monitor seriale il tutto va in crash…

Stai usando questa? http://imall.iteadstudio.com/im120410001.html
dal titolo parli di arduino, ma questa è una compatibile non è arduino… non la conosco mi spiace

Si è esatamente quella, ma lo stesso problema si ripropone se uso una arduino 2009 con shield ethernet.........