Go Down

Topic: My Arduino Web Server v2.0 (Read 28877 times) previous topic - next topic

physics-dude

Feb 05, 2011, 04:38 am Last Edit: May 18, 2011, 08:56 pm by physics-dude Reason: 1
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:
Code: [Select]
/*
* 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><br>");

         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.

madworm

Any successful hacks yet ?
• Upload doesn't work? Do a loop-back test.
• There's absolutely NO excuse for not having an ISP!
• Your AVR needs a brain surgery? Use the online FUSE calculator.
My projects: RGB LED matrix, RGB LED ring, various ATtiny gadgets...
• Microsoft is not the answer. It is the question, and the answer is NO!

physics-dude


Any successful hacks yet ?


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

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

physics-dude


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.

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?
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

physics-dude


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.

karlboll

fkeel >>>

Quote
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.
First we ignore them, then we make fun of them, then we fight them and then they win so let's cut the crap and just expose them for the corrupt liars they are.

fkeel



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.
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

Meinaart


fkeel

must have been the internet provider. I am now using a different service and it works fine... cool project :-)
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/


sciguy


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.
Soundcloud page: http://soundcloud.com/beefinator-2
Youtube channel: http://www.youtube.com/user/beefinator14
Old soundcloud page (ran out o

martin_bg

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

Kaouthia

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


I thought about it...

Then read...

Quote from: The Arduino
(Don't abuse it)


and refrained.

Very neat :)
John

Go Up