My Arduino Web Server v2.0

I share with you my Arduino Web Server V2.0 (Closed)
[url removed]

I first debuted my Arduino web server in January of 2011, its been serving you all for months and gained thousands of hits over the course of its service.
Sadly, I retired it after 5 months, it was getting a little old.

Thanks to everyone who provided me with help when I needed it and also to the many people who left comments on the site. XD

Here is the latest code from the site:

/*
 * This is a web server that allows you to host a fully functional html
 *  webpage on the World Wide Web. 
 * Initial coding was done with the help from the many people in the Arduino community. 
 *  Thanks guys!!
 *
 * Arduino Setup: You need an Ethernet Shield SD, and and Arduino. 
 *  Optionally pins 8 and 9 can be used for two LEDs that can indicate traffic.
 *
 * SD Card Setup: On the SD card, which must be formated as fat, you must have 
 *  an HTML file with the file name of 'index.htm'. All file names on this card 
 *  must be written in the old 8.3 file format. In other words, all files must be 
 *  named with no more then 8 characters for the name, and 3 for the extension.
 *
 * Note: If you don't know HTML, a good place that I found useful was w3schools
 *  http://www.w3schools.com/html/html_examples.asp 
 *
 */

#include <LiquidCrystal.h>
#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <Ethernet.h>
#define BUFSIZ 128
#define greenLEDandBEEP 2
#define redLEDpin 3
boolean led2 = true;
int hits = 0; // Set the number of hits the hit counter will start at.
int units = 0;
int count = 0;
int photocellPin = 2;
int photocellReading;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

//Local ethernet setup
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0x1C, 0x0E }; 
byte ip[] = { 
  192, 168, 1, 80 };
char rootFileName[] = "index.htm";
Server server(8080);

//SD card stuff
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
#define error(s) error_P(PSTR(s))
void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup() {
  lcd.begin(16, 2);
  lcd.print("Web Server v2.00");
  lcd.setCursor(0, 1);
  lcd.print("Hits:");

  Serial.begin(9600);

  pinMode(greenLEDandBEEP, OUTPUT);
  pinMode(redLEDpin, OUTPUT);

  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  

  pinMode(10, OUTPUT);              
  digitalWrite(10, HIGH);              

  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");

  if (!volume.init(&card)) error("vol.init failed!");

  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();

  if (!root.openRoot(&volume)) error("openRoot failed");

  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();

  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);

  Serial.println();
  PgmPrintln("Done");

  Ethernet.begin(mac, ip);
  server.begin();
}


void loop()
{
  if(count >=500)
  {  
    led2 = !led2;
    digitalWrite(redLEDpin, led2);
    count = 0;
  }
  count +=1;

  char clientline[BUFSIZ];
  char *filename;
  int image = 0;
  int index = 0;

  Client client = server.available();
  if (client) {
    boolean current_line_is_blank = true;

    index = 0;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ) 
            index = BUFSIZ -1;

          continue;
        }

        clientline[index] = 0;
        filename = 0;

        Serial.println(clientline);

        if (strstr(clientline, "GET / ") != 0) {
          filename = rootFileName;

        } 
        if (strstr(clientline, "GET /") != 0) {
          if (!filename) filename = clientline + 5; 

          (strstr(clientline, " HTTP"))[0] = 0;

          Serial.println(filename);

          if (! file.open(&root, filename, O_READ)) {
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>Error 404</h2>");
            client.println("<s2>The file does not exist.<s2>");
            client.println("");
            break;
          }

          Serial.println("Opened!");
          //File types
          client.println("HTTP/1.1 200 OK");
          if (strstr(filename, ".htm") != 0)
            client.println("Content-Type: text/html");
          else if (strstr(filename, ".css") != 0)
            client.println("Content-Type: text/css");
          else if (strstr(filename, ".png") != 0)
            client.println("Content-Type: image/png");
          else if (strstr(filename, ".jpg") != 0)
            client.println("Content-Type: image/jpeg");
          else if (strstr(filename, ".gif") != 0)
            client.println("Content-Type: image/gif");
          else if (strstr(filename, ".3gp") != 0)
            client.println("Content-Type: video/mpeg");
          else if (strstr(filename, ".pdf") != 0)
            client.println("Content-Type: application/pdf");
          else if (strstr(filename, ".js") != 0)
            client.println("Content-Type: application/x-javascript");
          else if (strstr(filename, ".xml") != 0)
            client.println("Content-Type: application/xml");
          else
            client.println("Content-Type: text");
          client.println();

          int16_t c;
          while ((c = file.read()) >= 0) {
            //Serial.print((char)c); //Prints all HTML code to serial (For debuging)
            client.print((char)c); //Prints all HTML code for web page
          }

          //Hit counter math
          if(units >= 2)
          {
            hits ++;
            units = 0;
          }
          units +=1;
          //End hit counter math

          //Print the hit counters and light value
          lcd.setCursor(6, 1);
          lcd.print(hits); //Print hits for LCD hit counter

          client.print("<html><body>"); //HTML code starts here
          client.print("<P align=\"center\">"); 
          client.print("Hits since reset: <b>");   
          client.print(hits); //Print hits to client
          client.print("</b>
");

          photocellReading = analogRead(photocellPin); 
          client.print("Light reading: "); 
          client.print(photocellReading); //Prints light reading to client

          // A few threshholds
          if (photocellReading < 10) {
            client.print(" - Dark");
          } 
          else if (photocellReading < 200) {
            client.print(" - Dim");
          } 
          else if (photocellReading < 500) {
            client.print(" - Light");
          } 
          else if (photocellReading < 800) {
            client.print(" - Bright");
          } 
          else {
            client.print(" - Very bright");
          }

          client.print("</p></body></html>"); //HTML code ends here
          //End hit counter and light value

          file.close();

        } 
        else {
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>Error 404</h2>");
          client.println("");
        }
        break;
      }
    }
    digitalWrite(greenLEDandBEEP, HIGH);
    delay(1);
    digitalWrite(greenLEDandBEEP, LOW);
    client.stop();
  }

}

//The End /*

The display is a 16x2 LCD with blue EL back light, thats the HV driver board in the upper right corner. The SD card was rerouted out to the front for easy access. There was a later edition too, a photocell, cleverly hidden next to the LCD’s glass frame.

Oh, and if you want to know how I made the case,
arduino.cc/forum/index.php/topic,51138.msg412259.html#msg412259

I have also included a basic HTML site template below.

Sample Site.zip (7.96 KB)

Any successful hacks yet ?

madworm: Any successful hacks yet ?

Nope, not that I'm aware of...

Hi Physics-Dude,

There are multiple webpages and there is even a bitmap file in the webpage. But I don't see any of this code in the .pde. Maybe the code you placed on the website is for another page?

Cheers, K

keff_in_sg: Hi Physics-Dude,

There are multiple webpages and there is even a bitmap file in the webpage. But I don't see any of this code in the .pde. Maybe the code you placed on the website is for another page?

Cheers, K

I'm not sure whats wrong, try refreshing a few times, or try a different web browser like FireFox. Plenty of other people seem to be able access the site just fine, it looks just fine on my end.

website loads and as soon as is finished my firefox tells me "the connection to server was terminated"

hm... too tired to reset cookies and everything, but I usually dont have problems with firefox - maybe there is something on your end you can do, so that people like me, who quickly want to look at some arduino projects before they go to bed and are to lazy to actually think anymore can access the site?

fkeel: website loads and as soon as is finished my firefox tells me "the connection to server was terminated"

hm... too tired to reset cookies and everything, but I usually dont have problems with firefox - maybe there is something on your end you can do, so that people like me, who quickly want to look at some arduino projects before they go to bed and are to lazy to actually think anymore can access the site?

Its not on my end, I too use FireFox and it works just fine. Just refresh if it fails to load.

fkeel >>>

hm... too tired to reset cookies and everything, but I usually dont have problems with firefox - maybe there is something on your end you can do, so that people like me, who quickly want to look at some arduino projects before they go to bed and are to lazy to actually think anymore can access the site?

Did you try ctrl-F5? Website works fine from my end.

dont know what it is. it loads fine, but as soon as everything loads i get an error, telling me the connection to server was terminated. ... reloading was the first (well, and only) thing I tried... anyway, I still get the error. I will try from my university network when I get around to it - maybe its an issue with the internet provider here.

Really cool, nice job!

must have been the internet provider. I am now using a different service and it works fine... cool project :-)

Version 2 is up and running!! XD http://physicsdude.dyndns.tv/

keff_in_sg: Hi Physics-Dude,

There are multiple webpages and there is even a bitmap file in the webpage. But I don't see any of this code in the .pde. Maybe the code you placed on the website is for another page?

Cheers, K

I think that all the data for the website is on the sd card. The code just reads the sd card and passes the data along to the client.

I like the box, can you say a few words on how you made it?

The Arduino: and a number (seen at bottom of the page) increments up on an LCD

I thought about it...

Then read...

The Arduino: (Don't abuse it)

and refrained.

Very neat :)

martin_bg: I like the box, can you say a few words on how you made it?

Ah yes, The box was originally a '2 Port Data Switch Box for Parallel Printer Ports'. Here is what they look like.

After being gutted, I marked a spot for the LCD and then spent some time with my Dremel followed by some careful filing. I then drilled some simple holes for the LEDs and switch. The SD card slot was a later edition, that was just some basic Dremel work too. As for the rear face, the original holes where the parallel ports were fitted were used to my advantage and some minor cuts were made to easily fit in the Arduino and shield. After all holes were cut and drilled, I used some 150 grit sand paper to remove the yellow-ish oxidized paint and make the proper brushed texture. Also, the rings around the LEDs are some fancy washers things I had.

As for the inside, its mostly held in place with plastic standoffs and glue.

Kaouthia:

The Arduino: and a number (seen at bottom of the page) increments up on an LCD

I thought about it...

Then read...

The Arduino: (Don't abuse it)

and refrained.

Very neat :)

Actually, I would LOL. I wouldn't mind it really, unless someone starts going all ]:D ]:D ]:D with it.

Well I get the connection terminated too after it seems to start loading so whats causing that ?

tytower: Well I get the connection terminated too after it seems to start loading so whats causing that ?

Ok, I just changed something in the code that might help. Can you, or someone else who previously had the same problem, please try again and tell me what happens?

Do you think t could support video streaming even with some bad qulity video?

How does the comment thing works? You don't have any php or sql working with the Arduino so i don't see how it could work...