Ethernet_shield not continously working

Hello Experts,

i need support, i am working on project which will perform the below,

  1. Control the light using LDR sensor with the help of relays to connect to high voltage
  2. Control Pump motor On and Off State
  3. the arduino is connected to router using ethernet shield with web page which enable controlling the previous mentioned cases

the Issue
the LDR is working without no issues, however the webpage some times is working and sometimes not , i donot know the actual reason for this...
it is working once i power it ON but after some time the the ping is not working nor the webpage

i am using SD card as well for two images that is displayed on the webpage

this is my code on the arduino

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   60

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 10); // IP address, may need to change depending on network  
byte subnet[] = { 255, 255, 255, 0 };
IPAddress gateway(192, 168, 1, 1);  // assign Gateway to the ethernet
IPAddress dns(8, 8, 8, 8);

EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = { 0 }; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
boolean LED_state[2] = { 0 }; // stores the states of the LEDs
int sensorReading = 0;
int LDR = 0;
int Interrupt = 0;
int Motor_state = 0;
int Night_counter=0 ;
int Day_counter=0 ;

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);

    SD.begin(4);  // initializing SD card for usage
  //  Serial.begin(9600);       // for debugging

    // initialize SD card
 //   Serial.println("Initializing SD card...");
 //   if (!SD.begin(4)) {
 //      Serial.println("ERROR - SD card initialization failed!");
 //       return;    // init failed
 //  }
 //   Serial.println("SUCCESS - SD card initialized.");
 //   // check for index.htm file
 //   if (!SD.exists("index.htm")) {
 //       Serial.println("ERROR - Can't find index.htm file!");
 //       return;  // can't find index file
 //   }
 //   Serial.println("SUCCESS - Found index.htm file.");

    // switches
    pinMode(2, INPUT);
    pinMode(3, INPUT);
    // LEDs

    pinMode(8, OUTPUT); // to force light on in the morning ,, it can be connected to ULN2003 and same output point as pin 5
    pinMode(5, OUTPUT);  // Normal LDR relay 
    pinMode(6, OUTPUT);  // to force light off in the morning 
    pinMode(7, OUTPUT);  // used to turn ON motor
    pinMode(A5, OUTPUT); // used to turn OFF motor
    pinMode(A4, OUTPUT); // used as help to make one relay up and ethernet chip start working while some relay is up

digitalWrite(5, HIGH);
 digitalWrite(6, HIGH);
 digitalWrite(8, HIGH);

 digitalWrite(7, HIGH);
 digitalWrite(A5, HIGH);
  digitalWrite(A4, HIGH);

// Ethernet.begin(mac, ip);  // initialize Ethernet device
Ethernet.begin(mac,ip,gateway,subnet);

    server.begin();           // start to listen for clients
}

