AJAX Problem, help?

Hi everyone! I'm a newbie here and already I have a problem. :slight_smile: I've become blind to this code so I'm hoping someone can help me with this. Problem is that at "void SetLEDs(void)" I've defined five LEDs that turn on and off guided by AJAX html code (below). First four LEDs are working fine but when I add fifth, it stops working. First I thought the problem was on buffer size but didn't find it.. hope someone can peek in and tell me what's wrong with this :astonished:

Arduino Code:
http://pastebin.com/raw.php?i=UXHLsumC
HTML Code:
http://pastebin.com/raw.php?i=Rb96Yg3Q

Please, just post your code.
Use code tags.

AWOL:
Please, just post your code.
Use code tags.

I would, but I'd have to split the code into many posts because 9500 mark limit on this forum.

If you've exceeded 9.5k trying to light five LEDs, you need help elsewhere.

#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, 0, 55); // IP address, may need to change depending on network
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[5] = {0}; // stores the states of the LEDs
boolean nightMode = false; 
boolean motionSensors = false; 

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    // for debugging
    Serial.begin(9600);       
    
    // 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.");
    
    // LEDs
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    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, "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)
}

// 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")) {
        LED_state[0] = 1;  // save LED state
        digitalWrite(6, HIGH);
    }
    else if (StrContains(HTTP_req, "LED1=0")) {
        LED_state[0] = 0;  // save LED state
        digitalWrite(6, LOW);
    }
    // LED 2 (pin 7)
    if (StrContains(HTTP_req, "LED2=1")) {
        LED_state[1] = 1;  // save LED state
        digitalWrite(7, HIGH);
    }
    else if (StrContains(HTTP_req, "LED2=0")) {
        LED_state[1] = 0;  // save LED state
        digitalWrite(7, LOW);
    }
    // LED 3 (pin 8)
    if (StrContains(HTTP_req, "LED3=1")) {
        LED_state[2] = 1;  // save LED state
        digitalWrite(8, HIGH);
    }
    else if (StrContains(HTTP_req, "LED3=0")) {
        LED_state[2] = 0;  // save LED state
        digitalWrite(8, LOW);
    }
    // LED 4 (Nigh mode (on/off)), basicly turns off above 3 leds 
    if (StrContains(HTTP_req, "LED4=1")) {
        LED_state[3] = 1;  // save LED state
        nightMode = true;
        digitalWrite(6, LOW);
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        LED_state[0] = 0;  // save LED state
        LED_state[1] = 0;  // save LED state   
        LED_state[2] = 0;  // save LED state     
    }
    else if (StrContains(HTTP_req, "LED4=0")) {
        LED_state[3] = 0;  // save LED state
        nightMode = false; 
    }
    
    // LED 5 (motion sensors (on/off)) <----------------------- PROBLEM
    if (StrContains(HTTP_req, "LED5=1")) {
        LED_state[4] = 1;  // save LED state
        motionSensors = true;
    }
    else if (StrContains(HTTP_req, "LED5=0")) {
        LED_state[4] = 0;  // save LED state
        motionSensors = false;
}
}

// send the XML file with analog values, switch status
//  and LED status
void XML_response(EthernetClient cl)
{
    int count; // used by 'for' loops
    
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    
    // checkbox LED states
    // LED1
    cl.print("<LED>");
    if (LED_state[0]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");

    // LED2
    cl.print("<LED>");
    if (LED_state[1]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
     cl.println("</LED>");

    // LED3
    cl.print("<LED>");
    if (LED_state[2]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");

    // LED4
    cl.print("<LED>");
    if (LED_state[3]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    
    // LED5
    cl.print("<LED>");
    if (LED_state[4]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    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;
}

See?
No problem

And html looks like this:

<!DOCTYPE html>
<html>
    <head>
        <title>Home Automation</title>
        <script>
		strLED1 = "";
		strLED2 = "";
		strLED3 = "";
		strLED4 = "";
		strLED5 = "";

		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 === "checked") {
								document.LED_form.LED2.checked = true;
							}
							else {
								document.LED_form.LED2.checked = false;
							}
							
							// LED 3
							if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue === "checked") {
								document.LED_form.LED3.checked = true;
							}
							else {
								document.LED_form.LED3.checked = false;
							}							
							
							// LED 4
							if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue === "checked") {
								document.LED_form.LED4.checked = true;
							}
							else {
								document.LED_form.LED4.checked = false;
							}	
							
							// LED 5 (Switch)
							if (this.responseXML.getElementsByTagName('LED')[4].childNodes[0].nodeValue === "checked") {
								document.LED_form.LED5.checked = true;
							}
							else {
								document.LED_form.LED5.checked = false;
							}							
						}
					}
				}
			}
			// send HTTP GET request with LEDs to switch on/off if any
			request.open("GET", "ajax_inputs" + strLED1 + strLED2 + strLED3 + strLED4 + strLED5 + nocache, true);
			request.send(null);
			setTimeout('GetArduinoIO()', 1000);
			strLED1 = "";
			strLED2 = "";
			strLED3 = "";
			strLED4 = "";
			strLED5 = "";
		}
		// service LEDs when checkbox checked/unchecked
		function GetCheck()
		{
			if (LED_form.LED1.checked) {
				strLED1 = "&LED1=1";
			}
			else {
				strLED1 = "&LED1=0";
			}
			if (LED_form.LED2.checked) {
				strLED2 = "&LED2=1";
			}
			else {
				strLED2 = "&LED2=0";
			}
			if (LED_form.LED3.checked) {
				strLED3 = "&LED3=1";
			}
			else {
				strLED3 = "&LED3=0";
			}
			if (LED_form.LED4.checked) {
				strLED4 = "&LED4=1";
			}
			else {
				strLED4 = "&LED4=0";
			}
			if (LED_form.LED5.checked) {
				strLED5 = "&LED5=1";
			}
			else {
				strLED5 = "&LED5=0";
			}
		}
	</script>
	<style>
		.IO_box {
			float: left;
			margin: 0 20px 20px 0;
			border: 0px solid black;
			padding: 0 5px 0 5px;
			width: 400px;
		}
		h1 {
			font-size: 180%;
			color: black;
			margin: 0 0 10px 0;
		}
		h2 {
			font-size: 150%;
			color: black;
			margin: 5px 0 5px 0;
		}
		p, form, button {
			font-size: 140%;
			color: #252525;
		}
		.small_text {
			font-size: 130%;
			color: #737373;
		}
	</style>
    </head>
    <body onload="GetArduinoIO()">
        <h1>Home Automation</h1>
		<div class="IO_box">
			<h2>Lights Using Checkboxes</h2>
			<form id="check_LEDs" name="LED_form">
				<input type="checkbox" name="LED1" value="0" onclick="GetCheck()" />Valo 1 (D6)


				<input type="checkbox" name="LED2" value="0" onclick="GetCheck()" />Valo 2 (D7)


				<input type="checkbox" name="LED3" value="0" onclick="GetCheck()" />Valo 3 (D8)


				<input type="checkbox" name="LED4" value="0" onclick="GetCheck()" />Night Mode (on/off)


				<input type="checkbox" name="LED5" value="0" onclick="GetCheck()" />Motion Sensors (on/off)

			
			</form>			
		</div>
    </body>
</html>

Anyone? :slight_smile:

I see a lot of RAM used for simple strings.
What do your debug prints tell you?

AWOL:
I see a lot of RAM used for simple strings.
What do your debug prints tell you?

Yupp this generates a lot of traffic also because of refresh.

The part below comes up when I press the "LED5" on and part "&LED5=1" should appear at the end of this line just before "nocache", but it doesn't. I have tried to change client delay and [REQ_BUF_SZ] but no effect.

Host:GET /ajax_inputs&LED1=0&LED2=0&LED3=0&LED4=0&nocache=872042GET /ajax_inputs&nocache=270242.6515698001 HTTP/1.1

Whole debug:

Initializing SD card...
SUCCESS - SD card initialized.
SUCCESS - Found index.htm file.
GET /ajax_inputs&nocache=666348.2898437965 HTTP/1.1
Host: GET /ajax_inputs&nocache=37550.465355200235 HTTP/1.1
Host:GET /ajax_inputs&nocache=924610.4187363157 HTTP/1.1
Host: GET /ajax_inputs&nocache=178536.45829028898 HTTP/1.1
Host:GET /ajax_inputs&nocache=213863.91869772025 HTTP/1.1
Host:GET /ajax_inputs&nocache=755604.7576922046 HTTP/1.1
Host: GET /ajax_inputs&nocache=113996.82754797835 HTTP/1.1
Host:GET /ajax_inputs&nocache=580857.6978394112 HTTP/1.1
Host: GET /ajax_inputs&nocache=628278.5788895703 HTTP/1.1
Host: GET /ajax_inputs&nocache=255314.40710492004 HTTP/1.1
Host:GET /ajax_inputs&nocache=229524.53715630693 HTTP/1.1
Host:GET /ajax_inputs&nocache=143389.29561352375 HTTP/1.1
Host:GET /ajax_inputs&nocache=482307.2768697339 HTTP/1.1
Host: GET /ajax_inputs&nocache=565703.7710929606 HTTP/1.1
Host: GET /ajax_inputs&nocache=904877.5463457118 HTTP/1.1
Host: GET /ajax_inputs&nocache=784041.0993812999 HTTP/1.1
Host: GET /ajax_inputs&nocache=238718.4048403861 HTTP/1.1
Host: GET /ajax_inputs&nocache=198192.60615034806 HTTP/1.1
Host:GET /ajax_inputs&LED1=0&LED2=0&LED3=0&LED4=0&nocache=872042GET /ajax_inputs&nocache=270242.6515698001 HTTP/1.1
Host: GET /ajax_inputs&nocache=387530.62949286 HTTP/1.1
Host: 19GET /ajax_inputs&nocache=705701.698157243 HTTP/1.1
Host: 1GET /ajax_inputs&nocache=139945.19177645424 HTTP/1.1
Host:GET /ajax_inputs&nocache=550559.0007402693 HTTP/1.1
Host: GET /ajax_inputs&nocache=753108.7516086671 HTTP/1.1

I found the problem! It was in the html/xml where "setTimeout('GetArduinoIO()', 1000);" wasn't enouh for the string to go over the network. Du'h, so it was a buffer size but not there where I was looking for it.. Thank tho! :slight_smile: