ethernet y metodo get (mas dudas)

hola de nuevo arduinologos.

ya he conseguido controlar el arduino (temperatura y leds) pero al intentar hacer una web mas compleja con varios formularios para cambiar la fecha, horas de encendido y apagado ...... se me queda colgado pues la web ya pesa un poco.
entonces mi proxima parada era crear una web autonoma alojada en un servidor externo con flash php..... algo mas currao.
y que esta interprete lo que le envio desde el arduino a la web, osea que el arduino no crea ninguna web solo manda info.

esto se que se hace con el metodo (get /?nombre=minombre) mas o menos es algo asi.

primero no se como indicarle el archivo con su ruta completa.
ahora mismo tengo montado en el pc un servidor local lo llamo desde arduino con 127.0.0.1 que es el localhost.
el archivo que debe leer la info esta guardado en http:\127.0.0.1/arduino/recibe.php de mi servidor local(creado con appserv que luego lo subire a algun servidor externo.)
lo ideal seria algun manual donde se extendiera un poco como usar este metodo en arduino puesto que lo que hay de la libreria en arduino.cc es muy escueto.
espero haberme explicado y no haber dicho una barbaridad.
un saludo y gracias de nuevo por vuestra ayuda.

edito: si alguien quiere el codigo que tengo echo no tiene mas que pedirlo.para eso estamos jejeje

Karagos a mi me interesa, ese código. Aún estoy con otra cosa, y como dices hay poca información en español al respecto. Y cualquier código funcional es bueno para el estudio.

Gracias de antemano.

Si quieres decirle la ruta completa, pues se la dices :smiley:

get http://127.0.0.1/arduino/recibe.php/?nombre=minombre

Nunca está demás probar cosas, no se va a romper
La razón por la que no hay nada, es por que usa protocolo HTTP cosa que no tiene nada que ver con Arduino y está estandarizado y documentado hasta la saciedad: RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
O como introducción: Protocolo de transferencia de hipertexto - Wikipedia, la enciclopedia libre

hola. aqui esta el codido

lo que hago en el loop es recibir primero la info que me envia la web modificarla en el arduino(encender o apagar un led) despues miro si esta encendio o apagado y lo vuelvo a enviar a la web. espero haberme explicado.

/*
metodo de envio primero un ? para empezar seguido de una letra:
mayuscula es para cualquier cosa y se cierra con $
minusculas es para encender o apagar 0 o 1 ejemplo a1: enciende el "a" a0:apaga el "a"
///////////////////////////
otra opcion de hacer la web es:
igual que envias al buscador google info para buscar enviar la informacion por get a una web y esa web recoje la info y la adapta a la web.
mirar luego este codigo que esta en webclient.pde
*/
#include <Ethernet.h>
#include <SPI.h>
//////////////// temperatura /////////////////
#include <OneWire.h>//libreria temperatura
#include <DallasTemperature.h>//libreria temperatura
#define ONE_WIRE_BUS 36//pin de temperatura 11
OneWire oneWire(ONE_WIRE_BUS);//temperatura
DallasTemperature sensors(&oneWire);// temperatura
float temp;//variable donde guardaremos la temperatura
////////////////////////////// fin temperatura //////////////////
boolean leyendo = false;
//String quees;
char caracter;
String variable("");



////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
  byte ip[] = { 192, 168, 0, 15};   //ip address to assign the arduino
  byte gateway[] = { 192, 168, 0, 1 }; //ip address of the gatewa or router

  //Rarly need to change this
  byte subnet[] = { 255, 255, 255, 0 };

  // if need to change the MAC address (Very Rare)
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

  Server server = Server(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
 sensors.begin();//inicialicia el sensor de temperatura
   //Pins 10,11,12 & 13 are used by the ethernet shield
  pinMode(31, OUTPUT);
  pinMode(9, OUTPUT);
/*digitalWrite(9, HIGH);
delay(5000);
digitalWrite(9, LOW);*/
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
Serial.begin(9600);
}

