Go Down

Topic: Ethernet PHP control - I want to stay in a loop and check for a new string (Read 1 time) previous topic - next topic

zoomkat

Any reason you are using 192.168.0.177 instead of 192.168.1.177 for the arduino IP address?

Code: [Select]

byte ip[] = {
  192, 168, 0, 177 }; // ip in lan
byte gateway[] = {
  192, 168, 1, 1 }; // internet access via router
byte subnet[] = {
  255, 255, 255, 0 }; //subnet mask
Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   8)

afremont

You are calling checkString() from inside flash(), but then that recursively calls flash() again.  I don't think that's what you want.  Are the other two functions working as you expect?

I don't want to be a jerk, but I think the problem here is the design.  In my opinion, you need to get the arduino to do the flashing for you as a background operation, that way you just turn it on or off same as the other functions.  Don't let that discourage you, because we can probably get it to work without doing that yet by reversing your approach.

Perhaps we could look at the problem from the standpoint that you spend most time flashing the LED and then checking for a client connection each loop.  It's not the best way to do it, but it should work.  You can't really call checkString() unless you have a new string to look at and that only happens when you get a new client connection.  I also notice that you spit back the HTML form before processing the request, this precludes you from sending some feedback to the user about what happened should you later want to.

Save your existing sketch somewhere new, because we are about to perform major surgery on its structure.  It's time to simplify your loop() by calling functions instead of having all that code in it.  Here is some pseudo code for what I'm talking about:

Code: [Select]


loop()
 if(flashing)
    turn on LED
    delay(100)
    turn off LED
    delay(100)
  endif
  checkForClient()
end loop()

checkForClient()
 if(client)
    read request
    handle request
 endif
end checkForClient()


It's not the most responsive way to do it, but it should get the job done.  Client processing will be delayed up to 200mS while the LED is toggled.  Does this make any sense?
Experience, it's what you get when you were expecting something else.

dtokez

Hi afremont, thanks for the advice!

I will have a go at re-structuring the code now and let you know how I get on :)

dtokez

Just trying this out at the moment, does not work though. The LED starts flashing but again after that the arduino does not respond?

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

boolean flashing = false;

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

String readString;


void checkFor(){
  // 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') {

          ///////////////
          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("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.println("<link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' />");
          client.println("<TITLE>Home Automation</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Home Automation</H1>");
          client.println("<hr />");
          client.println("<br />"); 
          client.println("<a href=\"/?flashing\"\">Flashing</a>");     
          client.println("<a href=\"/?lighton\"\">Turn On Light</a>");

          client.println("<a href=\"/?lightoff\"\">Turn Off Light</a><br />");         
          client.println("</BODY>");
          client.println("</HTML>");

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

          ///////////////////// control arduino pin
          if(readString.indexOf("?lighton") >0)//checks for on
          {
            digitalWrite(7, HIGH);    // set pin 4 high
          }
          else if(readString.indexOf("?lightoff") >0)//checks for off
          {
            digitalWrite(7, LOW);    // set pin 4 low
          }
          else if(readString.indexOf("?flashing") >0)
          {
            flashing = true;
          }


          //clearing string for next read
          readString="";
        }
      }
    }
  }


}


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

void setup(){

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

}

void loop(){

  if (flashing == true)
  {
    digitalWrite(7, LOW);
    delay(100);
    digitalWrite(7, HIGH);
    delay(100);
    checkFor();
  }
  checkFor();

}

dtokez

ok, this seems to work finally.

But it seems clunky having to set 'flash = false' on the other if statements, especially when I end up with more animation loops and commands to turn outputs on and off.

Is there a better way to do it?

Code: [Select]
//simple button GET server code to control servo and arduino pin 5
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//use the \ slash to escape the " in the html
//for use with W5100 based ethernet shields
//Powering a servo from the arduino usually DOES NOT WORK.
//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>

boolean flash = false;

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

String readString;

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

void setup(){

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

}

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') {

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

          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("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.println("<link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' />");
          client.println("<TITLE>Home Automation</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Home Automation</H1>");
          client.println("<hr />");
          client.println("<br />");
          client.println("<a href=\"/?flashing\"\">Flashing</a>");
          client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
          client.println("<a href=\"/?lightoff\"\">Turn Off Light</a><br />");       

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

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

          ///////////////////// control arduino pin
          if(readString.indexOf("?lighton") >0)//checks for on
          {
            flash = false;
            digitalWrite(7, HIGH);    // set pin 4 high
          }
          else if(readString.indexOf("?lightoff") >0)//checks for off
          {
            flash = false;
            digitalWrite(7, LOW);    // set pin 4 low
           
          }

          else if(readString.indexOf("?flashing") >0)
          {
            flash = true;
          }

          //clearing string for next read
          readString="";

        }
      }
    }
  }

  if (flash == true)
  {
    digitalWrite(7, HIGH);
    delay(100);
    digitalWrite(7, LOW);
    delay(100);
  }


}

Go Up