0
Offline
Jr. Member
Karma: 0
Posts: 74
Arduino rocks
|
 |
« on: November 16, 2011, 08:34:49 pm » |
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
|
|
|
|
« Last Edit: December 07, 2011, 08:12:09 pm by karagos »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #1 on: November 17, 2011, 02:53:02 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 74
Arduino rocks
|
 |
« Reply #3 on: November 17, 2011, 10:33:39 am » |
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("<br>"); }// 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 ///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
« Last Edit: November 18, 2011, 10:42:38 pm by coleoptero »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #4 on: November 17, 2011, 02:50:52 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #5 on: November 18, 2011, 10:17:26 am » |
karagos, vaya currada ... como bien dices lo mejor es hacerlo en un webserver externo. Este fin de semana lo miro y te cuento.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 74
Arduino rocks
|
 |
« Reply #6 on: November 20, 2011, 06:26:40 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 74
Arduino rocks
|
 |
« Reply #7 on: December 07, 2011, 09:54:59 am » |
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(;  ; } } 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?
|
|
|
|
|
Logged
|
|
|
|
|
Spain
Offline
Full Member
Karma: 0
Posts: 149
LED
|
 |
« Reply #8 on: December 07, 2011, 10:02:19 am » |
¿La barra / después de recibe.php tiene que estar? Yo juraría que no, y que debería ser recibe.php?nombre................. 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?
|
|
|
|
|
Logged
|
Arduino Uno (R2fix) / Duemilanove (328p) Ethernet Shield SD (v5)
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 19
|
 |
« Reply #9 on: December 07, 2011, 10:21:51 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Chile
Offline
Newbie
Karma: 0
Posts: 28
El sabio deja de ser sabio cuando cree que lo sabe todo
|
 |
« Reply #10 on: December 08, 2011, 04:57:00 pm » |
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 <VirtualHost> # 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 80En 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:8080Si 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 80Con 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
|
|
|
|
« Last Edit: December 08, 2011, 05:01:47 pm by lordcpu »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #11 on: August 12, 2012, 10:53:28 pm » |
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 ?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 8
|
 |
« Reply #12 on: October 11, 2012, 05:29:20 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 207
|
 |
« Reply #13 on: October 11, 2012, 01:52:02 pm » |
Yo estoy en lo mismo. A ver si entre todos podemos
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 207
|
 |
« Reply #14 on: October 12, 2012, 02:02:34 pm » |
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.
<html> <body>
<form method=get name=LED action="XXXXXXXX"> <input type=checkbox name=L value=1>LED<br> <input type=submit value=submit> </form> </body> </html>
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); }
|
|
|
|
|
Logged
|
|
|
|
|
|