void loop(){
variable="";
  // listen for incoming clients, and process qequest.
 recibe();// en este void solo guardamos datos en el arduino y despues lo enviamos

//envia();
//prueba();
}
///////////////////////////////////////////// lee de ethernet ////////////////////////
void recibe(){//2
Client client = server.available();
if (client) {//3
 // una peticion http termina con una linea en blanco
 boolean lineaenblanco = true;
 boolean enviacabecera = false;
 while (client.connected()) {//4
      if (client.available()) {//5
            if(!enviacabecera){// si no se a escrito la cabecera la escribe y despues le da valor verdadero para que no vuelva a enviarla
             // escribe la cabecera
             client.println("HTTP/1.1 200 OK");
             client.println("Content-Type: text/html");
             client.println();
             enviacabecera = true;
            }
            caracter = client.read();
///////////////////// desde aqui empieza a leer lo que se manda por get ///////
        if(leyendo && caracter == ' ') leyendo = false;// si leyendo en verdadero y c=" "=(nada) leyendo seria falso y al estar vacio no entra en if(leyendo) osea no imprime nada
        if(caracter == '?') leyendo = true; //buscamos ? para comenzar a leer la info
/////////////////////////////////// AQUI EMPIEZA A COMPARAR LO LEIDO /////
        if(leyendo && variable==""){//6
          caracter= client.read();// este seria la letra de  valor alternativo.// cada vez que usamos este comando leemos un muevo caracter.
         switch (caracter){
            case 'T':
              // temperatura
               //finito si se olvida poner un $ el bucle seria infinito asi que pondiramos un contador maximo de x mara que salga si llega al tope.
               caracter= client.read();// para leer el igual y quitarlo
               do {
                 caracter = client.read();    
                 if (caracter != '

) variable= variable+caracter;// evita que se imprima el caracter del dolar
                if (caracter == '\n') {variable="Error en el envio,No se envio intruccion de cierre($)";break;}
            }while (caracter != '


);
               // una vez que tiene la variable hace lo oportuno
               //client.print("temperatura = ");
               //client.print(variable);
            break;
            case 'H':
           // hghg 
               caracter= client.read();// para leer el igual y quitarlo
            do {
                 caracter = client.read();    
                 if (caracter != '

) variable= variable+caracter;// evita que se imprima el caracter del dolar
                if (caracter == '\n') {variable="Error en el envio,No se envio intruccion de cierre($)";break;}
             }while (caracter != '


);
               // una vez que tiene la variable hace lo oportuno
               //client.print("bombas = ");
               //client.print(variable);
           break;
                   case 'a':
              // bombas

               caracter= client.read();// para leer el igual y quitarlo

               caracter=client.read();// lee si esta encendido o apagado  
              variable=(caracter);
          if (caracter=='0'){digitalWrite(9,LOW);}else if (caracter=='1'){digitalWrite(9,HIGH);}   
            //leyendo=false;
            break;
            case 'b':
           // SUBIDA
               caracter= client.read();// para leer el igual y quitarlo
          caracter=client.read();  
              variable=(caracter);
          if (caracter=='0'){digitalWrite(31,LOW);}else if (caracter=='1'){digitalWrite(31,HIGH);}   
           break;
         }
//delay(2000);
//     client.print("
");
 }// 6 fin de leyend
// \n es nuevalinea y \r retorno o intro \t tabulador
        if (caracter == '\n' && lineaenblanco)  break;
        if (caracter == '\n') {
         lineaenblanco = true;
          }else if (caracter != '\r') {
           lineaenblanco = false;
      }
      } //5
      }//4
 }//3
//////////////////////////////////////////// ENVIANDO //////////////////////////
client.println ("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>Acuarium MarePrime</title></head><body bgcolor=\"#000000\" text=\"#ffffff\">");//body
client.println ("<table width=\"300\" align=\"center\" cellspacing=\"5\"><tr><td colspan=\"2\" align=\"center\" valign=\"middle\">ON/OFF</td><td align=\"center\" valign=\"middle\">TEMPERATURA ACUARIO</td></tr>");// prmera linea de la tabla
client.println("<tr><td width=\"85\" align=\"center\" valign=\"middle\">Calentador</td><td width=\"44\" align=\"center\" valign=\"middle\">");//segunda linea de la tabla hasta el boton
// aqui va el from
if (digitalRead(9)==HIGH){ // si el 30 es high
client.println("<form METHOD=get action=\"http://192.168.0.15/\"><input type=hidden name=a value=0><input type=\"image\" src=\"http://i945.photobucket.com/albums/ad295/karagos/on.jpg\"></form>");
}else if (digitalRead(9)==LOW){// si es low
client.println("<form METHOD=get action=\"http://192.168.0.15/\"><input type=hidden name=a value=1><input type=\"image\" src=\"http://i945.photobucket.com/albums/ad295/karagos/off.jpg\"></form>");
}// fin del from
client.println("</td><td align=\"center\" valign=\"middle\">");
sensors.requestTemperatures();
temp=sensors.getTempCByIndex(1);//guardamos la temperatura
client.println (temp);client.println(" ºC");
// aqui va la temperatura 26.60
client.print("</td></tr></table></body></html>");// cierra las tablas y el body y html
/////////////////////////////// FIN DE ENVIANDO //////////////////////


delay (50);
  client.stop();

} //2
///////////////////////////////////////////////////////////////////////////////////////////////////////

