Go Down

Topic: Read values from webpage to control relay (Ethernet Shield) (Read 5 times) previous topic - next topic

George-Xrik

I finally got some time to continue this project.

Picking up where I left off, the following code is working fine. With one exception when I click the on or off button using google chrome as the browser it only blinks off the led and the turns the led back on. So if anyone knows why this is happening I would be happy to learn about it, but for now I will use explorer and safari as browser when communicating with arduino.

Also if anyone know about a good tutorial on ethernet syntax would be much appreciated.

Code: [Select]
//George-Xrik 31-03-12, updated
//zoomkat 12-08-11, combined client and server
//simple button GET with iframe code
//for use with IDE 1.0
//open serial monitor and send an g to test client and
//see what the arduino client/server receives
//web page buttons make pin 4 high/low
//use the \ slash to escape the " in the html
//address will look like http://192.168.1.177 or http://88.203.15.76 when submited
//for use with W5100 based ethernet shields

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
IPAddress ip(192,168,2,130); // ip in lan
IPAddress gateway(192,168,2,1); // internet access via router
IPAddress subnet(255,255,255,0); //subnet mask
IPAddress myserver(208,104,2,86); // zoomkat web page
EthernetServer server(80); //server port
EthernetClient client;
String readString;

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

void setup(){

  pinMode(8, OUTPUT); //pin selected to control
  Ethernet.begin(mac, ip, subnet, gateway);
  server.begin();
  Serial.begin(9600);
  Serial.println("server/client 1.0 test 31/03/12"); // keep track of what is loaded
  Serial.println("Send g in serial monitor to test client"); // what to do to test client
}

void loop(){
  // check for serial input
  if (Serial.available() > 0)
  {
    byte inChar;
    inChar = Serial.read();
    if(inChar == 'g')
    {
      sendGET(); // call sendGET function
    }
  } 

  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

            //now output HTML data header
          if(readString.indexOf('?') >=0) { //don't send new page
            client.println("HTTP/1.1 204 Zoomkat");
            client.println();
            client.println(); 
          }
          else {
            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 1.0 button</H1>");
            client.println("<H1>George's simple Arduino 1.0 button</H1>");

            client.println("<a href=\"/?on\" target=\"inlineframe\">ON</a>");
            client.println("<a href=\"/?off\" target=\"inlineframe\">OFF</a>");

            //client.println("<IFRAME name=inlineframe src=\"res://D:/WINDOWS/dnserror.htm\" width=1 height=1\">");
            client.println("<IFRAME name=inlineframe style=\"display:none\" >");         
            client.println("</IFRAME>");

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

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

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

        }
      }
    }
  }
}

//////////////////////////
void sendGET() //client function to send/receie GET request data.
{
  if (client.connect(myserver, 80)) {
    Serial.println("connected");
    client.println("GET /~shb/arduino.txt HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("connection failed");
    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();
    Serial.print(c);
  }

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

}


the following is the serial communication
server/client 1.0 test 31/03/12
Send g in serial monitor to test client
connected
HTTP/1.1 200 OK
Date: Sat, 28 Apr 2012 15:03:54 GMT
Server: Apache
Last-Modified: Sat, 13 Nov 2010 16:31:40 GMT
Accept-Ranges: bytes
Content-Length: 51
Connection: close
Content-Type: text/plain; charset=UTF-8

Woohoo! Your arduino ethernet client works!
zoomkat
disconnecting.
==================

GET /?on HTTP/1.1 >>> from Safari (iphone)

Led On
GET /?off HTTP/1.1

Led Off
GET /?on HTTP/1.1

Led On
GET /?off HTTP/1.1

Led Off
GET /?on HTTP/1.1

Led On
GET /favicon.ico HTTP/1.1

Led On
GET /?off HTTP/1.1

Led Off
GET /favicon.ico HTTP/1.1

Led On



George-Xrik

I finally got some time to continue this project.

Picking up where I left off, the following code is working fine. With one exception when I click the on or off button using google chrome as the browser it only blinks off the led and the turns the led back on. So if anyone knows why this is happening I would be happy to learn about it, but for now I will use explorer and safari as browser when communicating with arduino.

Also if anyone know about a good tutorial on ethernet syntax would be much appreciated.

Code: [Select]
//George-Xrik 31-03-12, updated
//zoomkat 12-08-11, combined client and server
//simple button GET with iframe code
//for use with IDE 1.0
//open serial monitor and send an g to test client and
//see what the arduino client/server receives
//web page buttons make pin 4 high/low
//use the \ slash to escape the " in the html
//address will look like http://192.168.1.177 or http://88.203.15.76 when submited
//for use with W5100 based ethernet shields

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
IPAddress ip(192,168,2,130); // ip in lan
IPAddress gateway(192,168,2,1); // internet access via router
IPAddress subnet(255,255,255,0); //subnet mask
IPAddress myserver(208,104,2,86); // zoomkat web page
EthernetServer server(80); //server port
EthernetClient client;
String readString;

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

void setup(){

  pinMode(8, OUTPUT); //pin selected to control
  Ethernet.begin(mac, ip, subnet, gateway);
  server.begin();
  Serial.begin(9600);
  Serial.println("server/client 1.0 test 31/03/12"); // keep track of what is loaded
  Serial.println("Send g in serial monitor to test client"); // what to do to test client
}

void loop(){
  // check for serial input
  if (Serial.available() > 0)
  {
    byte inChar;
    inChar = Serial.read();
    if(inChar == 'g')
    {
      sendGET(); // call sendGET function
    }
  } 

  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

            //now output HTML data header
          if(readString.indexOf('?') >=0) { //don't send new page
            client.println("HTTP/1.1 204 Zoomkat");
            client.println();
            client.println(); 
          }
          else {
            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 1.0 button</H1>");
            client.println("<H1>George's simple Arduino 1.0 button</H1>");

            client.println("<a href=\"/?on\" target=\"inlineframe\">ON</a>");
            client.println("<a href=\"/?off\" target=\"inlineframe\">OFF</a>");

            //client.println("<IFRAME name=inlineframe src=\"res://D:/WINDOWS/dnserror.htm\" width=1 height=1\">");
            client.println("<IFRAME name=inlineframe style=\"display:none\" >");         
            client.println("</IFRAME>");

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

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

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

        }
      }
    }
  }
}

//////////////////////////
void sendGET() //client function to send/receie GET request data.
{
  if (client.connect(myserver, 80)) {
    Serial.println("connected");
    client.println("GET /~shb/arduino.txt HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("connection failed");
    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();
    Serial.print(c);
  }

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

}


the following is the serial communication
server/client 1.0 test 31/03/12
Send g in serial monitor to test client
connected
HTTP/1.1 200 OK
Date: Sat, 28 Apr 2012 15:03:54 GMT
Server: Apache
Last-Modified: Sat, 13 Nov 2010 16:31:40 GMT
Accept-Ranges: bytes
Content-Length: 51
Connection: close
Content-Type: text/plain; charset=UTF-8

Woohoo! Your arduino ethernet client works!
zoomkat
disconnecting.
==================

GET /?on HTTP/1.1                 >>> from Safari (iphone)

Led On                                  >>> from Safari (iphone)
GET /?off HTTP/1.1                >>> from Safari (iphone)

Led Off                                 >>> from Safari (iphone)
GET /?on HTTP/1.1                 >>> from explorer

Led On                                  >>> from explorer
GET /?off HTTP/1.1                >>> from explorer

Led Off                                 >>> from explorer
GET /?on HTTP/1.1                 >>> from chrome

Led On                                 >>> from chrome
GET /favicon.ico HTTP/1.1     >>> from chrome

Led On                                >>> from chrome
GET /?off HTTP/1.1              >>> from chrome

Led Off                               >>> from chrome
GET /favicon.ico HTTP/1.1     >>> from chrome

Led On                                >>> from chrome


What should be noted is that i only click on and than off once on each browser, chrome acts strangely and turns the led back on.

zoomkat

#12
Apr 28, 2012, 07:47 pm Last Edit: Apr 29, 2012, 12:12 am by zoomkat Reason: 1
Quote
With one exception when I click the on or off button using google chrome as the browser it only blinks off the led and the turns the led back on. So if anyone knows why this is happening I would be happy to learn about it, but for now I will use explorer and safari as browser when communicating with arduino.


Sounds like chrome is being non compliant with the returned 204 status code. 204 tells the browser to not refresh the currrent page. Looks like chrome is refreshing orreloading a prevous page instead of doing nothing. The below code refreshes the current page and doesn't have te 204 code included.


Code: [Select]

//zoomkat 2-13-12
//DNS and DHCP-based web client test code
//for use with IDE 1.0
//open serial monitor and send an e to test
//and to see test result
//for use with W5100 based ethernet shields
//browser equivelant URL:
// http://web.comporium.net/~shb/arduino.txt
//note that the below bug fix may be required
// http://code.google.com/p/arduino/issues/detail?id=605

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
char serverName[] = "www.ahaw.allalla.com"; // zoomkat's test web page server
EthernetClient client;

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

void setup(){
  Serial.begin(9600);
  Serial.println("DNS and DHCP-based web client test 2/13/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
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    while(true);
  }
  // print your local IP address:
  Serial.print("Arduino IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();
  Serial.println();
}

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");
    //test GET request
    client.println("GET /dataterima.xml HTTP/1.0"); //download text
    //client.println("GET /terimaphp.php?trua=0ff1001 HTTP/1.0"); //download text
    client.println("Host: www.ahaw.allalla.com");
    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

}

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   8)

George-Xrik

thanks for the reply

Quote
The below code refreshes the current page and doesn't have te 204 code included.


which part would be the 204 code, that I have to eliminate ?

zoomkat


thanks for the reply

Quote
The below code refreshes the current page and doesn't have te 204 code included.


which part would be the 204 code, that I have to eliminate ?


Perhaps the part that is not included.  8)
Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   8)

Go Up