Ethernet shield can't get IP.

Hi, I’ve an arduino + Ethernet shield.
I uploaded this sketch:

#include <String.h>  
#include <SPI.h>  
#include <Ethernet.h>  
#define tempPin A0
#define fotoresistenza A1

const int ledPinLuminosita=5;
  
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xAC, 0x68 };   
 
//creo una variabile char per memorizzare i byte letti dal client
char Data_RX;
 
//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer server(80);
int ledPin6 = 6;
int ledPin7 = 7;
int ledPin8 = 8;
int ledPin9 = 9; // LED pin  
String readString;   
boolean LEDON1 = false;
boolean LEDON2 = false;
boolean LEDON3 = false;
boolean LEDON4 = false;

int val_Adc = 0;
//variabile temperatura celsius
float tempC = 0;
//variabile temperatura fahrenheit
float tempF = 0;
//variabile temperatura kelvin
float tempK = 0;
 
void setup()
{
    pinMode(ledPin6, OUTPUT);
    pinMode(ledPin7, OUTPUT);
    pinMode(ledPin8, OUTPUT);
    pinMode(ledPin9, OUTPUT);
    pinMode(A1, INPUT);
    pinMode(ledPinLuminosita, OUTPUT);
    Serial.begin(9600);
    if(!Ethernet.begin(mac)) Serial.println("dhcp failed");
    else {
       Serial.print("IP is ");
       Serial.println(Ethernet.localIP());
    }
    server.begin();
}
 