gracias chiva!!!

estoy muy liado con pruebas, y esprimiendo la GRAN LIBRERÍA DE IGOR "FSM" que la voy a utilizar para casi todo. adaptando mi código a esta librería y si obtengo más información sobre ethernet mejor que mejor, ya haré pruebas con ethernet más adelante.

gracias karagos me lo guardo y lo estudio

karagos, vaya currada ... como bien dices lo mejor es hacerlo en un webserver externo. Este fin de semana lo miro y te cuento.

hola.
gracias chiva de nuevo perdona por mi torpeza pero no sabia como buscar la informacion y gracias a tu ayuda he buscado esto "hypertext protocolo de transferencia" en sangoogle y mañana lo estudiare. gracias
flico: espero que te sea de ayuda.... ese codigo esta muy simplificado pero de ahi puedes sacar mucho.

un saludo.

hola arduinologos.
estoy atascado y no se como seguir.
bien:
le envio a una web por el metodo get unas variables para que la web las interprete.
client.println("GET http://127.0.0.1/arduino/recibe.php/?nombre=minombre HTTP/1.0");
pero cuando cargo la pagina recibe.php no hay cambio incluso teniedola activa y reiniciando el arduino no pasas nada.
que hago mal?
os pongo el codigo

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,15 };
byte server[] = { 127,0,0,1 }; // localhost

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
// start the Ethernet connection:
Ethernet.begin(mac, ip);
// start the serial library:
Serial.begin(9600);
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.println("connecting...");

// if you get a connection, report back via serial:
if (client.connect()) {
Serial.println("connected");
// Make a HTTP request:
client.println("GET http://127.0.0.1/arduacuario/recibe.php/?nombre=minombre HTTP/1.0");
client.println();
}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
}
}

void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if (client.available()) {
char c = client.read();
Serial.print(c);
}

// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();

// do nothing forevermore:
for(;:wink:
;
}
}

otra cosa aparte tenia echa la web desde el arduino yo todo funcionaba bien(desde la red de casa) pero el problema es que cuando intentas entrar desde otro lugar no funciona pues no son la misma ip publica que privada hay alguna manera para que el arduino detecte desde que ip te conectas para actuar en consecuencia?

karagos:
client.println("GET http://127.0.0.1/arduino/recibe.php/?nombre=minombre HTTP/1.0");

¿La barra / después de recibe.php tiene que estar? Yo juraría que no, y que debería ser recibe.php?nombre.................

karagos:
byte server[] = { 127,0,0,1 }; // localhost

Eso para mi no tiene sentido. 127.0.0.1 es la propia IP de cada dispositivo de red. ¿Quién dices que es el servidor?

