Here comes the code!
/*
* Project.: SwitchIt - A Tiny Ethernet Controller
* File....: SwitchIt.ino
* Date....: 2012-07-13
* Author..: Robert N
*/
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <TextFinder.h>
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 100);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
IPAddress mydns(192,168,1,1);
//Array of strings holding Pins status
String status[7] = {
"Av","Av","Av","Av","Av","Av","Av"};
int port = 86;
EthernetServer server(port);
const int inputLength = 25; // length of the file requested *ORIGINAL:16
const int typeLength = 6; // length of GET or POST
char requestTypeString[typeLength]; // what type of request: GET or POST
const int fileStringLength = 25; // length of the file requested *ORIGINAL:16
char fileString[fileStringLength]; // for input from the browser
void setup() {
Serial.begin(9600);
// disable w5100 while setting up SD
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
Serial.println("SwitchIt - A Tiny Ethernet Controller");
Serial.println("---------------------------------------------");
Serial.println("Initializing server!");
Serial.print("Starting SD.... ");
if(!SD.begin(4)) Serial.println("Failed!");
else Serial.println("Ok!");
Ethernet.begin(mac,ip,mydns,gateway,subnet);
digitalWrite(10,HIGH);
/*
* Setup Pins
*/
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
Serial.println("Pins and pinmodes has been set!");
delay(2000);
server.begin();
Serial.println("Server Up and Running");
Serial.print("Ip: ");
Serial.println(Ethernet.localIP());
Serial.print("Subnet: ");
Serial.println(subnet);
Serial.print("Gateway: ");
Serial.println(gateway);
Serial.print("DNS: ");
Serial.println(mydns);
Serial.println("=============================================");
Serial.println("");
}
void loop() {
char inChar = 0; // incoming character from client
int requestType = 0; // what type of request (GET or POST);
int requestedFileLength = 0; // length of the filename they asked for
// listen for incoming clients:
EthernetClient client = server.available();
if (client) {
// make an instance of TextFinder to look for stuff from the client:
TextFinder finder(client );
Serial.print("Client request: ");
while (client.connected()) {
if (client.available()) {
// look for whatever comes before the /. It should be GET or POST:
if(finder.getString("","/", requestTypeString,typeLength)){
// Do something different for GET or POST:
if(String(requestTypeString) == "GET " ) {
requestType = 1;
}
else if(String(requestTypeString) == "POST ") {
requestType = 2;
}
// gather what comes after the / into an array,
// it's the filename the client wants:
requestedFileLength = finder.getString("", " ",fileString, fileStringLength);
if(strcmp(fileString, "") != 0)
{
Serial.println(fileString);
}
else
{
Serial.println("/");
}
// now you're done with the GET/POST line, process what you got:
switch (requestType) {
case 1: // GET
// do nothing with GET except send the file, below
break;
case 2: //POST
Serial.print("POST ");
// skip the rest of the header,
// which ends with newline and carriage return:
finder.find("\n\r");
//Check for I/O PIN POST values
checkPINPOST(finder);
}
Serial.print("Sending response -> ");
// whether it's GET or POST, give them the string they asked for.
// if there's nothing after the /,
// then the client wants the index:
if (requestedFileLength < 2) {
sendFile(client, "index.htm");
}
// otherwise send whatever file they asked for:
else {
sendFile(client, fileString);
}
}
delay(100);
Serial.println("");
client.stop();
}
}
}
}
void sendFile(EthernetClient client, char file[]) {
int i = 0;
char ch;
String outputString = "";
File page = SD.open(file);
if (page) {
sendHttpHeader(client, 200);
while (page.available()) {
ch = (char)page.read();
outputString += ch;
i++;
if(i == 20) {
client.print(outputString);
outputString = "";
i = 0;
}
}
client.print(outputString);
outputString = "";
page.close();
}
else {
sendHttpHeader(client, 404);
}
}
void sendHttpHeader(EthernetClient client, int error) {
client.print("HTTP/1.1 ");
switch(error) {
case 200: // OK
client.println("200 OK");
client.println("Content-Type: text/html");
Serial.println("200 - File sent!");
break;
case 404: // file not found
client.println("404 Not Found");
Serial.println("404 File Not Found!");
break;
}
// response header ends with an extra linefeed:
client.println();
}
/*
* Function to check if any PIN POST values exists
* if so, set POSTed PIN to HIGH or LOW
*/
void checkPINPOST(TextFinder finder) {
int POSTvalue = 0;
int PIN = 0;
//If pin control POST found
if(finder.find("p")) {
PIN = finder.getValue('p');
POSTvalue = finder.getValue('=');
switch(PIN) {
case(2):
if(POSTvalue == 1) {
Serial.println("p2=1");
digitalWrite(2,HIGH);
status[0] = "På";
}
else {
Serial.println("p2=0");
digitalWrite(2,LOW);
status[0] = "Av";
}
break;
case(3):
if(POSTvalue == 1) {
Serial.println("p3=1");
digitalWrite(3,HIGH);
status[1] = "På";
}
else {
Serial.println("p3=0");
digitalWrite(3,LOW);
status[1] = "Av";
}
break;
case(5):
if(POSTvalue == 1) {
Serial.println("p5=1");
digitalWrite(5,HIGH);
status[2] = "På";
}
else {
Serial.println("p5=0");
digitalWrite(5,LOW);
status[2] = "Av";
}
break;
case(6):
if(POSTvalue == 1) {
Serial.println("p6=1");
digitalWrite(6,HIGH);
status[3] = "På";
}
else {
Serial.println("p6=0");
digitalWrite(6,LOW);
status[3] = "Av";
}
break;
case(7):
if(POSTvalue == 1) {
Serial.println("p7=1");
digitalWrite(7,HIGH);
status[4] = "På";
}
else {
Serial.println("p7=0");
digitalWrite(7,LOW);
status[4] = "Av";
}
break;
case(8):
if(POSTvalue == 1) {
Serial.println("p8=1");
digitalWrite(8,HIGH);
status[5] = "På";
}
else {
Serial.println("p8=0");
digitalWrite(8,LOW);
status[5] = "Av";
}
break;
case(9):
if(POSTvalue == 1) {
Serial.println("p9=1");
digitalWrite(9,HIGH);
status[6] = "På";
}
else {
Serial.println("p9=0");
digitalWrite(9,LOW);
status[6] = "Av";
}
break;
}
}
}