variable $b : $b"; ?> variable $a : 23 variable $b : 56 CLOSED Lo que recibimos es la respuesta del servidor, en donde se observa el encabezado http y el HTML de la página web de respuesta. Notar que al final recibimos un CLOSED esto indica que se ha cerrado la conexión con el servidor.
Este código esta subido en un servidor, y es el servidor el que ejecuta el código PHP y realiza las acciones programadas que en este caso es una simple respuesta HTML en donde podemos ver los datos que ha recibidos. En el código de la página que está subida en el servidor se puede programar para que se conecte a una base de datos y subir las variables, descargar información o haga cualquier otra acción, pero esto dependerá de su necesidad y de sus habilidades como desarrollador web. Pueden usar esta misma página para desarrollar el tutorial o programar y subir su propia página a un servidor. http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
5/22
16/7/2017
Arduino y ESP8266 como cliente web
Ahora nosotros aremos lo mismo pero en lugar de hacerlo desde el navegador lo trabajaremos desde nuestro ESP8266.
1. Conexiones entre ESP8266 y Arduino: Para conectar nuestro ESP8266 usaremos un protoboard para ayudarnos con el cableado, los nombres de los pines no están impresos en la PCB pero pueden revisarlos en la siguientes imagen: Pinout módulo ESP8266 ESP8266
Arduino
TX
D10
CH_PD
3V3
RST
No conectado
3.3V
3V3
GND
GND
GPIO2
No conectado
GPIO0
No conectado
RX
D11 (Usando resistencias)
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
6/22
16/7/2017
Arduino y ESP8266 como cliente web
El ESP8266 funciona con 3.3V, por eso en el pin TX del Arduino se recomienda usar resistencias para generar una caída de voltaje, el valor de las resistencias no necesariamente tienen que ser 1K y 2K, pueden usar las resistencias que tengan a la mano pero estas deben tener una relación de 1:2, al usar esas resistencias se forma una divisor de voltaje y el nivel de 5V del TX del Arduino se convierte en un nivel 3.3V. En el caso del RX no es necesario, puesto que el ESP8266 envía a ese pin niveles de 3.3V niveles que el Arduino los considera 1 lógicos.
2. Realizando consultas al servidor usando comandos AT: Antes de implementar en nuestro Arduino el cliente web, primero revisaremos la secuencia de comandos AT que debemos ejecutar para realizar dicha acción. Para poder enviar los comandos AT cargamos en nuestro Arduino el siguiente programa: #include
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
7/22
16/7/2017
Arduino y ESP8266 como cliente web
}
Este programa solo es un repetidor serial todos los datos que envía el ESP8266 se transmiten a la PC y los que se envían desde la PC se envían al ESP8266 Después de cargar el programa, abrimos el monitor serial y verificamos que nuestro monitor serial esté a la velocidad de 9600 y tenga seleccionado la opción “ambos NL & CR”, seguidamente empezamos a enviar los comandos AT: Test de comando AT Enviamos: AT Recibimos: OK
Si no recibimos una respuesta, puede ser que nuestro ESP8266 está configurado a una velocidad diferente a la programada: para esto debemos cambiar la siguiente línea de código y volver a cargar: SerialESP8266.begin(115200);
Ahora nuevamente repetimos el comando y debemos de obtener la respuesta:
Cambiar la velocidad de transmisión serial
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
8/22
16/7/2017
Arduino y ESP8266 como cliente web
Si la velocidad de transmisión de su ESP8266 es de 115200 tenemos que cambiarla a una velocidad de 9600, esto porque en nuestro arduino trabajamos con SoftwareSerial, y con 115200 estaríamos en el límite de velocidad que soporta el SoftwareSerial y podrían perderse algunos caracteres. Si su ESP8266 trabaja a la velocidad de 9600 ya no realizar este paso. Para cambiar de velocidad usamos el siguiente comando AT: Enviamos: AT+UART_DEF=9600,8,1,0,0 Recibimos: AT+UART_DEF=9600,8,1,0,0 OK Donde 9600 es la velocidad, los demás datos son otras configuraciones de la comunicación. Seguidamente de hacer esto no podremos enviar más comandos puesto que se ha cambiado a la nueva velocidad, tendremos que reprogramar nuestro arduino con la velocidad de 9600, para esto nuevamente cambiar la velocidad en la siguiente línea de código: SerialESP8266.begin(9600);
Después, de cargar ahora con la nueva velocidad, debemos de enviar AT y esperar a que nos responda con un OK, de esta forma confirmamos que la velocidad ha sido cambiada correctamente. Todo el proceso que hemos hecho solo se hace una solo vez, posteriormente así se apague nuestro ESP8266 la velocidad configurada se mantendrá. Configurado el Modo del Wifi: Trabajaremos en modo estación, es decir nos conectaremos a una red ya existente: Enviamos: AT+CWMODE=1 Recibimos: AT+CWMODE=1 OK http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
9/22
16/7/2017
Arduino y ESP8266 como cliente web
Conectarse a una red Wifi Nos conectaremos a la red cuyo nombre es: Naylamp , y su respectivo password es: hail_hydra Enviamos: AT+CWJAP="Naylamp","hail_hydra" Recibimos: AV+CWJAP="Naylamp","hail_hydra" WIFI CONNDCTED WIFI GOT IP
OK La respuesta nos confirma que ya estamos conectados a la red wifi Deshabilitamos las conexiones múltiples: Debido a que vamos a trabajar como cliente web, deshabilitamos las conexiones múltiples, que generalmente se utilizan cunado trabajamos como servidor: Enviamos: AT+CIPMUX=0 Recibimos: AT+CIPMUX=0 OK Conectarnos con el servidor: Enviamos: AT+CIPSTART="TCP","www.aprende-web.net",80 Recibimos: CONNECT
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
10/22
16/7/2017
Arduino y ESP8266 como cliente web
Al hacer esto iniciamos la conexión como cliente, y se especifica el tipo de conexión (TCP), el servidor (www.aprende-web.net) y el puerto (80), Enviar el tamaño de la petición HTTP Antes de enviar la petición HTTP, es necesario especiar el tamaño en caracteres de la petición: Enviamos: AT+CIPSEND=83 Recibimos: AT+CIPSEND=83 OK > Cuando recibimos “>” significa que ya podemos enviar la petición HTTP. Enviar petición HTTP Después de recibir “>” el ESP espera la petición del tamaño indicado para que posteriormente lo envié, para esto enviamos línea por línea la siguiente petición Enviamos GET /php/ejemplos/ej10destino.php?a=23&b=56 HTTP/1.1(Enter o Enviar) Host: www.aprende-web.net(Enter o Enviar) (Enter o Enviar) Recibimos: Recv 83 bytes
SEND OK
+IPD,463:HTTP/1.1 200 OK Date: Tue, 23 Aug 2016 19:22:56 GMT Server: Apache X-Powered-By: PHP/5.3.29 Content-Length: 319 Content-Type: text/html http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
11/22
16/7/2017
Arduino y ESP8266 como cliente web
Al abrir esta página se han pasado las siguientes variables:
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
12/22
16/7/2017
Arduino y ESP8266 como cliente web
3. Arduino como cliente web usando ESP8266: Ahora vamos programar en un sketch que enviará los comandos AT los cuales se enviaron manualmente en el ejemplo anterior: El código es el siguiente: #include
13/22
16/7/2017
Arduino y ESP8266 como cliente web
//Verificamos si el ESP8266 responde SerialESP8266.println("AT"); if(SerialESP8266.find("OK")) Serial.println("Respuesta AT correcto"); else Serial.println("Error en ESP8266"); //-----Configuración de red-------//Podemos comentar si el ESP ya está configurado //ESP8266 en modo estación (nos conectaremos a una red existente) SerialESP8266.println("AT+CWMODE=1"); if(SerialESP8266.find("OK")) Serial.println("ESP8266 en modo Estacion"); //Nos conectamos a una red wifi SerialESP8266.println("AT+CWJAP=\"nombre_red\",\"contraseña\""); Serial.println("Conectandose a la red ..."); SerialESP8266.setTimeout(10000); //Aumentar si demora la conexion if(SerialESP8266.find("OK")) Serial.println("WIFI conectado"); else Serial.println("Error al conectarse en la red"); SerialESP8266.setTimeout(2000); //Desabilitamos las conexiones multiples SerialESP8266.println("AT+CIPMUX=0"); if(SerialESP8266.find("OK")) Serial.println("Multiconexiones deshabilitadas"); //------fin de configuracion------------------delay(1000); }
void loop() { //--- programa---------------------variable1=analogRead(A0); variable2=3.14; //otras operaciones // . . .
//---------enviamos las variables al servidor--------------------//Nos conectamos con el servidor: SerialESP8266.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80"); if( SerialESP8266.find("OK")) { Serial.println(); Serial.println(); Serial.println(); Serial.println("ESP8266 conectado con el servidor..."); //Armamos el encabezado de la peticion http String peticionHTTP= "GET /php/ejemplos/ej10destino.php?a="; peticionHTTP=peticionHTTP+String(variable1)+"&b="+String(variable2)+" HTTP/1.1\r\n"; http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
14/22
16/7/2017
Arduino y ESP8266 como cliente web
peticionHTTP=peticionHTTP+"Host: www.aprende-web.net\r\n\r\n"; //Enviamos el tamaño en caracteres de la peticion http: SerialESP8266.print("AT+CIPSEND="); SerialESP8266.println(peticionHTTP.length()); //esperamos a ">" para enviar la petcion http if(SerialESP8266.find(">")) // ">" indica que podemos enviar la peticion http { Serial.println("Enviando HTTP . . ."); SerialESP8266.println(peticionHTTP); if( SerialESP8266.find("SEND OK")) { Serial.println("Peticion HTTP enviada:"); Serial.println(); Serial.println(peticionHTTP); Serial.println("Esperando respuesta..."); boolean fin_respuesta=false; long tiempo_inicio=millis(); cadena=""; while(fin_respuesta==false) { while(SerialESP8266.available()>0) { char c=SerialESP8266.read(); Serial.write(c); cadena.concat(c); //guardamos la respuesta en el string "cadena" } //finalizamos si la respuesta es mayor a 500 caracteres if(cadena.length()>500) //Pueden aumentar si tenen suficiente espacio en la memoria { Serial.println("La respuesta a excedido el tamaño maximo"); SerialESP8266.println("AT+CIPCLOSE"); if( SerialESP8266.find("OK")) Serial.println("Conexion finalizada"); fin_respuesta=true; } if((millis()-tiempo_inicio)>10000) //Finalizamos si ya han transcurrido 10 seg { Serial.println("Tiempo de espera agotado"); SerialESP8266.println("AT+CIPCLOSE"); if( SerialESP8266.find("OK")) Serial.println("Conexion finalizada"); fin_respuesta=true; } if(cadena.indexOf("CLOSED")>0) //si recibimos un CLOSED significa que ha finalizado la respuesta { Serial.println(); Serial.println("Cadena recibida correctamente, conexion finalizada"); fin_respuesta=true; } }
} else { http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
15/22
16/7/2017
Arduino y ESP8266 como cliente web
Serial.println("No se ha podido enviar HTTP....."); } } } else { Serial.println("No se ha podido conectarse con el servidor"); }
//------------------------------------------------------------------------------delay(5000); //pausa de 10seg antes de conectarse nuevamente al servidor (opcional) }
Como se observa son la misma secuencia de comandos que se enviaron manualmente. Trabajamos con dos comunicaciones serial, una (por software) para comunicarnos con el ESP826 y otra (por hardware) para comunicarse con la PC y monitorear el ejemplo. A continuación mostramos la salida del monitor serial, datos que deben recibir si todo les va bien:
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
16/22
16/7/2017
Arduino y ESP8266 como cliente web
Tags: Wi 5
ESP8266
iot
?
?
0
?
Compartir
29 Comments Marlo Edgar Delgado Bazan oct 12, 2016
hola, estado probando el tutorial de cliente web y me a salido todo bien con el ejemplo que ponen en dicho tutorial, pero al querer replicar en mi dominio me sale error en la utima parte (no me devuelve nada), nose si tendría que configurar algo en la parte del servidor si me pudieran ayudar les agradeseria muchísimo. gracias de antemano. Reply http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
17/22
16/7/2017
Arduino y ESP8266 como cliente web
Naylamp oct 14, 2016
Hola marlo, hasta que paso logra comunicarse con tu servidor, en nuestro ejemplo primero se conecta al servidor (verifica que pase esto) después envía la petición (verifica también que logre enviar la petición) y finalmente espera la respuesta, Si no tienes ninguna respuesta aumenta el tiempo de espera, puede ser que el servidor demore en responder. Reply
Luis Gerardo oct 24, 2016
Hola buenos dias, gracias por el tutorial muy bueno, despues de una semana de estar probando por fin pude mandar datos al servidor. Me a sido de gran utilidad. Reply
Sergiotas dic 11, 2016
Saludos, estoy realizando los montajes y quisiera saber si es posible programar simultáneamente un webserver para controlar unos leds y acceder a información de sensores en una web local y a la vez que envíe datos de los sensores y estados de los leds en una pagina del tipo Thingspeak. Me gustaría alguna pista o algún enlace para ver si puedo usar mi arduino uno con esp8266 con las dos Funcionalidades. Gracias y saludos. Reply
Naylamp dic 14, 2016
Hola, podrías programar que en un momento trabaje como servidor por ejemplo para hacer configuración y ver información y después trabajar como como cliente. Pero si lo usas como clientes mejor que el usuario acceda al servidor externo que es en donde ya están tus datos. Reply
jorge ene 2, 2017
Comparto un adaptador DIP para el ESP12E (ideal para pruebas en protoboard)https://mega.nz/#!9UkAyBRa!Jyji4riXKnQK3LbNtU03Zv7CqWEkQQkiyFXeOJjicNc http://www.mediafire.com/file/7l7t7l48fx6hnd3/esp12E-adap.brd Reply
jorge ene 2, 2017
el pcb está en Eagle Reply
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
18/22
16/7/2017
Arduino y ESP8266 como cliente web
Gonzalo Bravo feb 14, 2017
Estimado: Una consulta con respecto a la ultima parte (3. Arduino como cliente web usando ESP8266) ¿Sabes si existe alguna complicación en el caso de que el hosting de la pagina web sea gratis? Saludos de antemano! Reply
Naylamp feb 18, 2017
Hola Gonzalo, No debería haber problemas con usar un servidor gratuito, en caso sea lento y demore la respuesta debes de aumentar el tiempo de espera. Reply
ricardo feb 19, 2017
Hola manualmente me sale todo muy bien pero en el codigo programado para q todo sea automatico no me devuelve la peticion pero entra al bucle de send Reply
Gonzalo Bravo feb 20, 2017
Entonces sabes por qué se puede producir este error al hacer la prueba usando los comandos AT? Esta es la respuesta del servidor:+IPD,391:HTTP/1.1 408 Request Timeout Date: Mon, 20 Feb 2017 17:29:00 GMT Server: Apache Content-Length: 221 Connection: close Content-Type: text/html; charset=iso-8859-1
Request Timeout Server timeout waiting for the HTTP request from the client. CLOSED Reply
Hernan feb 23, 2017
Eso me estaba pasando a mi, el error que yo encontré y como lo solucione, es que en el comando AT+CIPSEND="bytes" estaba poniendo el numero errado, no se por que, pero conté otra vez carácter por carácter y el resultado le sume 1 y con ese numero me funciono. Todo eso para el envió manual, ahora tengo problemas cuando intento que el arduino lo haga solo, y se que el error esta en el rn que se le pone despues del HTTP /1.1 y des host. Reply
Gonzalo Bravo http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
19/22
16/7/2017
Arduino y ESP8266 como cliente web feb 20, 2017
Hola, haciendo las pruebas para hacer consultas al servidor usando los comandos AT tengo el siguiente problema al intentar conectar al servidor: Envío AT+CIPSTART="TCP","www.aprendeweb.net",80y recibo como respuesta: DNS Fail Gracias de antemano. ERROR Reply
Naylamp mar 25, 2017
Hola Gonzalo, posiblemente no se haya conectado correctamente al wifi o la red no tenga acceso a internet, para descartar, prueba en otra red o en una generada con el AP de tu celular. Reply
juandavid8a mar 10, 2017
Compañeros tengo un problema con el ESP8266 .. al llevar un aproximado de 5 horas en linea .. la ip se vuelve inaccesible .. alguna idea de porque pasa esto o como corregirlo ?? Reply
Naylamp mar 25, 2017
Posiblemente sea por ruido en la fuente o desbordamiento de variables, un reseteo debería solucionar esto, podrías implementar también un reset desde programa cada cierto tiempo. Podría ser también problemas con la conexión, intenta probar en otra red, o acercarte más para recibir una mejor señal. Reply
Iñaki mar 27, 2017
Hola buenas! al recibir los datos de la variable son una String, cuando intento guardarlos en la variable int me sale siempre el valor 4 le dejo el ejemplo de lo que comento, int id; String GETID = client.readStringUntil('r'); Serial.println (GETID); client.flush(); idmlg = GETID.indexOf("/idmlg="); Serial.print (id); delay(10); Reply
Naylamp abr 9, 2017
Hola, estás usando la variable idmlg en lugar de la variable id, también estás interpretando mal la función indexOf(), ésta no te devuelve el numero en la cadena sino te devuelve la posición a partir de donde está la cadena que le ingresas como http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
20/22
16/7/2017
Arduino y ESP8266 como cliente web
parámetro, para obtener la poción del número tendrías que sumarle 7 (tamaño de "/idmlg="), una vez conocido la posición a partir de donde está el número, puedes usar substring() para extraer el número, pero este aun seguirá siendo un string, tendrás que usar toInt() para convertirlo en un número. Reply
Sergio abr 3, 2017
Hola, gracias por los dos tutoriales, están muy bien. He logrado ambas partes, crear un server y recibir datos ok y por otro lado también trabajar como cliente y enviar datos a un servidor. Los he adaptado un poco a mis necesidades y todo ok. El caso, es que lo que necesito es funcionar de ambas maneras, a veces necesito recibir datos de un servidor y otras veces soy yo el que tengo que enviarlos, pues bien, es en este punto donde no soy capaz. Ya que en un punto si lo configuro como estación me va, pero para el otro no y como estación me pasa lo mismo. De un modo rudimentario pensé que podría encapsular ambas configuraciones por separado y en función de una variable de control acceder a una u otra, el caso es que dentro del loop() no me conecta a la red wifi, responde AT correcto pero cuando trato de conectar a la red wifi falla...Alguna idea???? Gracias de antemano. Reply
Naylamp abr 9, 2017
Hola Sergio, en ambos tutoriales se usa el ESP8266 como estación (AT+CWMODE=1) de esta forma el ESP8266 es el que se conecta a una red wifi, de lo contrario seria AP (AT+CWMODE=2) y tendríamos que configurar un clave y psw para que otros dispositivos se conecten a la red wifi que el ESP8266 ha creado. Si te vas a comunicar con un servidor, entonces tienes que usar el tutorial actual, de esta forma puedes tanto enviar como recibir datos del servidor, para enviar datos es tal cual se explica en el tutorial, para recibir datos es de igual forma, tienes que enviar una consulta al servidor y el servidor te debe enviar los datos como respuesta en este caso tu tendrías que procesar la respuesta para obtener los datos. Reply
Alex may 9, 2017
Hola. He conseguido que el programa del arduino me funcione y la respuesta del monitor serial coincide. El problema es que en la página web no se me actualizan los valores que he enviado. Alguien conoce alguna solución? Gracias de antemano. Reply
miquel may 20, 2017
SerialESP8266.println("AT+CWJAP="Naylamp","hail_hydra""); no me compila cuando llega a esta lineainconsistent user-defined literal suffixes 'Naylamp' and 'hail_hydra' in string literalalguna solución? http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
21/22
16/7/2017
Arduino y ESP8266 como cliente web
Reply
mig may 21, 2017
prueba la siguiente línea: SerialESP8266.println("AT+CWJAP="nombre_de_red","contraseña""); Reply
Naylamp may 31, 2017
Ya fue corregido, la línea escrita correctamente es: SerialESP8266.println("AT+CWJAP=\"nombre_de_red\"\,"contraseña\""); Reply
Jorge may 21, 2017
Aquí tenéis mas ejemplos para el ESP8266 Reply
Alvaro jun 12, 2017
hola, Esta muy bine el tutorial.Quisiera, si puedes que me orientaras, tengo una bd mysql con las temperaturas de unas habitaciones almacenadada, con ESP8266 consigo cambiar esas temperaturas en la base de datos a traves de un php. Pro la pregunta es, si yo cambio los datos en la tabla mysql desde el servidor web, ¿como puedo mandar una notificación al ESP8266, para que cambie la temperatura, cada vez que yo cambien un dato?Gracias Reply
Naylamp jun 30, 2017
Hola Alvaro, el caso que mencionas es una de las limitaciones al usar http, EL ESP8266 tendría que estar consultando cada cierto tiempo al servidor para ver si hay algún cambio. Reply
Leave a Reply * Name: * E-mail: (Not Published)
Website: (Site url withhttp://)
http://www.naylampmechatronics.com/blog/54_arduino-y-esp8266-como-cliente-web.html
22/22