hay alguna manera para que el arduino detecte desde que ip te conectas para actuar en consecuencia?
[/quote]

Para poder tener visión desde internet de un servidor alojado en una dirección de intanet, tienes que configurar el router para que haga NAT (en cada modelo se hace de modo diferente).
Despues en el navegador tienes que poner tu IP publica que salvo raras ocasiones, será dinamica y cambiara si apagas y enciendes el router.

Saludos

hola amigo, tratare de ayudarte...

Dependiendo de como tengas instalado el servidor Web Apache en tu sistema debes buscar el archivo de configuracion del servidor el cual se llama: "httpd.conf", en mi caso yo utilizo el programa Easy PHP y se encuentra en la siguiente ruta: "C:\Archivos de programa\EasyPHP-5.3.3.1\apache\conf", reitero que esto es en mi caso, en tu maquina puede ser diferente dependiendo del modo que este instalado el servidor Web Apache, una vez encontrado este archivo debes editarlo con el "Block de Notas" y debes buscar la siguiente configuracion que esta casi al principio del archivo:

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80

En esta seccion podremos configurar en que direccion IP y puerto escucha nuestro servidor Apache, Ej:

Con la siguiente configuracion le estamos indicando que solo debe aceptar conexiones entrantes desde nuestro PC en modo local y que escuche por el puerto 8080:

Listen 127.0.0.1:8080

Si queremos que el servidor acepte conexiones entrantes desde cualquier direccion IP y que escuche por el puerto 80 debemos configurarlo de la siguiente manera:

Listen 80

Con lo anterior configuras al servidor para que acepte peticiones desde cualquier IP incluso desde Internet, una vez hecho esto en la parte del codigo de Arduino donde especificas la direccion IP del servidor Web Apache (en este caso tu PC), debes de colocar la IP local de tu maquina:

Puedes averiguar la direccion IP de tu PC con el comando "ipconfig" en la consola de MS-DOS

Ej. en tu codigo Arduino suponiendo que la direccion IP de tu pc es la 192.168.0.2:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,15 };
byte server[] = { 192.168,0,2 }; // Direccion IP del servidor Web Apache

Una vez hecho esto en la llamada al metodo GET debe quedarte de la siguiente manera en tu codigo:

client.println("GET http://192.168.0.2/arduino/recibe.php?nombre=minombre HTTP/1.0");

Para que te quede mas claro el formato de la llamada es de la siguiente manera:

"GET http://ip_del_servidor_apache/archivo_que_procesa_los_datos.php?nombre_variable=valor_variable HTTP/1.0"

en el caso que quieras pasar mas de una variable solo debes separarlas con el simbolo "&"

"GET http://ip_del_servidor_apache/archivo_que_procesa_los_datos.php?nombre_variable1=valor_variable1&nombre_variable2=valor_variable2 HTTP/1.0"

recuerda que una peticion HTTP debe terminar con una linea en blanco por lo que a posterior de la instruccion que hace la peticion con GET debes hacer un client.println(); (en tu codigo veo que esta correcto)

por favor cuentame como te fue

Saludos
Luis Fuentes
Santiago de Chile

Hola a todos, yo estoy haciendo algo similar a lo que karagos esta haciendo, pero yo quiero enviar un archivo con extensión ".txt" a un servidor externo.

Saben como hacerlo? Como se especifica el archivo y la ubicación que esta dentro de la SD, para que el arduino lo envie al servidor ?

Karagos, yo quiero hacer algo parecido a lo que tu estas trabajando y creo que ademas sobre el mismo tema: Un acuario.

¿podemos ponernos en contacto para tratar de solventar dudas?

Un saludo y enhorabuena por tu proyecto.

Yo estoy en lo mismo. A ver si entre todos podemos

He avanzado y creo que no poco, os pego el código:
Este es el formulario en html que esta en el servidor, las XXX corresponden a la ip publica seguida del puerto que previamente hemos redireccionado en nuestro router hacia la ip interna asignada a arduino.

