Pages: [1]   Go Down
Author Topic: Arduino Data Web Server  (Read 28604 times)
0 Members and 3 Guests are viewing this topic.
Lincoln, NE
Offline Offline
Full Member
Karma: 0
Posts: 106
Having lots of fun with Arduino. Thanks everyone!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!



Code explained


Code explained continued (too long for YouTube)


 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

 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,

#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);


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

void loop()
  Client client = server.available();
  if (client)

void WaitForRequest(Client client) // Sets buffer[] and bufferSize
  bufferSize = 0;
  while (client.connected()) {
    if (client.available()) {
      char c =;
      if (c == '\n')
        if (bufferSize < bufferMax)
          buffer[bufferSize++] = c;
  PrintNumber("bufferSize", bufferSize);

void ParseReceivedRequest()
  Serial.println("in ParseReceivedRequest");
  //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;

  // 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);

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(ledPin, DEC);
  server.print(" is ");
  server.print( (ledState==1) ? "ON" : "off" );

  //-- Send debug message to serial port --
  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(analogPin, DEC);
  server.print(" is ");
  //-- Send debug message to serial port --
  PrintNumber("analogPin", analogPin);
  PrintNumber("analogValue", analogValue);

void PrintString(char* label, char* str)

void PrintNumber(char* label, int number)
  Serial.println(number, DEC);

Offline Offline
Jr. Member
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

Pages: [1]   Go Up
Jump to: