#5 Curso IoT con Arduino y ESP8266 WiFi: Modulo WiFi ESP8266 (2)

Continuación de la entrada anterior: #4 Curso IoT con Arduino y ESP8266 WiFi: Modulo WiFi ESP8266 (1)

5.3) Montaje del módulo con su adaptador para protoboard

Salvo el ESP05 ninguno de los otros módulos se puede conectar directamente a la placa de prototipado ya sea porque la separación de sus pads/pines no coincide con los agujeros de la protoboard, o porque en el caso del ESP01 cuenta con un doble conector obligándonos a usar un adaptador o cables.

ESP8266_adapter

Y el ESP07 no es una excepción ya que para este módulo también vamos a necesitar de un adaptador. Como se ve en la imagen el adaptador no es más que un PCB a medida en el que soldar el módulo y unos pines macho para la placa de prototipado.

 


5.4) Montaje en la protoboard

Antes de ponernos con Arduino es mejor conectar el módulo ESP8266 directamente al adaptador USB para comprobar si funciona, si responde a los comandos, para ver que versión del firmware tiene y actualizarlo de ser necesario, etc. Para esas pruebas necesitaremos realizar el siguiente montaje en la placa de prototipado:

protoboard5

Como se ve en la fotografía se ha usado la fuente de alimentación de 3.3V, el módulo WiFi ESP8266, 3 resistencias de 1KΩ como divisor de tensión del pin TX del Arduino/adaptador USB, y unos cuantos cables. Los tres cables que sobresalen de la placa de prototipado deben conectarse de la siguiente forma:

Módulo ESP8266Adaptador USB
   TX : AmarilloRX
   RX : VerdeTX
GND : AzulGND

 


5.5) Actualización del firmware del ESP8266

Con intención de que a todos nos funcionen los comandos AT del próximo punto del temario y para que sea más sencillo daros a todos soporte recomiendo que actualicéis el firmware del módulo ESP8266. En concreto en este curso se empleara la versión 0.952 de Chao He de marzo de 2015. Podéis descargarla desde este enlace que además incluye el programa necesario para escribir el firmware en el ESP8266.

ESP8266 Flasher y Firmware v0.952

Para instalar el nuevo firmware al montaje realizado sobre la placa de prototipado hay que añadir una nueva conexión con un cable que una el pin GPIO0 con GND, eso permitirá grabar el nuevo firmware en el módulo.

Tras ello abrimos el programa ESP8266Flasher.exe y en la segunda pestaña indicamos el firmware a grabar, el fichero v0.9.5.2 AT Firmware.bin, pulsando en el icono del engranaje. Después volvemos a la primera pestaña y pulsamos en Flash, antes habremos seleccionado el puerto COM del adaptador USB, si el proceso de grabado no comienza probaremos a desconectar la fuente de alimentación y a volver a conectarla para que el módulo se reinicie, con eso debería de empezar, si aun así no lo hace en la tercera pestaña Advanced será necesario probar con distintas velocidades y repetir el proceso hasta que se inicie la grabación.

Tras la instalación desconectamos el cable que añadimos y volvemos al monitor Serial. Para todos los comandos que ejecutemos tenemos que configurar el IDE para que añada un retorno de carro y salto de línea, también deberemos de ajustar la velocidad a 115200 bps.

baudios

Si ahora ejecutamos el comando AT debería de responder con un OK, si escribimos el comando AT+GMR debería de indicar la versión del firmware que se corresponderá con esta:

  • AT version:0.21.0.0
  • SDK version:0.9.5

Si ejecutamos el comando AT+CIOBAUD=9600 configuraremos el módulo a 9600 bps para que funcione con la librería SoftwareSerial, también actualizaremos esa velocidad en el monitor Serial del IDE de Arduino para probar a mano los siguientes comandos.

 


5.6) Lista de comandos AT para la comunicación con el módulo

La gran mayoría de módulos del mercado que hacen uso de la comunicación Serie emplean para su funcionamiento ciertos comandos AT, como los vistos en el paso anterior, que nos permiten configurar el módulo o hacerlo funcionar. El ESP8266 es uno de esos módulos y a continuación se incluye una lista de comandos.

Orden ATDescripción
ATPermite comprobar si el sistema de comandos AT está activado.
AT+GMRMuestra información sobre el firmware del módulo.
AT+RSTReinicia el módulo.
ATE1
ATE0
Activa o desactiva, respectivamente, el eco de los comandos AT.

Normalmente el eco está activo por lo que se muestra tanto el resultado de la operación como la propia operación. Con esta orden se puede reservar alguna información, la clave del punto de acceso, por ejemplo, mientras se muestra por una consola el resto de la información.

AT+CWMODEEstablece el modo de funcionamiento WiFi del módulo. Hay tres disponibles (1) estación, (2) punto de acceso y (3) mixto: punto de acceso y estación.

Por ejemplo, para establecer el modo de funcionamiento WiFi del módulo como estación se usaría AT+CWMODE=1 y para consultar el modo actual de funcionamiento se usaría AT+CWMODE?

 

Orden ATDescripción
AT+CIOBAUDPermite establecer la velocidad de comunicación del módulo (expresada en baudios) según el formato AT+CIOBAUD={velocidad}

Utilizada con el formato AT+CIOBAUD? informa de la velocidad actualmente establecida.
Los valores permitidos son 9600, 19200, 38400, 57600, 74880, 115200, 230400,460800, 921600 y la configuración por defecto es 115200

AT+CSYSWDTENABLE
AT+CSYSWDTDISABLE
Activa o desactiva el watchdog (perro guardián) que permite reiniciar el módulo automáticamente si se produce un error de funcionamiento.
AT+CIPSTAMAC
AT+CIPAPAMAC
Permite establecer una dirección MAC o consultar la actual tanto en el punto de acceso (CIPAPAMAC) como en la estación (CIPSTAMAC). Para establecer una nueva dirección MAC se utiliza la orden con el formato AT+CIPSTAMAC={MAC} siendo {MAC} la dirección MAC en el formato 01:34:67:89:AB:CD
Para consultar la dirección MAC actual se usa la orden con el formato AT+CIPSTAMAC?
AT+CWLAPMuestra una lista con los puntos de acceso disponibles en el alcance del módulo, indicando para cada uno de ellos la codificación, el SSID, el nivel de señal y la dirección MAC.
Las diferentes codificaciones se representan por un número: abierta=0, WEP=1, WPA/PSK=2, WPA2/PSK=3 y WPA/WPA2/PSK=3.
Se puede limitar la búsqueda a los puntos de acceso que cumplan ciertas condiciones como el SSID, la MAC o el número de canal indicándolos en la orden.
AT+CWJAPUsando la orden con el formato AT+CWJAP={SSID},{clave} el módulo se conecta al punto de acceso indicado por el SSID usando la clave especificada.
Para saber a qué punto de acceso se encuentra actualmente conectado el módulo se puede usar la orden en el formato AT+CWJAP?
AT+CWQAPDesconecta el punto de acceso.
Para comprobar si se ha desconectado se puede usar la orden con el formato AT+CWQAP?

 

Orden ATDescripción
AT+CWSAPConfigura el modo de funcionamiento del punto de acceso según el formato AT+CWSAP={SSID},{clave},{canal},{cifrado}
Los modos de cifrado corresponden con los códigos abierta=0, WEP=1, WPA/PSK=2, WPA2/PSK=3 y WPA/WPA2/PSK=4
AT+CWDHCPActiva o desactiva el DHCP (asignación dinámica de dirección IP) en el punto de acceso y/o en la estación.
El formato de la orden es AT+CWDHCP={modo},{estado} siendo {modo} el código del que se activa (0 para el punto de acceso, 1 para la estación o 2 para ambos) y {estado} activar/desactivar DHCP según se use 1 ó 0 como valor.
AT+CIPSTA
AT+CIPAP
Establece la dirección IP de la estación (AT+CIPSTA) o del punto de acceso (AT+CIPAP) usada en el formato AT+CIPSTA={IP} o muestra la actual usada en el formato AT+CIPSTA?
AT+CWLIFMuestra una lista de las direcciones IP de los dispositivos conectados al módulo en modo punto de acceso.
AT+CIFSRMuestra la dirección IP local actual del módulo
AT+CIPMUXEstablece el modo de conexión simple o múltiple según se use con el formato AT+CIPMUX=0 ó AT+CIPMUX=1 respectivamente.
AT+CIPSERVERActiva o desactiva el modo de servidor según se use en el formato AT+CIPSERVER=0 (que requerirá un reinicio para hacerse efectivo) o AT+CIPSERVER=1,{puerto} que comenzará a aceptar peticiones en el puerto correspondiente.
Para poder establecer el modo servidor debe activarse el modo multi-conexión con AT+CIPMUX=1
AT+CIPSTOConfigura el tiempo de espera (timeout) cuando el módulo funciona en modo servidor con el formato AT+CIPSTO={segundos}
Si se usa con el formato AT+CIPSTO? informa del timeout actual.

 

Orden ATDescripción
AT+CIPSTARTInicia una conexión con un servicio. Es necesario indicar el tipo de conexión (TCP/UDP) la dirección IP y el puerto al que se realiza la conexión con el formato AT+CIPSTART={id},{TCP|UDP},{IP},{puerto} Siendo {id} el número de identificador de la conexión (si se aceptan varias, es decir si se utilizó AT+CIPMUX=1, si AT+CIPMUX=0 no hay que indicarlo)
También es posible añadir al final de la orden (separado por comas como el resto de parámetros) el puerto local y el modo si se trata de una conexión UDP.
Usada con el formato AT+CIPSTART=? muestra la información anterior relativa a la conexión actualmente en curso.
AT+CIPSTATUSMuestra el estado de la conexión actual en el formato STATUS:{estado} siendo {estado} un valor que representa el estado de la conexión como desconectado por un 4, con una IP asignada por un 2 y conectado por un 3
Después del estado genérico detalla la conexión en el formato +CIPSTATUS:{id},{tipo},{dirección},{puerto},{modo} siendo {modo} un valor que representa si el módulo está funcionando como cliente (0) ó como servidor (1)
AT+CIPCLOSECierra una conexión activa. Cuando AT+CIPMUX=1 será necesario indicar la conexión que se cierra usando el formato AT+CIPCLOSE={id}
AT+CIPSENDPrepara el envío de datos. Cuando esté listo devolverá el código «>» como inductor para el comienzo del envío. El formato cuando AT+CIPMUX=1 es AT+CIPSEND={longitud} siendo {longitud} la cantidad de bytes que se van a enviar.
Si AT+CIPMUX=1 el formato es AT+CIPSEND={id},{longitud} siendo {id} el número de conexión a la que se hace referencia.
Una vez recibido el inductor se puede enviar la información al módulo.
La información recibida de vuelta vendrá precedida por el código +IPD,{id},{longitud}:{datos} siendo {id} el número de conexión a la que se responde y {longitud} la cantidad de datos que se van a recibir después del signo de dos puntos.
AT+CIPUPDATESe utiliza para actualizar el módulo a través de la red (OTA)
Devuelve el código del punto de la actualización: (1) se ha encontrado el servidor, (2) se ha conectado con el servidor, (3) se ha encontrado la versión y (4) se ha iniciado la actualización.

Tabla extraída del blog: polaridad.es

 


5.7) Test de prueba en Thingspeak junto a adaptador USB

¡Ha llegado el momento de que nuestro ESP8266 envié por primera vez información a internet! Concretamente a la página de thingspeak.com

thingspeak

Esta página nos permite crear una cuenta gratuita en la cual podemos enviar todos los datos que recojan nuestros sensores para posteriormente consultarlos en gráficas. Es la forma más sencilla que hay de recoger los datos pues nos abstraemos de toda la parte del servidor y solo tenemos que hacer que nuestro módulo, o módulo más Arduino, envíen los datos correctamente hacia dicha página.

Para crear una cuenta es muy sencillo, debemos de ir al menú Sign Up y rellenar un ID de usuario, un email, la zona horaria en la que estamos (muy importante) y una contraseña.

Después desde el menú Channels y el botón New Channel podremos crear un nuevo canal en el que se almacenaran todos esos datos. Si tenemos varios ESP8266 enviando datos podemos hacer que cada uno de ellos los guarde en un canal distinto. Tras pulsar en New Channel tendremos que introducir un nombre descriptivo en el campo Name, y en el campo Field 1 tendremos que ponerle la descripción del sensor1, si tenemos más sensores pues vamos rellenando la tabla:

thingspeak2

Ahora pulsamos en Save Channel y vamos al apartado API Keys, necesitamos la contraseña que se nos mostrara para poder escribir datos en el canal recién creado.

thingspeak3

Con esto ya tenemos todo lo que necesitamos, ahora si ejecutamos el siguiente enlace desde el navegador de internet, donde {KEY} es vuestra API Key de escritura, veréis que en la gráfica se ha añadido un nuevo registro, podemos usar tanto el dominio como la IP.

http://thingspeak.com/update?key={KEY}&field1=10
http://184.106.153.149:80/update?key={KEY}&field1=20

Por ejemplo:

http://thingspeak.com/update?key=6YB60SDFJX4RLWBW&field1=10
http://184.106.153.149:80/update?key=6YB60SDFJX4RLWBW&field1=20

Si ahora regresamos al apartado Private View, o Public View si configuramos el canal como público, veremos la información enviada y guardada en thingspeak.

thingspeak4

Ahora vamos a realizar la misma operación pero desde el ESP8266. Para ello primero ejecutamos el comando AT para comprobar que el módulo está preparado y nos responde con OK.

Después configuramos el módulo para que funcione de forma mixta: punto de acceso más estación (o cliente y servidor):

AT+CWMODE=3

A continuación configuraremos la conexión WiFi para que el módulo se conecte a nuestra red y pueda salir a internet:

AT+CWJAP=»CasaWiFi»,»cVYJ81664XB3gMW»

Si todo ha ido bien recibiremos un OK.

A continuación debemos de ejecutar los siguientes tres comandos que indican a qué servidor debe conectarse el módulo y a qué puerto, también le indicamos la longitud de bytes que van a ocupar los datos que vamos a enviar, y por último los datos:

AT+CIPSTART=»TCP»,»184.106.153.149″,80
AT+CIPSEND=44
GET /update?key=6YB60SDFJX4RLWBW&field1=30

 También podríamos haber usado como primera línea:

AT+CIPSTART=»TCP»,»thingspeak.com»,80

En el IDE deberíamos de obtener un resultado como el que se muestra en la siguiente imagen:

thingspeak5thingspeak6

13 comentarios en “#5 Curso IoT con Arduino y ESP8266 WiFi: Modulo WiFi ESP8266 (2)”

  1. Hola, desde ya muchísimas gracias por toda esta información y su nivel de detalle y particular clara explicación. Sólo me surge la siguiente duda… La longitud de 44 bytes, como se calcula?

    1. Hola,

      Es la longitud de esta linea mas el carácter de fin de linea y salto de linea:

      GET /update?key=6YB60SDFJX4RLWBW&field1=30

      Saludos.

  2. Hola de nuevo… Necesito hacerte otra consulta… Me fue muy bien con el tutorial… Ahora estoy subiendo la apuesta de cara a mi proyecto y tengo el siguiente inconveniente.

    Cuando paso al puerto serie donde tengo comunicando al módulo el string compuesto en función a valores leidos de sensores, al módulo llegan cortados, incompletos e ilegibles, con simbología rara…

    Ej:

    ************
    String s = «»;

    s = «GET //test.asp?id=» + sId + «&value=» + sValue

    wifi.println(s);
    ****************

    Esto está bien pasado o debo pasar caracter por caracter por ser un puerto serie?

    Espero se entienda el problema…

    Desde ya muchas gracias…

    1. Hola,
      No puedes concatenar más de dos valores en la misma orden/línea, tienes que hacer varias concatenaciones.
      En la entrada publicada hoy tienes cómo se hace.

      Saludos.

  3. Hola, primero felicidades el curso esta estupendo, ahora yo tengo un problema a la hora de configurar el modulo wifi me da error y no he conseguido hacerlo arrancar (por lo que para que funcione aprovecho la habilidad del esp8266 de conectarse a la ultima conexión wifi que hizo lo cual hace y ya funciona el resto del código ) me podrían ayudar con eso

    1. Hola Sinhue,

      ¿Has seguido los pasos en los que se usa una fuente d alimentación adecuada, se cambia el firmware y se usan los comandos específicos de ese firmware?

      Debería de funcionar bien.

      Saludos.

    2. Si así es es la única parte del código que no funciona, en un principio pensé que había escrito mal algo (ya sea mis propias claves y nombres hasta un error en el código) pero no sigue sin funcionar si todo lo anterior del tutorial lo hice y salio a la perfeccion.

  4. UNA CONSULTA, EXACTAMENTE CUAL ES LA DIFERENCIA ENTRE LOS DOS POSIBLES VALORES DEL COMANDO AT+CIPMUX??, COMO AFECTAN A LA CONEXIÓN?

    1. Que el modulo permite una o varias conexiones al mismo tiempo. En el primer caso la conexión se realiza, se envían los datos, y finaliza para después seguir con la siguiente conexión, en el segundo caso se realizan varias conexiones y se permite atender a varias de ellas.

      Imagino que se usaran como cola para aceptar varias conexiones y no perderlas, si estuviera configurado con una sola conexión si se intenta realizar otra y esta ocupado la segunda dará error en el cliente.

    1. Hola,

      ¿Usas el mismo firmware que yo? ¿Tienes configurado el IDE para que imprima los caracteres NL y CR? ¿Esta el ESP8266 conectado a internet y en modo cliente?
      Debería de ir si lo tienes todo igual.

      Saludos.

  5. Durante cuanto tiempo se mantiene abierta la sesion usando AT+CIPSTART…? o la conexion sigue estable hasta que finalicemos con el comando AT+CIPCLOSE…???
    Saludos

  6. Al flashear el modulo, nunca me termina de cargar. Queda cargadno el circulo de abajo a la izquierda, pero nunca lo flashea. Aun cambiando as velocidades de Mhz, como puedo solucionarlo?

Escriba aquí su comentario