lunes, 3 de enero de 2011

Server HTMl, con arduino

Bien hola a todos, en las siguientes lineas del dejare un código de como hacer un servido HTML, para controlar leds desde internet.

con este codigo, te permite tener una clave de acceso para poder controla los leds.



#include <Ethernet.h>
#include <SPI.h>
/*
    Simple Ethernet Test

 Arduino server outputs simple text to browser

     The circuit:
     * Arduino Duemilanove
 * Arduino Ethernet shield
 * Basic FTDI breakout 5V
 *LED connected to GND and digital pin 4 via resistor

 By Minde
     http://www.sciencprog.com/
 */

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[]    = {xxx,xxx,xxx,xxx}; // IP address of WiShield
byte gateway[]  = {xxx,xxx,xxx,xxx}; // router or gateway IP address
byte subnet[] = {255,255,255,0};


Server server(80);  //server port
int ledPin = 4;  // LED pin
word Adc = 0;
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag



void Pasword();
void Portada();


void setup(){
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  //Set pin 4 to output
  pinMode(ledPin, OUTPUT);
  //enable serial datada print
  Serial.begin(9600);
}


void loop(){
  // Create a client connection
  Client client = server.available();
  if (client) {
    while (client.connected()){  
      char c = client.read();
      if (readString.length() < 30){
         readString += c;
      }
      Serial.print(c);
      if (c == '\n') {    
        if(readString.trim() == ("GET /?C=1678 HTTP/1.1")){
          //client.println("<h1>Clave Ok</h1>");
          Portada();
       }else{
          //client.println("<h1>Clave Erronea</h1>");
       }    
    
    
       //client.println("HTTP/1.1 200 OK");
       //client.println("Content-Type: text/html");
       client.println();
       client.print("<body style=background-color:#ffffff>");    

       client.println("<h1>Control de Acceso</h1>");      
       client.println("<form method=get name=LED>");
       client.println("<input type=""password"" name=C>");
      
      
       client.println("<input type=submit value=submit></form>");
      

       //clearing string for next read
       readString="";
       //stopping client
       client.stop();      
    }
  }
}
}



void Portada(){
while(1){
  // Create a client connection
  Client client = server.available();
  if (client) {
    while (client.connected()) {      
        // Leemos el ADC
        Lectura_Analoga();      
if (client.available()) {
 char c = client.read();
 //read char by char HTTP request
 if (readString.length() < 30){
   //store characters to string
   readString += c;
 }
 //if HTTP request has ended
 if (c == '\n') {
 
   //controla el on of de los leds
   if(readString.trim() == ("GET /?L=1 HTTP/1.1")){
//led on

LEDON = true;
   }else if(readString.trim() == ("GET /?L=2 HTTP/1.1")){
//led OFF

LEDON = false;
   }

   //color de fondo, blanco
   client.print("<body style=background-color:#ffffff>");

   //visualizamos datos en nuestra pagian
   client.println("<font color='blue' size='5'>Sample data: ");
   client.print(Adc);//lets output some data

   //controlling led via checkbox
   client.println("<h1>Control de Dispositivos</h1>");

   //le damos el nombre al nuestra caja de texto, la llamamos LED, este es el texto que sale al frente de ella
   client.println("<form method=get name=LED>");    
            //le decimos que nuesta caja de texto es una entrada y le asignamos la letra L, para que guade los datos
            client.println("<input type=campo name=L>");
            //client.println("LED");
            //client.println("<br>");
            client.println("<input type=submit value=Ok></form>");

   //printing LED status
   client.println("<hr />");
            client.print("<font size='5'>LED status: ");
          
   if (LEDON){
client.println("<font color='green' size='5'>ON");
digitalWrite(ledPin, HIGH);    // set the LED on
   }else{
                digitalWrite(ledPin, LOW);    // set the LED OFF
       client.println("<font color='grey' size='5'>OFF");      
       client.println("</body></html>");
            }
            client.println("<hr />");
            //clearing string for next read
   readString="";

   //stopping client
   client.stop();
 }
}
      }
    }
  }
}

void Lectura_Analoga(){
 Adc = analogRead(0);
}

9 comentarios:

  1. Excelente aporte, pero tengo una pregunta, es posible hacer mas segura la entrada del usuario a la pagina, no se con un metodo post o algo asi. Pero teniendo siempre la servidor web en el arduino.

    ResponderEliminar
  2. Hola, al compilar el programa me presenta el siguiente error:
    Led_Ethernet.cpp: In function 'void loop()':
    Led_Ethernet:39: error: void value not ignored as it ought to be

    en la linea de código:

    if (readString.trim()==("GET /?Led=On HTTP/1.1"));{digitalWrite(PinLed,HIGH); }


    En realidad estoy usando otro código distinto al que publicaste, pero solo acá encuentro esta misma instrucción, por lo tanto creo que me puedes ayudar.

    Gracias de antemano, espero tu respuesta ;)

    ResponderEliminar
    Respuestas
    1. Hola a todos, perdón por demorarme en contestar. Primero que todo el error que me comentan, se genera si utilizan el compilador arduino-1.0.3, si utilizan el arduino23 no genera ningún error.

      un saludo

      jarain78

      Eliminar
  3. Ola usei o codigo mais ele esta dando erro nao codigo
    if(readString.trim() == 'GET/?pwd="password" HTTP/1.1'){
    o que pode ser??

    ResponderEliminar
    Respuestas
    1. Hola a todos, perdón por demorarme en contestar. Primero que todo el error que me comentan, se genera si utilizan el compilador arduino-1.0.3, si utilizan el arduino23 no genera ningún error.

      un saludo

      jarain78

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Respuestas
    1. la contraseña si no me equivoco es: 1678
      segun el codigo que postea el compañero

      Eliminar
    2. Es correcto, esa es la clave, pero la pueden modificar.

      saludos

      Eliminar