LED

código de arduino, hay mas pero solo os pongo la comprobación con la cual enciende el led:

if(readString == ("GET /?L=1 HTTP/1.1") )
{
digitalWrite(ledPin, HIGH);
}

Jossema106:
He avanzado y creo que no poco, os pego el código:
Este es el formulario en html que esta en el servidor, las XXX corresponden a la ip publica seguida del puerto que previamente hemos redireccionado en nuestro router hacia la ip interna asignada a arduino.

LED

código de arduino, hay mas pero solo os pongo la comprobación con la cual enciende el led:

if(readString == ("GET /?L=1 HTTP/1.1") )
{
digitalWrite(ledPin, HIGH);
}

¿Podrías compartir lo anterior entero?(para que funcione )
Gracias.

Ok en canto tenga tiempo te lo oongo

:wink:

PascuaL:

Jossema106:
He avanzado y creo que no poco, os pego el código:
Este es el formulario en html que esta en el servidor, las XXX corresponden a la ip publica seguida del puerto que previamente hemos redireccionado en nuestro router hacia la ip interna asignada a arduino.

LED

código de arduino, hay mas pero solo os pongo la comprobación con la cual enciende el led:

if(readString == ("GET /?L=1 HTTP/1.1") )
{
digitalWrite(ledPin, HIGH);
}

¿Podrías compartir lo anterior entero?(para que funcione )
Gracias.

#include <EthernetUdp.h>

#include <Ethernet.h>
#include <SPI.h>

//internet

byte mac[] = {yyyy, yyyy, yyyy, yyyy, yyyy, yyyy }; //physical mac address
byte ip[] = {192, 168, 1, 33 }; // ip in lan
byte gateway[] = {192, 168, 1, 254 }; // internet access via router
byte subnet[] = {255, 255, 255, 0 }; //subnet mask
EthernetServer server(5675); //server port
byte sampledata=50; //some sample data - outputs 2 (ascii = 50 DEC) ç

//pines
int ledPin = 7; // LED pin
int relayPin = 2; // PIN al que va conectado el relé
int pinTemperatura = 0; // Damos un nombre al pin de la temp

//variables
String readString = String(30); //string for fetching data from address
int tempValor ; // La variable donde guardaremos la temperatura
char url[100];
char meta[200] ;

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

Serial.begin(9600);

}

void loop(){

digitalWrite(relayPin, HIGH); // ENCENDIDO
delay(1000);
digitalWrite(relayPin, LOW); // APAGADO
delay(1000);

tempValor = ( 5.0 * analogRead(pinTemperatura) * 100.0) / 1024.0;

// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 30)
{
//store characters to string
readString += c;
}
//output chars to serial port

//if HTTP request has ended
if (c == '\n') {
//lets check if LED should be lighted
readString.trim();
if(readString == ("GET /?L=1 HTTP/1.1") )
{
//led has to be turned ON
digitalWrite(ledPin, HIGH); // set the LED on

//redireccionar a la web
client.println("HTTP/1.1 200 OK");
client.println("");
client.println("Content-Type: text/html");
client.println();
client.println("");
client.println("");

}
else{
//led has to be turned OFF
digitalWrite(ledPin, LOW); // set the LED OFF

//redireccionar a la web
client.println("HTTP/1.1 200 OK");
client.println("");
client.println("Content-Type: text/html");
client.println();
client.println("<meta http-equiv='Refresh' content='0;url=XXXX>");
client.println("");
}

if(readString == ("GET /?T=1 HTTP/1.1") )
{

//CONSTRUIMOS LA URL PARA LA REDIRECCION
sprintf(url, "XXXX?temp=%d", tempValor);
sprintf(meta, "", url);

client.println("HTTP/1.1 200 OK");
client.println("");
client.println("Content-Type: text/html");
client.println();
client.println(meta);
client.println("");
}

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

las xxx corresponde a la url a la que lo envias y las yyy a la mac de tu tarjeta

+1 muchas gracias :wink: