Ethernet Shield LED Control

Hi Guys,

I'm trying to control an LED by using a checkbox in a custom API but it seems it doesn't work. This is my code for a start. I took it from [Link: https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-LED-control/ ] and as the example shows... it works but mine doesn't.

#include 
#include 

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 20); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80

String HTTP_req;          // stores the HTTP request
boolean LED_status = 0;   // state of LED, off by default

void setup()
{
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
    Serial.begin(9600);       // for diagnostics
    pinMode(2, OUTPUT);       // LED on pin 2
}

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
                HTTP_req += c;  // save the HTTP request 1 char at a time
                // 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");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    // send web page
                    client.println("");
                    client.println("");
                    client.println("");
                    client.println("Arduino LED Control");
                    client.println("");
                    client.println("");
                    client.println("

LED

");                     client.println("

Click to switch LED on and off.

");                     client.println("
");                     ProcessCheckbox(client);                     client.println("
");                     client.println("");                     client.println("");                     Serial.print(HTTP_req);                     HTTP_req = "";    // finished with request, empty string                     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) } // switch LED and send back HTML for LED checkbox void ProcessCheckbox(EthernetClient cl) {     if (HTTP_req.indexOf("LED2=2") > -1) {  // see if checkbox was clicked         // the checkbox was clicked, toggle the LED         if (LED_status) {             LED_status = 0;         }         else {             LED_status = 1;         }     }         if (LED_status) {    // switch LED on         digitalWrite(2, HIGH);         // checkbox is checked         cl.println("LED2");     }     else {              // switch LED off         digitalWrite(2, LOW);         // checkbox is unchecked         cl.println("LED2");     } }

Have any ideas?

Have any ideas?

Yes. You need to print out what the client asked for. What makes you think that checking the checkbox will result in the GET request containing LED2=2? I would expect that unchecked would be 0 and checked would be 1.

Hi PaulS,

I'll try and get to that part. But first, I forgot to mention that my Ethernet shield also cant even communicate with the net yet (tested with serial monitor). My apologise.

But I had run a test to troubleshoot my shield, it seems that it is still in good condition. Can communicate with the code below:

//zoomkat 9-22-12
//simple client test
//for use with IDE 1.0.1
//with DNS, DHCP, and Host
//open serial monitor and send an e to test
//for use with W5100 based ethernet shields
//remove SD card if inserted

#include 
#include 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address

char serverName[] = "web.comporium.net"; // zoomkat's test web page server
EthernetClient client;

//////////////////////

void setup(){

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

  Serial.begin(9600); 
  Serial.println("Better client test 9/22/12"); // so I can keep track of what is loaded
  Serial.println("Send an e in serial monitor to test"); // what to do to test
}

void loop(){
  // check for serial input
  if (Serial.available() > 0) //if something in serial buffer
  {
    byte inChar; // sets inChar as a byte
    inChar = Serial.read(); //gets byte from buffer
    if(inChar == 'e') // checks to see byte is an e
    {
      sendGET(); // call sendGET function below when byte is an e
    }
  }  
} 

//////////////////////////

void sendGET() //client function to send/receive GET request data.
{
  if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET /~shb/arduino.txt HTTP/1.1"); //download text
    client.println("Host: web.comporium.net");
    client.println("Connection: close");  //close 1.1 persistent connection  
    client.println(); //end of get request
  } 
  else {
    Serial.println("connection failed"); //error message if no client connect
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //waits for data
  while (client.connected() || client.available()) { //connected or data available
    char c = client.read(); //gets byte from ethernet buffer
    Serial.print(c); //prints byte to serial monitor 
  }

  Serial.println();
  Serial.println("disconnecting.");
  Serial.println("==================");
  Serial.println();
  client.stop(); //stop client

}

I entered the wrong IP address or wrong MAC address perhaps?

But first, I forgot to mention that my Ethernet shield also cant even communicate with the net yet (tested with serial monitor).

The first code you posted is a server. It does not make client requests. I don't know how you know that it can't communicate with the internet.

The second code, that you say works, is a client. So, it is easy to see that it can, or can not, connect to a server.