Ethernet shield, SD e Mega 2560

Salve , sto realizzando un progetto da un pò di tempo , numerosi tentativi mi hanno poratto alla scrittura di un codice che si era dimostrato funzionante con un Arduino Uno e Ethernet Shield (chip w5100) con SD. Avendo necessità di altri ingressi ho acquistato un Mega 2560 , ho fatto una prova con Ethernet Shield e con un Web Server che avevo e tutto era andato bene. Poi l'altro giorno ho montato il circuito per il progetto che sto realizzando , ho caricato il programma che prima sull'Uno era funzionante e sono iniziati problemi. Questi sono dovuto all'interfaccia SPI del Mega con SD e W5100 ,, dico questo perchè disabilitando uno funziona l'altro e viceversa. Il problema è che mi occorrono entrambi e contemporaneamente quindi se qualcuno potrebbe aiutarmi gliene sarei veramente molto grato. Ho letto su internet di problemi molto simili al mio, ho adattato e fatto delle prove ma niente. Per questo ho deciso di aprire un nuovo topic. Allego il setup del codice sperando che qualcuno riesca ad aiutarmi. Grazie.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <dht11.h>
#include <Servo.h>
 
#define maxLength 25
 
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip (192,168,0,254 );
IPAddress mioServer(192,168,0,252);
char serverName[] = "192.168.0.252";
int serverPort = 80;

#define delayMillis 30000UL
unsigned long thisMillis = 0;
unsigned long lastMillis = 0;
char pageAdd[64];

File htmlFile;

EthernetServer server(80);
EthernetClient client;

// Define di tuttte le variabili sui vari pin.

void setup()
{
  Serial.begin(9600);
  
  dx.attach(9);  // attaches the servo on pin 9 to the servo object 
  dx.write(140); //-- si apre
  
  sx.attach(10);
  sx.write(55);//++ si apre
  
  
  pinMode(sala,OUTPUT);
  // Vari pinMode
  pinMode(reed,INPUT);
  digitalWrite(reed, HIGH);    // Activate internal pullup resistor
  
  pinMode(crepuscolare,INPUT);
  pinMode(cigalino,OUTPUT);
  pinMode(portaGarage,OUTPUT);
  pinMode(corridoio,OUTPUT);
  
  Ethernet.begin(mac, ip); // Avvia della scheda ethernet con l'apposito metodo passandogli come parametri il mac e l'ip (statico).
  server.begin(); // Avvia del server configurato sulla porta 80 (http).
  
  if (!SD.begin(4)) { // Il pin 4 è quello generalmente utilizzato per gestire il modulo delle schede SD.
  Serial.println("Errore apertura SD!"); // Se non riesce nell'operazione di avvio stampa una stringa di errore ed esce.
  return; }
  
   if (!SD.exists("header.htm")) { // Verifica la presenza del file di intestazione.
        Serial.println("ERRORE - Non ho trovato  header.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("footer.htm")) { // Verifica la presenza del file di coda.
        Serial.println("ERRORE - Non ho trovato  footer.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("bagn.htm")) { // Verifica la presenza del file riservato al bagno.
        Serial.println("ERRORE - Non ho trovato  bagn.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("cam1.htm")) { // Verifica la presenza del file riservato alla camera numero uno.
        Serial.println("ERRORE - Non ho trovato  cam1.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("cam2.htm")) { // Verifica la presenza del file riservato alla camera numero due.
        Serial.println("ERRORE - Non ho trovato  cam2.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("cuci.htm")) { // Verifica la presenza del file riservato alla cucina.
        Serial.println("ERRORE - Non ho trovato  cuci.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
   if (!SD.exists("este.htm")) { // Verifica la presenza del file riservato all'esterno.
        Serial.println("ERRORE - Non ho trovato  este.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
    if (!SD.exists("gara.htm")) { // Verifica la presenza del file riservato al garage.
        Serial.println("ERRORE - Non ho trovato  gara.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
    if (!SD.exists("ingr.htm")) { // Verifica la presenza del file riservato all'ingresso.
        Serial.println("ERRORE - Non ho trovato  ingr.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
    if (!SD.exists("sala.htm")) { // Verifica la presenza del file riservato al salotto.
        Serial.println("ERRORE - Non ho trovato  sala.htm !");
        return;  // Siccome non lo ha trovato esco.
    }
    if (!SD.exists("scal.htm")) { // Verifica la presenza del file riservato alle scale.
        Serial.println("ERRORE - Non ho trovato  scal.htm !");
        return;  // Siccome non lo ha trovato esco. 
    }
  Serial.print("Il server è all'indirizzo IP : ");
  Serial.println(Ethernet.localIP()); // Metodo apposito per la stampa dell'indirizzo ip assegnato alla scheda e 
                                      // che, in questo caso, dovrebbe essere uguale a 192.168.0.254.

}

Leggi questo stralcio di caratteristiche della Ethernet Shield:

Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work.

Infatti avevo collegato il servo sul 10! Maledetta fretta. Grazie mille!:slight_smile: