Go Down

Topic: Problem Ethernet sheild HTML page (Read 1 time) previous topic - next topic

shanoger

Oct 12, 2013, 06:49 pm Last Edit: Oct 18, 2013, 07:04 am by shanoger Reason: 1
Hi all,
   I am trying to do a very simple LED control using Ethernet shield based on wiznet W5100. The code works fine... some times.... mostly what happens is when i type in the IP address of the shield the page appears instantly some times it takes its sweet time i do power reset and reset then it start to work again. When the page does finally come up, i click on the radio button (on the page displayed by the arduino), the LED lights up and every thing is ok but i i keep playing with it as in press it then after a second press it again (kinda toggle action) the browser just keeps waiting for the response from the server (arduino). All this is connected on a local network. I tried other code but it has the same problems. Any help?

It could also be that I am connected to the router via a switch ?

Code: [Select]
/*--------------------------------------------------------------
 Program:      eth_websrv_LED

 Description:  Arduino web server that serves up a web page
               allowing the user to control an LED
 
 Hardware:     - Arduino Uno and official Arduino Ethernet
                 shield. Should work with other Arduinos and
                 compatible Ethernet shields.
               - LED and resistor in series connected between
                 Arduino pin 2 and GND
               
 Software:     Developed using Arduino 1.0.3 software
               Should be compatible with Arduino 1.0 +
 
 References:   - WebServer example by David A. Mellis and
                 modified by Tom Igoe
               - Ethernet library documentation:
                 http://arduino.cc/en/Reference/Ethernet

 Date:         11 January 2013

 Author:       W.A. Smith, http://startingelectronics.com
--------------------------------------------------------------*/

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

// 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("<!DOCTYPE html>");
                   client.println("<html>");
                   client.println("<head>");
                   client.println("<title>Arduino LED Control</title>");
                   client.println("</head>");
                   client.println("<body>");
                   client.println("<h1>LED</h1>");
                   client.println("<p>Click to switch LED on and off.</p>");
                   client.println("<form method=\"get\">");
                   ProcessCheckbox(client);
                   client.println("</form>");
                   client.println("</body>");
                   client.println("</html>");
                   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("<input type=\"checkbox\" name=\"LED2\" value=\"2\" \
       onclick=\"submit();\" checked>LED2");
   }
   else {              // switch LED off
       digitalWrite(2, LOW);
       // checkbox is unchecked
       cl.println("<input type=\"checkbox\" name=\"LED2\" value=\"2\" \
       onclick=\"submit();\">LED2");
   }
}

SurferTim

Looks like you need to use that serial monitor for some debugging. I added some Serial.println() calls to your loop() code to try to figure out where it is failing. Look for "// add this" in the code.
Code: [Select]
void loop() {
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?

// add this
        Serial.println(F("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) {

// add this
                    Serial.println(F("sending response"));               

                    // 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("<!DOCTYPE html>");
                    client.println("<html>");
                    client.println("<head>");
                    client.println("<title>Arduino LED Control</title>");
                    client.println("</head>");
                    client.println("<body>");
                    client.println("<h1>LED</h1>");
                    client.println("<p>Click to switch LED on and off.</p>");
                    client.println("<form method=\"get\">");
                    ProcessCheckbox(client);
                    client.println("</form>");
                    client.println("</body>");
                    client.println("</html>");
                    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

// add this
        Serial.println(F("disconnected"));

    } // end if (client)
}

When it fails and you have "Client" on the serial monitor but never get a "Sending response", I might be able to help you fix that.

I never use the String data type. It has been known to cause crashes. I use character arrays instead.

I also use the F() function to keep those static strings in program memory instead of loading them into SRAM. I used the F() function on the additions I did to the code. I recommend using that on all the static strings in your code.

Here is my server code. It shouldn't lock up.
http://playground.arduino.cc//Code/WebServerST
Watch for me on National Geographic Wild "When Sharks Attack: Gulf Coast Killers". Airs on June 22nd.

zoomkat

Some simple server code that controls an arduino pin and a servo. You can open the serial monitor to see what the arduino is receiving.

Code: [Select]

//zoomkat 3-1-12
//simple button GET for pin and servo control
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//use the \ slash to escape the " in the html
//address will look like http://192.168.1.102:84 when submited
//for use with W5100 based ethernet shields

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

#include <Servo.h>
Servo myservo;  // create servo object to control a servo

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(84); //server port

String readString;

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

void setup(){

  pinMode(5, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();

  myservo.write(90); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo co
  //enable serial data print
  Serial.begin(9600);
  Serial.println("server LED test 1.0"); // so I can keep track of what is loaded
}

void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string
          readString += c;
          //Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

          ///////////////
          Serial.println(readString); //print to serial monitor for debuging

          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino GET test page</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");

          client.println("<H1>Zoomkat's simple Arduino button</H1>");
         
          client.println("<br><input type=\"button\" value=\"ON\" onmousedown=\"location.href ('/?on');\"/>");
          client.println("<input type=\"button\" value=\"OFF\" onmousedown=\"location.href ('/?off');\"/>");       

          client.println("</BODY>");
          client.println("</HTML>");

          delay(1);
          //stopping client
          client.stop();

          ///////////////////// control arduino pin
          if(readString.indexOf("on") >0)//checks for on
          {
            myservo.write(40);
            digitalWrite(5, HIGH);    // set pin 4 high
            Serial.println("Led On");
          }
          if(readString.indexOf("off") >0)//checks for off
          {
            myservo.write(140);
            digitalWrite(5, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          //clearing string for next read
          readString="";

        }
      }
    }
  }
}

Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

ZenSkunkworx

Keep in mind that every time you connect from a host computer to the arduino over USB, it resets the Arduino. This results in very erratic behavior and created a big headache for us until we discovered THAT little gem. Now we don't use serial at all and the world is round once again. There are a couple of hardware fixes for this "feature", find them w/ Google.

Peace,
Tyler

zoomkat


Keep in mind that every time you connect from a host computer to the arduino over USB, it resets the Arduino.


That only happens when the application on the host computer opens/closes the serial port.
Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy