Publicado por el 1 abril, 2016 2 comentarios
Dificultad bajaComplejidad baja
CC BY-SA 4.0

En varias ocasiones hemos usado el módulo WiFi ESP8266 y lo hemos controlado mediante comandos AT, bien por que se los enviáramos a través de un monitor puerto serie de forma manual o bien por que los comandos los enviara un Arduino a través de su puerto serie físico o virtual (softwareSerial). En esta ocasión realizaremos el control con una librearía para ESP8266 de Itead. Puedes revisar algunos de los comandos AT aquí y el resto de tutoriales sobre ESP8266 desde aquí.



Entonces ¿Qué hay de nuevo?

Fácil, librería una vez que sabemos un poco como funcionan las cosas, podemos simplificar el proceso para que no nos volvamos más locos de lo que ya estamos.

En definitiva, vamos a usar una librería que haga la parte fea por nosotros. Para esta entrada vamos a usar la librería desarrollada por ITEAD Studio la cual podemos obtener desde su GitHub. Llevo poco tiempo usándola, tiene buena pinta, pero ya iremos viendo que tal funciona.

 

Vamos por partes.

Lo primero será “instalar” la librería para poder usarla y una vez realizado este paso, pasaremos a abrir el ejemplo “TCPserver” el cual aunque no está comentado, es fácil interpretar que hace en casa paso, puesto que aunque en inglés es altamente descriptivo y si has visto los tutoriales anteriores sobre este módulo estoy seguro que lo vas a entender, aunque si tienes cualquier duda, ya sabes, un comentario o un email y tendrás tu respuesta lo antes posible.

¿Modificamos algo?

Y la respuesta es, si, claro que vamos a cacharrear con el código, es una de las mejores formas de aprender.

Para empezar podemos modificar uint8_t que se denomina “buffer” que es la que contiene la información que recibimos desde el cliente, y que posteriormente le enviamos, ya sabes lo que debería ser HTML, pero que en este ejemplo el autor decidió enviar un texto plano. En cualquier caso podemos modificarlo, pero lo haremos después de realizar la recepción de la petición.

También tendremos que modificar los parámetros de conexión a el punto de acceso WiFi y el puerto:

#define SSID        "ITEAD"
#define PASSWORD    "12345678"

¿Algo más que modificar? Pues si, vamos a asegurarnos que tenemos la configuración del puerto serie correctamente, y tendremos que fijarnos en dos cosas:

-La primera es que estemos usando el puerto correcto, puesto que el código viene preparado para usar Serial1 que lo podremos encontrar en algunas placas como la Mega, pero no lo encontraremos en otras como la Uno, si queremos usar por ejemplo esta última placa, tendremos que usar SoftwareSerial y en la información del repositorio de GitHub tienes las instrucciones.



-La segunda, asegurémonos de usar la velocidad correcta, en mi caso el módulo está configurado a 115200 por tanto marcaré esta velocidad, modificando los valores 9600 del archivo ESP8266.h el cual podrás encontrar en la carpeta de la librería.



Realizadas estas configuraciones, solo nos quedará cargar el código en la placa y conectarnos a ella usando un navegador web, que no se te olvide que tal y como está configurado el código, tendremos que usar el puerto 8090 para acceder al módulo. Como siempre te dejo el código completo a continuación, pero recuerda que en realidad es un ejemplo de la librería.

Estoy pensando altamente en crear una librería propia para este módulo ¿qué opinas? ¿Debería crearla?

/**
 * @example TCPServer.ino
 * @brief The TCPServer demo of library WeeESP8266. 
 * @author Wu Pengfei<pengfei.wu@itead.cc> 
 * @date 2015.02
 * 
 * @par Copyright:
 * Copyright (c) 2015 ITEAD Intelligent Systems Co., Ltd. \n\n
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version. \n\n
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "ESP8266.h"

#define SSID        "NombreWiFi"
#define PASSWORD    "Password"

ESP8266 wifi(Serial1);

void setup(void)
{
    Serial.begin(9600);
    Serial.print("setup begin\r\n");
    
    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());
      
    if (wifi.setOprToStationSoftAP()) {
        Serial.print("to station + softap ok\r\n");
    } else {
        Serial.print("to station + softap err\r\n");
    }
 
    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print("Join AP success\r\n");
        Serial.print("IP: ");
        Serial.println(wifi.getLocalIP().c_str());    
    } else {
        Serial.print("Join AP failure\r\n");
    }
    
    if (wifi.enableMUX()) {
        Serial.print("multiple ok\r\n");
    } else {
        Serial.print("multiple err\r\n");
    }
    
    if (wifi.startTCPServer(8090)) {
        Serial.print("start tcp server ok\r\n");
    } else {
        Serial.print("start tcp server err\r\n");
    }
    
    if (wifi.setTCPServerTimeout(10)) { 
        Serial.print("set tcp server timout 10 seconds\r\n");
    } else {
        Serial.print("set tcp server timout err\r\n");
    }
    
    Serial.print("setup end\r\n");
}
 
void loop(void)
{
    uint8_t buffer[128] = {0};
    uint8_t mux_id;
    uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
    if (len > 0) {
        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str());
        Serial.println("]");
        
        Serial.print("Received from :");
        Serial.print(mux_id);
        Serial.print("[");
        for(uint32_t i = 0; i < len; i++) {
            Serial.print((char)buffer[i]);
        }
        Serial.print("]\r\n");
        
        if(wifi.send(mux_id, buffer, len)) {
            Serial.print("send back ok\r\n");
        } else {
            Serial.print("send back err\r\n");
        }
        
        if (wifi.releaseTCP(mux_id)) {
            Serial.print("release tcp ");
            Serial.print(mux_id);
            Serial.println(" ok");
        } else {
            Serial.print("release tcp");
            Serial.print(mux_id);
            Serial.println(" err");
        }
        
        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str());
        Serial.println("]");
    }
}



Sobre el autor
Enrique Gómez
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars desde el principio. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario