Ethernet Shield setup

I have a 2560 and an ethernet shield. I'm just getting started with this project and this is my first time using an Ethernet shied. I've been at the documents and for examples explaining how to configure an Ethernet shield. Following is from Examples/Ethernet/UdpNtpClient.

In the different examples I'm finding sometimes #include <SPI.h> is used and other times it's not.
Is there a simple guide or explanation on how to configure the Ethernet shield and an explanations of the commands?

I'm working on a home automation project to control lights. As in button press, turn light on for say 15 minutes. These would all be time differential calculations based so actual time is not needed.

Reason I'm using the Ethernet shield is I would also like to control some lights and the garden sprinklers based on actual time so I need to set the clock from an NTP server.

Not sure if there's better code, but this is where I am starting with.

Would like to know what the first three includes are doing.

And then I would like to use a static IP address.

Would appreciate assistance.

Thanks

// Home

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {     
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};  //  MAC address assigned to varible mac as byte. 

unsigned int localPort = 8888;       // local port to listen for UDP packets

char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;


//  +++++++++++ SETUP  ++++++++++++++++++++++++++++++++++
void setup() {
  // put your setup code here, to run once:
 
 
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
  }
  Udp.begin(localPort);
}


}

//  ++++++++++++++ LOOP ++++++++++++++++++++++++++++++++++++
void loop() {
  // put your main code here, to run repeatedly:

sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait to see if a reply is available
  delay(1000);
  if (Udp.parsePacket()) {
    // We've received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, extract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
  Ethernet.maintain();
}

// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Doug101:
In the different examples I'm finding sometimes #include <SPI.h> is used and other times it's not.

You have libraries installed in a variety of folders. The compiler needs to be pointed to the specific folders that contain source code that needs to be compiled. When you compile a sketch the Arduino IDE searches through all your library folders to find the files in the #include directives and then passes those folders to the compiler. In Arduino IDE 1.6.5 and older it only did this dependency resolution process for #include directives in the sketch, not in libraries. The Ethernet library uses the SPI library. So with those old IDE versions if you wanted to use the Ethernet library you also needed to include SPI.h in your sketch, otherwise compilation would fail.

In Arduino IDE 1.6.6 the dependency resolution process was expanded to also scan #include directives in libraries included from the sketch (and libraries included from libraries) and so the #include directive for SPI.h is no longer necessary in any recent version of the Arduino IDE or the Arduino Web Editor. The directives are left in the examples for backwards compatibility.

To use a static IP address, look in the reference manual for Ethernet.begin().