void loop()
{    

  
    LDR_Reading();
    MotorInputState();
    digitalWrite(A4, LOW);
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // limit the size of the stored received HTTP request
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "motor.jpg")) {
                        webFile = SD.open("motor.jpg");
                        client.println("Cache-Control: public,max-age=31536000,immutable");
                        client.println("Content-Type: image/jpeg");
                        client.println("Connection: keep-alive");
                        client.println();
                        if (webFile) {
                            while (webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    else if (StrContains(HTTP_req, "lamp.jpg")) {
                        webFile = SD.open("lamp.jpg");
                        client.println("Cache-Control: public,max-age=31536000,immutable");
                        client.println("Content-Type: image/jpeg");
                        client.println("Connection: keep-alive");
                        client.println();
                        if (webFile) {
                            while (webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    else if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        SetLEDs();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while (webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
           //         Serial.print(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)

    // check the Input values 
    LDR_State_Checker();
}

void LDR_Reading(void)
{
    int ldr = A0;
    sensorReading = analogRead(ldr);
}
  void LDR_State_Checker(void)
{  
    if (sensorReading < 300 && Interrupt == 0)
    { // LED_state[0] = 1;  // save LED state
       Night_counter++ ;  
        LED_state[0] = 1;
        LDR = 1;
          if (Night_counter > 5000) {digitalWrite(5, LOW);  //Makes the LED glow in Dark 
        }
    }
    else if (sensorReading > 300 && Interrupt == 0)
    {  // LED_state[0] = 0;  // save LED state
        Day_counter++;
        LED_state[0] = 0;
        LDR = 0;  
         if (Day_counter > 5000) {digitalWrite(5, HIGH);   //Turns the LED OFF in Light.
        } 
    }
    
if (Day_counter == 8000){
    Day_counter = 0;
    }
if (Night_counter == 8000){
    Night_counter = 0;
    }
}

void MotorInputState(void)
{
    int MotorInputReading = digitalRead(3);
    if (MotorInputReading == 1)
    {
        LED_state[1] = 1;
        Motor_state = 1;

    }
    else if (MotorInputReading == 0)
    {
        LED_state[1] = 0;
        Motor_state = 0;
    }

}

// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void SetLEDs(void)
{
    // LED 1 (pin 6)
    if (StrContains(HTTP_req, "LED1=1") && LDR == 1) {
        LED_state[0] = 1;  // save LED state
        digitalWrite(6, HIGH); // will make LDR continue working at night
        Interrupt = 0;
    }
    else if (StrContains(HTTP_req, "LED1=1") && LDR == 0) {
        LED_state[0] = 1;  // save LED state
        digitalWrite(8, LOW); // will force light to turn up at daylight by admin
        Interrupt = 1;
    }
    else if (StrContains(HTTP_req, "LED1=0") && LDR == 1) {
        LED_state[0] = 0;  // save LED state
        digitalWrite(6, LOW); // will turn on the light at night by admin
        Interrupt = 1;
    }
    else if (StrContains(HTTP_req, "LED1=0") && LDR == 0) {
        LED_state[0] = 0;  // save LED state
        digitalWrite(8, HIGH);
        Interrupt = 0;
    }

    // LED 2 (pin 7)
    if (StrContains(HTTP_req, "LED2=1") && Motor_state == 0) { // here to control web page to power on motor by contacting relay 3 sec then disconnect it
        LED_state[1] = 1;  // save LED state for revealing this motor state on the webpage
        Motor_state == 1;  // bec the next connection need the actual state of the motor in the program 
        digitalWrite(7, LOW);
        delay(2000);
        digitalWrite(7, HIGH);

    }
    else if (StrContains(HTTP_req, "LED2=1") && Motor_state == 1) {
        LED_state[1] = 1;  // save LED state
        Motor_state == 1;
    }
    else if (StrContains(HTTP_req, "LED2=0") && Motor_state == 1) {
        LED_state[1] = 0;  // save LED state for revealing this motor state on the webpage
        Motor_state == 0; //  bec the next connection need the actual state of the motor in the program 
        digitalWrite(A5, LOW);
        delay(2000);
        digitalWrite(A5, HIGH);
    }
    else if (StrContains(HTTP_req, "LED2=0") && Motor_state == 0) {
        LED_state[1] = 0;  // save LED state
        Motor_state == 0;
    }
}

// send the XML file with analog values, switch status
//  and LED status
void XML_response(EthernetClient cl)
{
    int analog_val;            // stores value read from analog inputs
    int count;                 // used by 'for' loops
    int sw_arr[] = { 2, 3 };  // pins interfaced to switches

    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    // checkbox LED states
    // LED1
    cl.print("<LED>");
    if (LED_state[0] == 1) {
        cl.print("checked");
    }
    else if (LED_state[0] == 0) {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    // button LED states
    // LED3
    cl.print("<LED>");
    if (LED_state[1]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
    cl.print("</inputs>");
}

// sets every element of str to 0 (clears array)
void StrClear(char* str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char* str, char* sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);

    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}
</>

And the below is the SD web page file

<!DOCTYPE html>
<html>
    <head>
        <title>Arduino Ajax LED Button Control</title>
        <script>
		strLED1 = "";
		strLED2 = "";
		var LED2_state = 0;
		function GetArduinoIO()
		{
			nocache = "&nocache=" + Math.random() * 1000000;
			var request = new XMLHttpRequest();
			request.onreadystatechange = function()
			{
				if (this.readyState == 4) {
					if (this.status == 200) {
						if (this.responseXML != null) {
							// XML file received - contains analog values, switch values and LED states
							var count;
							// LED 1
							if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "checked") {
								document.LED_form.LED1.checked = true;
							}
							else {
								document.LED_form.LED1.checked = false;
							}
							// LED 2
							if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "on") {
								document.getElementById("LED2").innerHTML = "LED 2 is ON (D7)";
								LED2_state = 1;
							}
							else {
								document.getElementById("LED2").innerHTML = "LED 2 is OFF (D7)";
								LED2_state = 0;
							}
						}
					}
				}
			}
			// send HTTP GET request with LEDs to switch on/off if any
			request.open("GET", "ajax_inputs" + strLED1 + strLED2 + nocache, true);
			request.send(null);
			setTimeout('GetArduinoIO()', 1000);
			strLED1 = "";
			strLED2 = "";
		}
		// service LEDs when checkbox checked/unchecked
		function GetCheck()
		{
			if (LED_form.LED1.checked) {
				strLED1 = "&LED1=1";
			}
			else {
				strLED1 = "&LED1=0";
			}
		}
		function GetButton1()
		{
			if (LED2_state === 1) {
				LED2_state = 0;
				strLED2 = "&LED2=0";
			}
			else {
				LED2_state = 1;
				strLED2 = "&LED2=1";
			}
		}
	</script>
	<style>
		.IO_box {
			float: left;
			margin: 0 20px 20px 0;
			border: 1px solid blue;
			padding: 0 5px 0 5px;
			width: 120px;
		}
		h1 {
			font-size: 120%;
			color: blue;
			margin: 0 0 10px 0;
		}
		h2 {
			font-size: 85%;
			color: #5734E6;
			margin: 5px 0 5px 0;
		}
		p, form, button {
			font-size: 80%;
			color: #252525;
		}
		.small_text {
			font-size: 70%;
			color: #737373;
		}
	</style>
    </head>
    <body onload="GetArduinoIO()">
        <h1>Arduino Ajax LED Button Control</h1>
		<div class="IO_box">
			<h2>LED Using Checkbox</h2>
			<form id="check_LEDs" name="LED_form">
				<input type="checkbox" name="LED1" value="0" onclick="GetCheck()" />Motor is OFF click to turn ON<br /><br />
			</form>
		</div>
		<div class="IO_box">
			<h2>Light Status</h2>
			<button type="button" id="LED2" onclick="GetButton1()">Light is OFF Click to turn ON</button><br /><br />
		</div>
    </body>
</html>

Please read the forum guidelines How to get the best out of this forum - Using Arduino / Installation & Troubleshooting - Arduino Forum

Format your code within the Arduino IDE using Control-T and post your code within a code block use the </> button. This will make it much easier for others to read and much ore likely to get helpful replies.

@eltabakh_gomaa, your topic has been moved to a more suitable location on the forum. This has nothing to do with Installation and Troubleshooting which is not for problems with your project (see About the Installation & Troubleshooting category).

Please edit your post, select all code and click the </> button; Next save your post.

It will make the code easier to read and copy for this that want to help.

See also the link provided in previous post.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.