CREADO POR V. GARCÍA. 2016-08-30.
VISIÓN DE CONJUNTO.
El dispositivo ESP8266 es un chip altamente integrado diseñado para las necesidades de un nuevo mundo conectado. Ofrece una solución completa y autosuficiente en las redes Wi-Fi, lo que le autoriza para ser anfitrión de la aplicación o descargar todas las funciones de red Wi-Fi desde otras aplicaciones de procesador.
ESP8266 tiene potentes capacidades de procesamiento y almacenamiento en placa que, le permiten integrarse con los sensores y dispositivos específicos de la aplicación a través de sus GPIO (General Purpose Input/Output, Entrada/Salida de Propósito General) con un desarrollo mínimo por adelantado y la carga mínima durante el tiempo de ejecución. Su alto grado de integración en el chip permite la circuitería externa mínima, y toda la solución, incluyendo el módulo de front-end, está diseñado para ocupar el mínimo área de PCB.
Hemos visto como manejar el ESP8266-01 con la ayuda de un Arduino. Sabemos que el ESP8266, básicamente es un microcontrolador con el modulo WiFi. Hay muchos artículos y ejemplos en la red que lo utilizan con un Arduino y la mayoría de ellos están utilizando la ESP8266 como un módulo WiFi conectado a un Arduino estándar.
Hay muchas versiones de ESP8266, algunos de los más baratos son el ESP-01, el ESP-03 y el ESP-12. Una gran mayoría usan las comunicaciones es serie con el ESP8266. De forma que la mayoría de los equipos utilizan los convertidores serie USB, al igual que los chips FTDI.
El problema del dispositivo ESP8266 es que requiere 3.3Vdc en lugar del más común 5 VDC. Además, también puede consumir hasta 250mA de corriente. Por lo que algunos módulos ESP8266 como veremos, se han construido con reguladores 3.3Vdc y son compatibles con USB 5 VCC y los dispositivos serie. Realmente una alimentación de 3,3V asegura un buen funcionamiento.
Con esta perspectiva, después de leer mucho sobre este pequeño dispositivo y experimentar con el módulo ESP8266 y un Arduino vi que, el ESP8266 es un microcontrolador similar a los ATMEGA328 utilizados en la norma Arduino. Por lo que pensé, utilizar el ESP8266 como un Arduino sin depender de un Arduino estándar para su uso. Ahora toca programar directamente sobre el módulo wifi ESP8266.
Actualmente y cada día más, tenemos una gran cantidad de información sobre cómo llevar a cabo esto, al principio me pareció complicado, difícil de entender, por información a veces es engañosa, así que, espero simplificar y clarificar el proceso.
Actualmente y cada día más, tenemos una gran cantidad de información sobre cómo llevar a cabo esto, al principio me pareció complicado, difícil de entender, por la información a veces es engañosa, así que, espero simplificar y clarificar el proceso.
Ya hemos comentado el problema que presenta este ESP8266-01 respecto de la tensión y corriente de alimentación, además presenta un anclaje no apto para los habituales protoboard ya que no es posible conectarlo directamente, el problema tiene fácil solución utilizando cables macho-hembra o con una de las dos opciones que pueden verse en la imagen que sigue.
ESP8266 tiene potentes capacidades de procesamiento y almacenamiento en la misma placa que, le permiten integrarse con sensores y dispositivos específicos para su aplicación a través de sus GPIO’s con un desarrollo mínimo avanzado y la carga mínima durante el tiempo de ejecución. Su alto grado de integración en el chip permite la mínima circuitería externa, y toda la solución, incluyendo el módulo de front-end, está diseñado para ocupar la mínima área de PCB.
Eso si, dependiendo del modelo de ESP8266 que tenga, dispondrá de más o menos pines como PWM y más cosas como I2C y SPI, pero para el típico ESP8266-01, solo dispone dos pines GPIO0 y GPIO2, sin embargo hay otros modelos con todos los pines a nuestro alcance.
Seguro que se está preguntando cómo podemos utilizar el ESP8266 sin el habitual Arduino. Primero tenemos que instalar un pluggin ESP8266 para nuestro IDE Arduino. En este lugar de GitHub:
https://github.com/esp8266/Arduino/releases se puede descargar el pluggin.
Como ya vimos en el artículo anterior ESP8266-01, recomiendo la versión 1.6.4 si no la tiene descárguela del sitio Arduino.cc para asegurarnos que funciona. Con esto tendremos los mismos puntos de partida usted y yo. Así podrá seguir mis pasos. Abra el IDE de Arduino y vaya a Archivo/Preferencias.
En el pié de la ventana, en la celda que pone Additional Boards Manager URLs, tiene que copiar y pegar la dirección siguiente:
http://arduino.esp8266.com/package_esp8266com_index.json
Puede añadir varias, separadas por una coma. Ahora, vaya a Herramientas/placa/Board Manager y pulse en Board Manager…
Busque esp8266 by ESP8266 Community y dele a Install, en poco tiempo se instalará la librería. Ahora, en el menú Herramientas ya estará disponible la Placa genérica ESP8266 que debe elegir. En el mismo menú, elija la velocidad de transmisión de 115200, el puerto que corresponda y el resto de opciones como se aprecian en la imagen (ya la tengo instalada).
El siguiente es el diagrama de conexión entre ambas tarjetas. Como se aprecia es muy sencillo y esta es la forma adecuada para programar el boceto que nos interese en cada momento.
Fig. 8
El programa que vamos a cargar, es un boceto sencillo como el Blink.ino que viene en el propio Arduino.
1 2 3 4 5 6 7 8 9 |
void setup() { pinMode(2, OUTPUT); } void loop() { digitalWrite(2, HIGH); delay(1000); digitalWrite(2, LOW); delay(1000); } |
Cuando todo esta bien conectado y se carga el programa, nos mostrará una imagen similar a la de abajo, al cargar una línea de puntos nos indicará que todo va bien, siguen tres hasta el 100%.
Para la puesta en marcha de la ESP8266, una vez programada con el boceto que necesitemos, bastará aplicar una tensión de 3’3V y las conexiones adecuadas según las necesidades del boceto.
Como se puede ver todo ha salido como esperábamos, el ESP8266 está funcionando. Hemos utilizado un convertidor de USB a TTL, para programar el Esp8266-01 o también Esp8266 ESP-01.
Nota. He observado que una vez ejecutado el boceto, si intentamos compilar un nuevo boceto o incluso el mismo boceto, Arduino responde con un error, al menos esto es lo que ocurre en mi sistema. Después de consultar en foros, darle vueltas al tema y probando cosas, he encontrado una solución hasta que encuentre una más razonada, la solución es que si reseteo el ESP8266-01, conectando un instante el pin SRT a masa/tierra, cuando vuelvo a compilar un boceto no da error.
Habíamos comentado, utilizar el ESP8266 sin Arduino, ya hemos llegado al punto que esperábamos. Vamos a poner el ESP8266 como un servidor web, al que mediante un navegador podamos encender o apagar un LED que tendremos conectado a un GPIO del ESP8266, como por ejemplo el GPIO2.
Este es otro código similar que hace lo mismo, pero de otra forma, este segundo boceto me parece más elaborado.
ESP8266 LED CONTROL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
* esp8266_led_control.ino * * He puesto en el navegador la dirección: http://192.168.1.234 y se ha establecido la * conexión esperada con los dos botones On y OFF. He probado conectando una res. y un * LED del GPIO 2 a masa y ha respondido bien. * Esta funcionando 30.08.2016 */ #include <ESP8266WiFi.h> // librería "ESP8266WiFi.h" const char* ssid = "Magesh"; // ponga su ssid const char* password = "jayakumar"; // ponga su password int ledPin = 2; // asignar al GPIO 2 el nombre "LED" a la patilla 2. WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL to connect: "); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.println("/"); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request int value = LOW; if (request.indexOf("/LED=ON") != -1) { digitalWrite(ledPin, HIGH); value = HIGH; } if (request.indexOf("/LED=OFF") != -1) { digitalWrite(ledPin, LOW); value = LOW; } // Set ledPin according to the request //digitalWrite(ledPin, value); // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.print("<p style='font-size:20px;'>"); client.print("Led pin is now: "); if(value == HIGH) { client.print("<span style='color:#ff0000;font-size:20px;'>"); client.print("On");client.print("</span>"); } else { client.print("<span style='color:#0000ff;font-size:20px;'>"); client.print("Off");client.print("</span>"); } client.println("</p>"); client.println(" "); client.print("<p style='font-size:22px;'>Conectado a IP: "); client.print("http://"); client.println(WiFi.localIP()); client.println("</p>"); client.println("<a href=\"/LED=ON\"\"><button>Turn On </button>"); client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button>"); client.println("</html>"); delay(1); Serial.println("Client disonnected"); Serial.println(""); } |
OPS!!. Que ha pasado, el navegador no encuentra la red SSID. Naturalmente, usted tiene que modificar el código y donde pone ssid = “ESP”, debe poner ssid = “REDINHALAMBRICA” de Internet de su ruter.
Cómo encontrar el nombre de la red inalámbrica (SSID) y la contraseña de los ruters? El nombre de la red inalámbrica (SSID) y la contraseña son datos muy importantes, especialmente si usted está intentando conectarse a una red inalámbrica segura. Usted podrá acceder a esta información a través de la página web de configuración de su ruter. En caso de una red libre, usted desde el celular, puede conocer la red más potente a su alcance, tome nota de su nombre y ya dispone de su SSID = “XXXXXXX”, el caso del password, pídalo al establecimiento, si es libre, no hará falta.
Si usa una computadora de mesa y no encuentra el icono de conexiones inalámbricas, es posible que no esté instalada correctamente o inhabilitada. Para comprobar que el adaptador esté habilitado, presiona Win+R e introduzca ncpa.cpl. Busque el adaptador inalámbrico en la lista de conexiones disponibles. Si aparece como “Inhabilitado”, haz clic con el botón derecho y selecciona “Habilitar”.
Si ya ha cambiado estos datos, usted puede comprobar el funcionamiento del boceto.
El siguiente, es otro código similar que hace lo mismo, pero de otra forma, éste segundo boceto lo he elaborado más.
ESP8266 LED WEB.
Otra forma de conectar y desconectar un LED por Internet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
/*<br /> esp8266_web.ino<br /> */<br /><br /> #include &lt;ESP8266WiFi.h><br /><br /> const char* ssid = "YOUR_SSID";//type your ssid<br /> const char* password = "YOUR_PASSWORD";//type your password<br /><br /> int ledPin = 2; // GPIO2 del ESP8266<br /> WiFiServer server(80);<br /><br /> void setup() {<br /> Serial.begin(115200);<br /> delay(10);<br /><br /> pinMode(ledPin, OUTPUT);<br /> digitalWrite(ledPin, LOW);<br /><br /> // Conecta a red WiFi <br /> Serial.println();<br /> Serial.println();<br /> Serial.print("Conectando a ");<br /> Serial.println(ssid);<br /><br /> WiFi.begin(ssid, password);<br /><br /> while (WiFi.status() != WL_CONNECTED) {<br /> delay(500);<br /> Serial.print(".");<br /> }<br /> Serial.println("");<br /> Serial.println("WiFi conectada");<br /><br /> // Start the server<br /> server.begin();<br /> Serial.println("Server started");<br /><br /> // Print the IP address<br /> Serial.print("Use this URL to connect: ");<br /> Serial.print("http://");<br /> Serial.print(WiFi.localIP());<br /> Serial.println("/");<br /> }<br /><br /> void loop() {<br /> // Check if a client has connected<br /> WiFiClient client = server.available();<br /> if (!client) {<br /> return;<br /> }<br /><br /> // Wait until the client sends some data<br /> Serial.println("new client");<br /> while(!client.available()){<br /> delay(1);<br /> }<br /><br /> // Read the first line of the request<br /> String request = client.readStringUntil('\r');<br /> Serial.println(request);<br /> client.flush();<br /><br /> // Match the request<br /><br /> int value = LOW;<br /> if (request.indexOf("/LED=ON") != -1) {<br /> digitalWrite(ledPin, HIGH);<br /> value = HIGH;<br /> } <br /> if (request.indexOf("/LED=OFF") != -1){<br /> digitalWrite(ledPin, LOW);<br /> value = LOW;<br /> }<br /><br /> // Set ledPin according to the request<br /> //digitalWrite(ledPin, value);<br /><br /> // Return the response<br /> client.println("HTTP/1.1 200 OK");<br /> client.println("Content-Type: text/html");<br /> client.println(""); // do not forget this one<br /> client.println("&lt;!DOCTYPE HTML>");<br /> client.println("&lt;html>");<br /><br /> client.print("Led pin is now: ");<br /><br /> if(value == HIGH) {<br /> client.print("On"); <br /> } else {<br /> client.print("Off");<br /> }<br /> client.println("<br><br>");<br /> client.println("Click &lt;a href=\"/LED=ON\">here&lt;/a> turn the LED on pin 2 ON<br>");<br /> client.println("Click &lt;a href=\"/LED=OFF\">here&lt;/a> turn the LED on pin 2 OFF<br>");<br /> client.println("&lt;/html>");<br /><br /> delay(1);<br /> Serial.println("Client disonnected");<br /> Serial.println("");<br />} |
En el código como siempre, se incluyen las bibliotecas necesarias para inicializar el módulo ESP en modo AP y crear un servidor web. Luego se proporcionan el nombre ssid y el password, de nuestro punto de acceso (puede dejar en blanco el pasword y no tendrá que poner contraseña cuando se conecte el módulo). He documentado bastante el código considero que no son necesarias más descripciones. El resultado es este:
El siguiente es un tercer código para realizar el mismo efecto, sin embargo se ha elaborado un poco más.
ESP8266 LED CONTROL2.
Cómo conectar y desconectar un LED por Internet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
/*<br /> * esp8266_led_control2.ino<br />* <br /> * He puesto en el navegador la dirección: http://192.168.1.234 y se ha establecido la<br /> * conexión esperada con los dos botones On y OFF. He probado conectando una res. y un <br /> * LED del GPIO 2 a masa y ha respondido bien.<br /> * Esta funcionando 30.09.2016<br />*/<br /><br /> #include &lt;ESP8266WiFi.h> // librería "ESP8266WiFi.h"<br /><br /> const char* ssid = "Magesth"; // ponga su ssid<br /> const char* password = "jayakuman"; // ponga su password<br /><br /> int ledPin = 2; // asignar al GPIO 2 el nombre "LED" a la patilla 2.<br /> WiFiServer server(80);<br /><br /> void setup() {<br /> Serial.begin(115200);<br /> delay(10);<br /> pinMode(ledPin, OUTPUT);<br /> digitalWrite(ledPin, LOW);<br /><br /> // Connect to WiFi network<br /> Serial.println();<br /> Serial.println();<br /> Serial.print("Connecting to ");<br /> Serial.println(ssid);<br /> WiFi.begin(ssid, password);<br /><br /> while (WiFi.status() != WL_CONNECTED) {<br /> delay(500);<br /> Serial.print(".");<br /> }<br /> Serial.println("");<br /> Serial.println("WiFi connected");<br /><br /> // Start the server<br /> server.begin();<br /> Serial.println("Server started");<br /><br /> // Print the IP address<br /> Serial.print("Use this URL to connect: ");<br /> Serial.print("http://");<br /> Serial.print(WiFi.localIP());<br /> Serial.println("/");<br /> }<br /><br /> void loop() {<br /> // Check if a client has connected<br /> WiFiClient client = server.available();<br /> if (!client) {<br /> return;<br /> }<br /><br /> // Wait until the client sends some data<br /> Serial.println("new client");<br /> while(!client.available()){<br /> delay(1);<br /> }<br /><br /> // Read the first line of the request<br /> String request = client.readStringUntil('\r');<br /> Serial.println(request);<br /> client.flush();<br /><br /> // Match the request<br /><br /> int value = LOW;<br /> if (request.indexOf("/LED=ON") != -1) {<br /> digitalWrite(ledPin, HIGH);<br /> value = HIGH;<br /> }<br /> if (request.indexOf("/LED=OFF") != -1) {<br /> digitalWrite(ledPin, LOW);<br /> value = LOW;<br /> }<br /><br /> // Set ledPin according to the request<br /> //digitalWrite(ledPin, value);<br /><br /> // Return the response<br /> client.println("HTTP/1.1 200 OK");<br /> client.println("Content-Type: text/html");<br /> client.println(""); // do not forget this one<br /> client.println("&lt;!DOCTYPE HTML>");<br /> client.println("&lt;html>");<br /><br /> client.print("&lt;p style='font-size:20px;'>");<br /> client.print("Led pin is now: "); <br /><br /> if(value == HIGH) {<br /> client.print("&lt;span style='color:#ff0000;font-size:20px;'>");<br /> client.print("On");client.print("</span>");<br /> } else {<br /> client.print("&lt;span style='color:#0000ff;font-size:20px;'>");<br /> client.print("Off");client.print("</span>");<br /> }<br /> client.println("</p>"); <br /> client.println("<br>"); <br /> client.print("&lt;p style='font-size:22px;'>Conectado a IP: "); <br /> client.print("http://"); <br /> client.println(WiFi.localIP()); <br /> client.println("</p>");<br /> client.println("<br>&nbsp; &nbsp; &lt;a href=\"/LED=ON\"\">&lt;button>Turn On </button></a>");<br /> client.println("&lt;a href=\"/LED=OFF\"\">&lt;button>Turn Off </button></a><br />"); <br /> client.println("</html>");<br /> delay(1);<br /> Serial.println("Client disonnected");<br /> Serial.println("");<br /> } |
Es el momento de cargar el anterior código en nuestro Arduino y compilarlo para ver los resultados, las conexiones a seguir son las mostradas en la anterior figura 8. Observación: Cuando el programa termine de compilar, es el momento de abrir el monitor Serial, es cuando mostrará la conexión, para ver a qué IP hemos de conectarnos.
Ahora que sabemos la IP, abramos el navegador de costumbre e insertar dicha IP que nos ha mostrado el monitor Serial y podremos actuar sobre los botones que presenta.
Observemos que cada vez que pulsamos un botón, se conecta el servidor, ejecuta la acción y se desconecta. No se olvide de visitar esp8266.com para obtener las últimas y mejores noticias en ESP8266, software y chismes!
Este módulo ESP8266-01 sólo dispones de 2 registros GPIO en el exterior, sin embargo, otros modelos tienen más GPIO’s disponibles. Una opción para conseguir entradas adicionales en el ESP8266-01 es utilizar una interfaz I2C. En próximas ocasiones trataremos estos interesantes módulos ESP8266 en sus distintas posibilidades.
ANEXO.
Puede que en sus pruebas usted encuentre que le da un error al compilar el boceto, fíjese si es algo parecido a lo que muestro a continuación:
1 2 3 4 5 6 |
Sketch uses 222.205 bytes (51%) of program storage space. Maximum is 434.160 bytes. Global variables use 31.572 bytes (38%) of dynamic memory, leaving 50.348 bytes for local variables. Maximum is 81.920 bytes. warning: espcomm_sync failed error: espcomm_open failed error: espcomm_upload_mem failed |
Si ese es el caso, le diré que a mi me pasa a menudo, y he encontrado una solución a nivel hardware, que consiste en reseteart el ESP8266, desconectar la salidas de los GPIO’s si están utilizándose y entonces compilar y subir el boceto, en ese caso a mi me funciona. Y recuerde que es importante aplicar condensadores electrolíticos de 10uf a 47uf cerca de la alimentación del ESP8266, para evitar comportamientos erráticos.
Espero haber aclarado algún concepto.
Artículo muy completo, ideal para tenerlo de referencia.
Un saludo Vicente
Gracias por tus palabra, Vicente.
hola, estoy probando y me carga bien el servidor web y funciona bien pero le quito la energia y vuelvo a conectarlo y desaparece el servidor , tengo que cargarlo de nuevo , utilizo el firmware LUA , como hago para que quede memorizado y cada vez que lo apague me arranque el server web=
Muy bueno el articulo, existe manera de saber el estado de los GPIOs , sabiendo que los puedo alterar desde varias aplicaciones, (sea celular, pc, notebook, etc ???