void loop()
{
   int val = analogRead(fotoresistenza); // salvo il valore fotoresistenza dentro alla variabile val   
   
   if(val<500) //se il valore letto dalla fotoresistenza (luminosità) è basso, accendo il led  
    digitalWrite(ledPinLuminosita,HIGH);  
   else  
    digitalWrite(ledPinLuminosita,LOW); //altrimenti lo spengo (o lo lascio spento)  
   
   EthernetClient client = server.available();  
    if (client) //SE ESISTE UN CLIENTE
  {
    while (client.connected()) // SE IL CLIENTE E' CONNESSO
    {
      if (client.available()) //SE E' TUTTO OK PER INIZIARE
      {
        char c = client.read(); //LEGGI I SINGOLI CARATTERI INVIATI
        if (readString.length() < 100) 
        {
          readString += c; //CONCATENA I CARATTERI
        }  
        if (c == '\n') //VEDE SE C'E' IL CARATTERE DI FINE STRINGA, PER INDIVIDUARE CHE E' FINITA
        {
          if(readString.indexOf("L1=1") > 0) //IMPOSTA UNA VARIABILE DI TIPO BOLEANA (VERO-FALSO) PER GLI STATI DEL LED
          {
            LEDON1 = true;
          } 
          else if (readString.indexOf("L2=1") > 0) 
          {
            LEDON2 = true;             
          }
          else if (readString.indexOf("L3=1") > 0) 
          {
            LEDON3 = true;             
          }
          else if (readString.indexOf("L4=1") > 0) 
          {
            LEDON4 = true;             
          }
          else if(readString.indexOf("L1=0") > 0)
          {
            LEDON1 = false;
          } 
          else if (readString.indexOf("L2=0") > 0) 
          {
            LEDON2 = false;             
          }
          else if (readString.indexOf("L3=0") > 0) 
          {
            LEDON3 = false;             
          }
          else if (readString.indexOf("L4=0") > 0) 
          {
            LEDON4 = false;             
          }

          //CREA LA PAGINA HTML (VERRA' AGGIORNATA AD OGNI ISTRUZIONE NUOVA)
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html><head>");
          //refresh per le temperature
          client.print("<meta http-equiv='refresh' content='2'>");
          client.println("<title>Arduino Home</title></head><body>");
          client.println("<table border=""2"" width=""100%"" height=""100%""><tr><td align=""center"">");
          //TITOLO LED 1
          client.println("<h1>LUCE CUCINA</h1>");

          //OPERAZIONI DA FARE QUANDO SI CLICCA PER ATTIVARE LEDON1:  
          if (LEDON1) { 
            digitalWrite(ledPin6, HIGH);  
            client.println("Stato: ON 
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L1=0'>SPEGNI</a>");
            client.println("<a href='L1=1'>ACCENDI</a>");
          } 
          else {

            //OPERAZIONI DA FARE QUANDO SI CLICCA PER SPEGNERE LEDON1:  
            digitalWrite(ledPin6, LOW );
            client.println("Stato: OFF 
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L1=0'>SPEGNI</a>");
            client.println("<a href='L1=1'>ACCENDI</a>");
          }

          //TTOLO LED2
          client.println("<h1>LUCE SALOTTO</h1>");

          //OPERAZIONI DA FARE QUANDO SI CLICCA PER ATTIVARE LEDON2:  
          if (LEDON2) { 
            digitalWrite(ledPin7, HIGH);  
            client.println("Stato: ON
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L2=0'>SPEGNI</a>");
            client.println("<a href='L2=1'>ACCENDI</a>");
          } 
          else { 

            //OPERAZIONI DA FARE QUANDO SI CLICCA PER SPEGNERE LEDON2:    
            digitalWrite(ledPin7, LOW); 
            client.println("Stato: OFF
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L2=0'>SPEGNI</a>");
            client.println("<a href='L2=1'>ACCENDI</a>");
          } 
          
          //TTOLO LED3
          client.println("<h1>LUCE BAGNO</h1>");

          //OPERAZIONI DA FARE QUANDO SI CLICCA PER ATTIVARE LEDON2:  
          if (LEDON3) { 
            digitalWrite(ledPin8, HIGH);
            client.println("Stato: ON
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L3=0'>SPEGNI</a>");
            client.println("<a href='L3=1'>ACCENDI</a>");
          } 
          else { 

            //OPERAZIONI DA FARE QUANDO SI CLICCA PER SPEGNERE LEDON2:    
            digitalWrite(ledPin8, LOW); 
            client.println("Stato: OFF
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L3=0'>SPEGNI</a>");
            client.println("<a href='L3=1'>ACCENDI</a>");
          } 
          
          //TTOLO LED4
          client.println("<h1>LUCE CAMERA DA LETTO</h1>");

          //OPERAZIONI DA FARE QUANDO SI CLICCA PER ATTIVARE LEDON2:  
          if (LEDON4) { 
            digitalWrite(ledPin9, HIGH);
            client.println("Stato: ON
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L4=0'>SPEGNI</a>");
            client.println("<a href='L4=1'>ACCENDI</a>"); 
          } 
          else { 

            //OPERAZIONI DA FARE QUANDO SI CLICCA PER SPEGNERE LEDON2:    
            digitalWrite(ledPin9, LOW); 
            client.println("Stato: OFF
");
            //CREA I PULSANTI RELATIVI A LED1    
            client.println("<a href='L4=0'>SPEGNI</a>");
            client.println("<a href='L4=1'>ACCENDI</a>");
          } 
          client.print("</td>");
          client.print("<td align=""center"">");
            
            //init variabile
          val_Adc = analogRead(tempPin);
 
            //eseguo un ciclo
          for(byte Ciclo = 0; Ciclo<100; Ciclo++)
          {
            //acquisisco il valore e lo sommo alla
            //variabile
            val_Adc += analogRead(tempPin);
            //questo ritardo serve per dare il tempo
           //all' ADC di eseguire correttamente
          //la prossima acquisizione
          }
          //°C = ((valoreADC * PrecisioneADC) – TensioneZeroGradi) / stepGradoTensione
          //eseguo la media dei 100 valori letti
          float media=val_Adc / 100;
 
          //Temperatura di rilevazione: -40°C ~ 125°C
          //Tipo di uscita: tensione
          //Alimentazione di tensione: 2.7 V ~ 5.5 V
          //Precisione: ±2°C 
          float tensione = media * 5.0; 
          tensione/=1024.0;//tensione in mV
          //temperatura in Celsius
          tempC=(tensione - 0.5) * 100;
          //invio i dati al computer
          Serial.print(tempC); Serial.println(" gradi C");
          tempF = (tempC * 9.0 / 5.0) + 32.0;
          Serial.print(tempF); Serial.println(" gradi F");
          tempK = tempC + 273.15;
          Serial.print(tempK); Serial.println(" gradi K");
            
          //output
          client.print("<h1>TEMPERATURA</h1>");
          client.print("
Temperatura in gradi Celsius: ");
          client.print(tempC);
          client.print("

");
          client.print("
Temperatura in gradi Fahrenheit: ");
          client.print(tempF);
          client.print("

");
          client.print("
Temperatura in gradi Kelvin: ");
          client.print(tempK);
          client.println("
");
          client.print("</td>");
          client.print("</tr></table>");
          //CHIUDE I TAG HTML PER LA PAGINA
          client.println("</body></html>");

          //SI PREPARA PER UNA NUOVA ISTRUZIONE
          readString="";

          //TERMINA LE OPERAZIONI CLIENTE
          client.stop();
        }
      }
    }
  }
}

initially it works, but now it can’t get IP. The serial monitor doesn’t write any message.
Why?

Try a simple version to test the dhcp function. Does this display an IP, or wait two minutes and display "failed"?

byte mac[] = {  0x00, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  Serial.print(F("Starting ethernet..."));
  if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  else Serial.println(Ethernet.localIP());
}

void loop() {
}

This works, ty!

If that test sketch worked and your sketch still fails, you may be running out of SRAM. Note the use of the F() function in my test sketch with static strings. You might want to use that on your static strings.

edit: ...or you have a SD card in the shield's slot. That will also cause communication with the w5100, especially dhcp, to fail.