Go Down

Topic: Arduino Data Web Server (Read 35445 times) previous topic - next topic

hari

I've been playing with the Ethernet Shield and created a fairly straightforward code that can be easily modified for your next Ethernet project.  In the demo I used a web browser, but the Arduino Data Web Server would respond equally well when hit by a Windows Application, PHP page, or even an iPhone app.  You can easily support any number of commands and parameters to control the arduino pins, perform calculators, and/or return values back to the web client.  Enjoy!

http://g33k.blogspot.com/2010/09/arduino-data-webserver-sample-web.html

Demo

[media]http://www.youtube.com/v/FK_t6UlJBr8[/media]

Code explained

[media]http://www.youtube.com/watch?v=d_6iieogLbM[/media]

Code explained continued (too long for YouTube)

[media]http://www.youtube.com/watch?v=FKGNCANXGj4[/media]

Code: [Select]
/*
Arduino Data Web Server

Performs actions on Arduino and/or returns data from Arduino to a webbrowser request URL:
 - To turn on LED on pin 8, use web browser to visit your Arduino via: http://x.x.x.x/digitalWrite/7/1
 - To turn it off send: http://x.x.x.x/digitalWrite/7/0
 - To read analog0 value, send: http://x.x.x.x/analogRead/0

IMPORTANT:
Commands are case sensitive, but I wrote this as simple as possible so it can be easily adapted to your needs.  
Have fun!

created Sept 17, 2010
by Hari Wiguna, g33k.blogspot.com
*/

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

// MAC address can be anything that is unique within your network.
// IP is the address the Arduino Ethernet Card would respond to.  It needs to be an unused address within your network.
byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 };
byte ip[] = {192,168,7,12 }; // This is typically 10.0.0.x

Server server(80); // Port 80 is http.

//-- Commands and parameters (sent by browser) --
char cmd[15];    // Nothing magical about 15, increase these if you need longer commands/parameters
char param1[15];
char param2[15];

//-- Sample Ports ---
void SetupSamplePorts()
{
 // To illustrate how to use this, I have an LED and a Potentiometer.
 // The 10K potentiometer left lead is connected to GND, right lead to +5V, and middle lead to Analog 0.
 // The LED cathode is on digital pin 7 and anode is on pin 8.
 pinMode(7,OUTPUT); digitalWrite(7,LOW);  // I use this pin as GND for the LED.
 pinMode(8,OUTPUT); // Sample output, unable to use built-in LED at pin 13 because Ethernet Shield uses pins 10,11,12,13.
}

void setup()
{
 Ethernet.begin(mac, ip);
 server.begin();

 Serial.begin(57600);
 SetupSamplePorts();
}

#define bufferMax 128
int bufferSize;
char buffer[bufferMax];

void loop()
{
 Client client = server.available();
 if (client)
 {
   WaitForRequest(client);
   ParseReceivedRequest();
   PerformRequestedCommands();
   
   client.stop();
 }
}

void WaitForRequest(Client client) // Sets buffer[] and bufferSize
{
 bufferSize = 0;

 while (client.connected()) {
   if (client.available()) {
     char c = client.read();
     if (c == '\n')
       break;
     else
       if (bufferSize < bufferMax)
         buffer[bufferSize++] = c;
       else
         break;
   }
 }
 
 PrintNumber("bufferSize", bufferSize);
}

void ParseReceivedRequest()
{
 Serial.println("in ParseReceivedRequest");
 Serial.println(buffer);
 
 //Received buffer contains "GET /cmd/param1/param2 HTTP/1.1".  Break it up.
 char* slash1;
 char* slash2;
 char* slash3;
 char* space2;
 
 slash1 = strstr(buffer, "/") + 1; // Look for first slash
 slash2 = strstr(slash1, "/") + 1; // second slash
 slash3 = strstr(slash2, "/") + 1; // third slash
 space2 = strstr(slash2, " ") + 1; // space after second slash (in case there is no third slash)
 if (slash3 > space2) slash3=slash2;

 PrintString("slash1",slash1);
 PrintString("slash2",slash2);
 PrintString("slash3",slash3);
 PrintString("space2",space2);
 
 // strncpy does not automatically add terminating zero, but strncat does! So start with blank string and concatenate.
 cmd[0] = 0;
 param1[0] = 0;
 param2[0] = 0;
 strncat(cmd, slash1, slash2-slash1-1);
 strncat(param1, slash2, slash3-slash2-1);
 strncat(param2, slash3, space2-slash3-1);
 
 PrintString("cmd",cmd);
 PrintString("param1",param1);
 PrintString("param2",param2);
}

void PerformRequestedCommands()
{
 if ( strcmp(cmd,"digitalWrite") == 0 ) RemoteDigitalWrite();
 if ( strcmp(cmd,"analogRead") == 0 ) RemoteAnalogRead();
}

void RemoteDigitalWrite()
{
 int ledPin = param1[0] - '0'; // Param1 should be one digit port
 int ledState = param2[0] - '0'; // Param2 should be either 1 or 0
 digitalWrite(ledPin, ledState);

 //-- Send response back to browser --
 server.print("D");
 server.print(ledPin, DEC);
 server.print(" is ");
 server.print( (ledState==1) ? "ON" : "off" );

 //-- Send debug message to serial port --
 Serial.println("RemoteDigitalWrite");
 PrintNumber("ledPin", ledPin);
 PrintNumber("ledState", ledState);
}

void RemoteAnalogRead()
{
 // If desired, use more server.print() to send http header instead of just sending the analog value.
 int analogPin = param1[0] - '0'; // Param1 should be one digit analog port
 int analogValue = analogRead(analogPin);
 
 //-- Send response back to browser --
 server.print("A");
 server.print(analogPin, DEC);
 server.print(" is ");
 server.print(analogValue,DEC);
 
 //-- Send debug message to serial port --
 Serial.println("RemoteAnalogRead");
 PrintNumber("analogPin", analogPin);
 PrintNumber("analogValue", analogValue);
}

void PrintString(char* label, char* str)
{
 Serial.print(label);
 Serial.print("=");
 Serial.println(str);
}

void PrintNumber(char* label, int number)
{
 Serial.print(label);
 Serial.print("=");
 Serial.println(number, DEC);
}


ARDUIX

Hello hari!
Scuse me for my english, but I'm italian!I saw you program, it's very cool!!! I try to do something like your program but i have some probelms! I would like to do a program that send (by a web page), the comands to arduino! simply, I want to send comands with a button to arduino like "switch on or switch off LED", the web page is on a server!!! In past I've done a program that read comands by serial port, now I would like to do the same things  by web server page! I hope you have understand my problem and you could help me!!! Thanks very much!

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