Você está na página 1de 9

2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

6 OCT 2016

Operaciones bsicas sobre un mdulo wifi


ESP8266 desde Arduino
por Vctor Ventura | publicado en: Portada | 8
Cuando Espressif lanz al mercado los primeros mdulos wifi con el integrado ESP8266 y el firmware con el
que manejarlo usando rdenes AT, lo que nos interesaba a los usuarios era integrarlo en montajes con
microcontroladores y los problemas se reducan a conocer la (antes) oscura tabla de rdenes AT del
ESP8266, las necesidades de alimentacin o la actualizacin del firmware del ESP8266.
Despus llegaron rpidamente alternativas para programar el ESP8266 e implementaciones en mdulos wifi
de formatos muy diferentes que planteaban otras inquietudes: qu mdulo wifi ESP8266 elegir en funcin
del alcance de las distintas antenas (incluyendo las externas) o la integracin fsica en nuestros montajes
de estos nuevos mdulos.
Seguramente por atender a todos esos cambios puede que no se haya insistido en lo ms elemental, la
gestin ms bsica del mdulo wifi ESP8266. Aunque en polaridad.es se puede encontrar informacin sobre el
uso del ESP8266 y hay algunas aplicaciones con vocacin de explicar de manera genrica el funcionamiento
del mdulo wifi ESP8266 usando rdenes AT, especialmente en el artculo sobre la librera para hacer
consultas HTTP desde Arduino con el mdulo wifi ESP8266, las impresiones de los lectores permiten pensar
que sera til aadir algo ms de informacin de base que ayude a los usuarios del ESP8266 a realizar sus
propias implementaciones.
Tratar las operaciones bsicas para trabajar con el ESP8266 y proponer soluciones genricas es un
objetivo varias partes muy diferentes; para ayudar a seguir el contenido del artculo, el siguiente ndice
puede servir de gua:
Controlar el mdulo wifi ESP8266 desde el ordenador por el puerto serie
Actualizar el firmware con esptool
Enviar rdenes al mdulo
Recibir datos desde el ESP8266
Analizar la respuesta buscando textos en el contenido
Buscar un texto en la respuesta del ESP8266
Buscar varios textos en la respuesta
Limitar el tiempo de espera de recepcin de la respuesta
Ejecutar una operacin compleja definida por varias rdenes AT
Una estructura de datos para representar operaciones sobre el ESP8266

Controlar el mdulo wifi ESP8266 desde el ordenador por el puerto serie


Desde una placa Arduino y utilizando su IDE es posible monitorizar el funcionamiento de un mdulo wifi
ESP8266, enviar las rdenes AT del ESP8266 y ver la respuesta pero resulta mucho ms cmodo hacerlo
desde un ordenador con una aplicacin de tipo terminal.

Utilizando CuteCom para hacer pruebas con el mdulo wifi ESP8266 por el puerto serie

Dependiendo de qu placa Arduino se utilice, puede que solamente haya disponible un puerto serie hardware,
lo que aade una pequea incomodidad al envo y la recepcin. Cambiar la velocidad de las comunicaciones es
mucho ms cmodo en una aplicacin de comunicaciones serie desde un ordenador y algunas placas Arduino
(y en algunas circunstancias) no soportan bien las velocidades ms altas de las comunicaciones serie,
especialmente 115200baudios, que es la velocidad por defecto de las ltimas versiones del firmware.
Sobre qu programa utilizar para monitorizar el ESP8266 utilizando el puerto serie, hay muchos para elegir
segn necesidades y preferencias; ltimamente estoy utilizando ms el clsico CuteCom (el de la captura de
pantalla de arriba) porque me resulta muy cmodo para repetir ciertas rdenes AT del mdulo wifi ESP8266
en las pruebas de los proyectos.
Ya se han dado aqu algunas recomendaciones sobre programas que funcionen como consola serie; por
ejemplo, al hablar de PuTTY para el control de dispositivos serie UART desde el ordenador. PuTTY, adems de
ser una aplicacin excelente, est disponible para la mayora de sistemas operativos de escritorio. Adems,

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 1/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

como PuTTY puede utilizarse para hacer de consola tanto con el puerto serie como con los familia de
protocolos de Internet (TCP/IP), incluyendo los que funcionan sobre TLS, se convierte en herramienta
habitual que devuelve con creces el (poco) tiempo empleado en configurarla y en acostumbrarse a su uso.

Utilizando PuTTY para hacer pruebas con el mdulo wifi ESP8266 por el puerto serie

Adems del software de comunicaciones serie, para conectar el mdulo wifi ESP8266 al puerto USB de un
ordenador tambin hace falta un conversor USB a serie TTL. Igual que en el caso del software, existen
varias versiones, desde las que solo se utilizan para convertir el puerto USB en un puerto serie TTL (que se
puede conseguir desde un Euro) hasta los que pueden emular diferentes protocolos (como SPI o I2C).
Igual que un programa que funcione como una consola serie, el hardware para comunicar el ordenador por
USB con un circuito lgico (no solo el ESP8266) ser una herramienta habitual en el trabajo de un
desarrollador de aplicaciones microcontroladas, merece la pena tenerlo en la caja de herramientas cuanto
antes y trabajar con el mdulo wifi ESP8266 es una excelente ocasin para hacerse con uno.

Hardware para comunicaciones serie UART USB para monitorizar el mdulo wifi ESP8266

El conversor USB a UART TTL tambin se puede utilizar para monitorizar el comportamiento de un circuito
que use el ESP8266, para hacerlo, se conectan en serie a la entrada de datos (RX) del conversor las salidas
que se quieran monitorizar con un diodo rpido (el 1N4148, por ejemplo) y una resistencia (2K2, por ejemplo)
en paralelo entre ellos. Un montaje de este tipo funciona como un sniffer serie hardware.

Ejemplo de sniffer para ESP8266 conectado a Arduino usando un conversor USB UART TTL

Aunque el sniffer de la imagen de arriba es ciertamente rudimentario (entre otras cosas no dispone de
buffer) es suficiente para monitorizar el funcionamiento de un montaje con Arduino y el ESP8266.
Quitando del esquema anterior el sniffer queda el esquema que muestra cmo conectar un mdulo wifi
ESP8266 a una placa Arduino. Adems de alimentarlo a 3V3, hay que conectar a nivel alto el pin de reset y el
de activacin del integrado (enable). Por supuesto, el pin RX de uno debe conectar al TX del otro.
Para simplificar el diagrama anterior, se ha representado una placa Arduino alimentada a 3V3 y de la que se
supone una tensin en el puerto serie tambin de 3V3. Si se utiliza un microcontrolador con un nivel de
seal en el puerto serie diferente (normalmente 5V) ser necesario, para no daar el ESP8266, utilizar un
conversor de nivel como los de los esquemas de abajo. Este circuito es el que se encuentra con frecuencia
en muchas implementaciones de mdulos comerciales listos para usar.

Conversor de nivel de seal de 5V a 3V3 para mdulo wifi ESP8266 y Arduino

Actualizar el firmware del ESP8266


Las rdenes AT del ESP8266, su terminacin, la velocidad por defecto del mdulo dependen de la versin del
firmware del ESP8266. Lo ms recomendable es asegurarse de disponer la misma versin en todos los
mdulos y, de ser posible, que sea la ltima versin.
Desafortunadamente, la mayora de los modelos de mdulos wifi ESP8266 solo disponen de 4Mbit, por lo que
no se les puede instalar la versin ms reciente. La ltima versin (oficial) de firmware que puede
instalarse en mdulos wifi ESP8266 con 4Mbit (la mayora) es la 0.9.4 que incluye la versin 0.2 de las
rdenes AT del ESP8266.
En resumen, para actualizar el firmware es necesario:
1. Descargar la versin correspondiente del firmware. La ltima versin (oficial) para un mdulo que
disponga de 4Mbit de memoria, se encuentra en la carpeta de Espressif de github. En la web de
Espressif puede descargarse la versin ms reciente del firmware, pero es muy importante verificar que
el mdulo sobre el que se instala tiene suficiente memoria.
2. Descargar la ltima versin de la herramienta de instalacin del firmware. Mi favorita es esptool que
est escrita en Python, por lo que funciona en cualquier plataforma. Adems de descargarse, tambin se
puede instalar con pip install esptool (o pip2 o python -m pip ). Por supuesto, Espressif
tambin ofrece su propia herramienta pero actualmente solo est disponible para Windows.
3. Preparar los archivos descargados; descomprimirlos en una carpeta accesible y, si procede, hacer
ejecutable la herramienta esptool, en mi caso, desde GNU/Linux, con chmod +x esptool
4. Conectar el mdulo al ordenador usando un conversor USB UART TTL que trabaje a 3V3 o utilizar un
conversor de nivel si funciona a 5V. Adems de la alimentacin, habr que conectar TX a RX del
conversor USB UART TTL, RX a TX, GPIO0 a nivel bajo (GND) y puede que GPIO2 a nivel alto (en mis pruebas

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 2/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

ha funcionado tanto conectndolo a nivel algo como desconectado). Si el mdulo tiene libre la conexin
GPIO15 (como ocurre en el ESP-12) debe conectarse a nivel bajo. RESET, que normalmente estara a nivel
alto durante el funcionamiento, puede dejarse sin conectar o conectar a nivel alto por medio de una
resistencia (10K, por ejemplo), ya que antes de empezar la grabacin puede ser necesario reiniciar el
dispositivo conectndolo a nivel bajo.
Al alimentar el mdulo ya estar disponible para actualizarlo pero, si se muestra un error de conexin,
ser necesario resetearlo conectando RESET a nivel bajo un instante y dejndolo luego al aire (sin
conectar) para el proceso de actualizacin.
El mdulo tiene picos de consumo de medio amperio (hasta 600mA, segn algunos usuarios) as que es
importante utilizar una fuente de alimentacin capaz de soportar este consumo, especialmente para
actualizar el firmware.

Conexin mdulo wifi ESP8266 ESP-01 a conversor USB UART TTL actualizar firmware

5. Ejecutar la herramienta para actualizar el firmware. En mi caso, he grabado en la misma carpeta la


herramienta y los documentos del firmware en el paso 3, as que ejecuto desde la consola:
cd ~/Datos/firmwareESP8266 (cambiar a la carpeta que contiene la herramienta y el firmware)
./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
0x00000 ./boot_v1.1.bin \
0x01000 ./user1.bin \
0x7C000 ./esp_init_data_default.bin \
0x7E000 ./blank.bin
--baud establece la velocidad del ESP8266 (115200baudios en mi caso) y --port el puerto serie al
que se conecta (en mi caso, emulado, el primer USB). Los diferentes documentos que forman el firmware
van detrs de write_flash precedidos de la direccin, siendo el documento user1.bin el que contiene
la carga til de la actualizacin.

wifi ESP8266 firmware actualizacin consola esptool captura

Enviar rdenes al mdulo wifi ESP8266


Para controlar el ESP8266 desde un ordenador habr que empezar por configurar la aplicacin para lo que
bastar con elegir el puerto al que se conecte el conversor USB UART TTL, algo como /dev/USB0 en
GNU/Linux y similares o algo como COM6 en Windows,
elegir la velocidad a la que est configurado el
ESP8266, seguramente 115200baudios,
establecer 8bits de datos ms uno de parada, sin paridad ni
handshake, y configurar el fin de lnea, dependiendo del firmware, casi siempre CR+LF.

Configurar CuteCom para monitorizar el mdulo wifi ESP8266 usando un conversor USB UART TTL

Configurar PuTTY para monitorizar el mdulo wifi ESP8266 con un conversor USB UART TTL

Una vez configurada la aplicacin (o, en su caso, almacenada y seleccionada) queda abrir la conexin (open
device y open, respectivamente, en las capturas de pantalla de los ejemplos arriba con CuteCom y
PuTTY) y ya se puede empezar a enviar rdenes al ESP8266.
Como puede verse en la tabla de rdenes AT del ESP8266, el formato para activar, desactivar, establecer
un valor y consultarlo es bastante predecible pero, en general, no es fcil recordarlos todos y es probable
que sea necesario tenerla a mano para consultarla.

La forma de enviar rdenes AT al mdulo wifi ESP8266 desde Arduino es muy sencilla: configurar las
comunicaciones con Serial.begin(115200); (o Serial1, Serial2 en las placas con varios puertos serie

hardware) y enviar las rdenes usando el formato Serial.print(orden+"\r\n");
Ejemplo de envo de rdenes AT a un mdulo wifi ESP8266 desde Arduino (conectar a un punto de acceso) Arduino

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 3/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

1 #define PUERTO_SERIE Serial // Objeto serie que corresponde a puerto serie hardware al que est conectado el mdulo wifi ESP8266
2 #define VELOCIDAD_ESP8266 115200 // Velocidad, en baudios, a la que est configurado el ESP8266
3 #define IDENTIFICADOR_WIFI "polaridad.es" // SSID (Service Set Identifier)
4 #define CLAVE_WIFI "54lLij1RiTn3MEd3v41C" // Clave del punto de acceso wifi al que se conecta el ESP8266
5
6 void setup()
7 {
8 PUERTO_SERIE.begin(VELOCIDAD_ESP8266);
9 PUERTO_SERIE.print
10 (
11 "AT+CWJAP=\""+
12 String(IDENTIFICADOR_WIFI)+
13 "\",\""+
14 String(CLAVE_WIFI)+
15 "\"\r\n"
16 );
17 }
18
19 void loop()
20 {
21 }

El ejemplo anterior muestra cmo enviar las rdenes AT del mdulo wifi ESP8266 desde Arduino. En este
caso se ilustra AT+CWJAP , que sirve para conectar a un punto de acceso. Esta orden utiliza como
argumentos el identificador del punto de acceso (SSID) y la clave, ambos entre comillas, por lo que se
convierten en un objeto Srtring y se encierran entre comillas usando el cdigo de escape ( \" ). Para
terminar la orden se usa \r\n que corresponde con CR y LF .
Para recordar que el puerto serie no siempre se identifica con Serial (en determinadas placas puede ser
Serial1 , Serial2 ) se ha definido el objeto del puerto usado asignndolo a la macro PUERTO_SERIE .
Detectando el tipo de placa usada podra aadirse un poco de inteligencia a la seleccin del puerto serie;
ms adelante se repasar cmo puede averiguar el tipo de Arduino. El resto de definiciones son las
habituales que permiten dar nombre a los valores constantes para evitar repetirlos (y equivocarse) y
hacen ms sencillo cambiarlos.
El ejemplo anterior se supone que conecta el mdulo wifi ESP8266 al punto de acceso indicado pero Estaba
ya conectado anteriormente? Ha funcionado la conexin? Para saberlo, necesitamos escuchar lo que dice
el ESP8266

Recibir datos desde el mdulo wifi ESP8266


Conectando al ordenador el sniffer de datos explicado ms arriba se puede ver lo que Arduino ha enviado al
ESP8266 y la respuesta del mismo. Para leer desde Arduino y procesar en l la informacin ser necesario
detectar con Serial.available() si ha llegado algn dato y en tal caso cargarlo con Serial.read() .
En el siguiente ejemplo se muestra cmo leer la respuesta de AT+CWJAP? , que informar si hay una
conexin con algn punto de acceso.
Ejemplo bsico de recepcin de datos enviados a un ESP8266 desde Arduino Arduino
1 #define PUERTO_ESP8266 Serial // Objeto serie que corresponde a puerto serie hardware al que est conectado el mdulo wifi ESP8266
2 #define VELOCIDAD_ESP8266 115200 // Velocidad, en baudios, a la que est configurado el ESP8266
3
4 char letra_recibida;
5
6 void setup()
7 {
8 PUERTO_ESP8266.begin(VELOCIDAD_ESP8266);
9 PUERTO_ESP8266.print("AT+CWJAP?\r\n");
10 }
11
12 void loop()
13 {
14 while(PUERTO_ESP8266.available())
15 {
16 letra_recibida=PUERTO_ESP8266.read();
17 }
18 }

Como en una placa Arduino Uno (y en otras) abrir el monitor serie resetea el programa, se puede aprovechar
para ver en la consola serie de Arduino la informacin que enva al ESP8266 como muestra la captura de
pantalla de la imagen de abajo.

Recibir datos del mdulo wifi ESP8266 desde Arduino. Ejemplo bsico

Analizar la respuesta enviada por el mdulo wifi ESP8266


Ya se ha visto cmo leer la informacin que llega a Arduino desde el ESP8266. El problema con el que hay que
tratar es que no se sabe cundo empezar a llegar, cunto tardar en llegar, qu longitud tendr y no es
muy eficiente estar esperando a que la respuesta del ESP8266 se reciba sin dejar que el microcontrolador
realice otras tareas mientras tanto.

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 4/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

Una forma sencilla de gestionar esta circunstancia es iterar sobre los datos recibidos buscando respuestas
concretas con las que, por ejemplo, activar indicadores (banderas o variables booleanas) que determinarn
si se sigue buscando en el texto recibido y qu acciones deben realizarse en funcin de la informacin que
llega desde el ESP8266. Mientras llega la respuesta el microcontrolador puede dedicarse a otras tareas, por
ejemplo, recibir datos de sensores y procesarlos.

Buscar un texto en la informacin recibida desde el ESP8266


Para ir buscando en el texto que llega desde el ESP8266 se puede ir comparando cada letra recibida con la
que corresponda al mensaje que se busca. Ser necesario usar un contador (o un puntero) que seale a la
letra que toque comparar; si el carcter que llega desde el ESP8266 es igual al que se est examinando en el
mensaje, el contador avanza, si es diferente se inicializa.
Para saber que se ha llegado al final se consulta el siguiente carcter del mensaje buscado, que ser cero
( \0 ) o se almacena la longitud del mensaje para, comparndola con el contador, saber si se ha terminado de
comparar y por tanto el mdulo wifi ESP8266 ha enviado el mensaje buscado.
En el siguiente ejemplo se utiliza la orden AT+CWLAP que devolver una lista de los puntos de acceso y
dentro de ellos se busca uno llamado wifi polaridad.es. Aunque se ha optado por verificar que el ltimo
carcter sea cero, como el buffer solamente almacena el texto buscado y se conoce su longitud, se podra
tambin comprobar si se han recibido tal nmero de letras correctas. Con un LED conectado al pin 2 se
informa de que se ha encontrado el texto que se esperaba.
Ejemplo de bsqueda de una cadena recibida por el puerto serie desde un mdulo wifi ESP8266 con Arduino Arduino
1 #if defined(ARDUINO_AVR_LEONARDO)||defined(ARDUINO_AVR_MEGA2560) /* Es una placa Arduino Mega 2560 o Arduino Leonardo? */
2 #define SERIE Serial1 /* Si es una placa Arduino Mega 2560 o Arduino Leonardo usar Serial1 */
3 #else /* En este proyecto solamente uso Placas Leonardo, Mega 2560 y Uno, as que tiene que ser un Arduino Uno si llega hasta aqu */
4 #define SERIE Serial /* Si es una placa Arduino Uno usar Serial */
5 #endif
6 #define VELOCIDAD 115200 // Velocidad (en baudios) al que est configurado el mdulo wifi ESP8266 (Cuidado con la placa utilizada, no todas o siempre son c
7 #define ORDEN "AT+CWLAP\r\n" // Buscar los puntos de acceso wifi disponibles. (Dependiendo de la versin del firmware) Las rdenes terminan en CR+LF
8 #define MENSAJE_BUSCADO "wifi polaridad.es" // Ver si est disponible el punto de acceso llamado "wifi polaridad.es"
9 #define LONGITUD_MENSAJE 18 // Se necesita guardar, al menos, 17 letras y el terminador \0
10 #define PIN_LED_ENCONTRADO 2 // Pin al que se conecta el LED que informa de que se ha encontrado el texto (el punto de acceso buscado est disponible)
11
12 #include <string.h> // strncpy
13
14 boolean esperando=true;
15 char buffer_mensaje;
16 char mensaje[LONGITUD_MENSAJE];
17 byte posicion_mensaje=0;
18
19 void setup()
20 {
21 pinMode(PIN_LED_ENCONTRADO,OUTPUT);
22 digitalWrite(PIN_LED_ENCONTRADO,LOW); // Apagar el LED (por ahora no se ha encontrado el mensaje)
23 strncpy(mensaje,MENSAJE_BUSCADO,LONGITUD_MENSAJE); // sizeof(mensaje)
24 SERIE.begin(VELOCIDAD); // Configurar el puerto serie de Arduino a la velocidad del ESP8266
25 SERIE.print(ORDEN); // Enviar la orden (consultar los puntos de acceso disponibles) al mdulo wifi ESP8266
26 }
27
28 void loop()
29 {
30 if(esperando) // Buscar infinitamente hasta que llegue el texto esperado (y si no existe el punto de acceso nunca llegar Es un ejemplo!)
31 {
32 while(SERIE.available()) // Si ha llegado algn dato por el puerto serie
33 {
34 buffer_mensaje=SERIE.read(); // almacenarlo en el buffer
35 if(buffer_mensaje==mensaje[posicion_mensaje]) // Si el dato que ha llegado es igual al que correspondera del mensaje buscado
36 {
37 posicion_mensaje++; // Pasar a la siguiente letra del mensaje
38 if(mensaje[posicion_mensaje]==0) // Ha terminado de analizarse todo el mensaje? (la ltima letra de la cadena de texto es \0)
39 {
40 esperando=false; // Si se ha terminado de analizar con xito todo el mensaje ya no se est esperando
41 digitalWrite(PIN_LED_ENCONTRADO,HIGH); // Encender el LED para indicar que se ha encontrado el texto buscado
42 }
43 }
44 else // Si la letra que ha llegado por el puerto serie no corresponde con la buscada del mensaje
45 {
46 posicion_mensaje=0; // empezar desde la primera letra del texto buscado
47 }
48 }
49 }
50 }

En el cdigo del ejemplo anterior tambin puede verse una forma de elegir el puerto serie dependiendo del
tipo de placa Arduino utilizada. En este ejemplo se supone que se dispone de tres tipos de placas para el
proyecto: una Arduino Uno, una Arduino Mega 2560 y una Arduino Leonardo. Si se trabaja con una Arduino
Uno se usar Serial y en caso contrario Serial1 .
Si se trabaja con una placa Arduino Leonardo se puede usar el mismo mtodo para detener el programa y
esperar a que la consola (el puerto serie asociado a Serial ) est disponible.
Detectar si es una placa Arduino Leonardo, Mega 2560 o Arduino Uno para usar un puerto serie u otro Arduino

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 5/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

1 #ifdef ARDUINO_AVR_LEONARDO
2 #define SERIE Serial1
3 #define ESPERA_CONSOLA while(!Serial){} /* Esperar a la consola */
4 #else
5 #define ESPERA_CONSOLA /* Si no es un Arduino Leonardo no hace falta esperar a la consola */
6 #ifdef ARDUINO_AVR_MEGA2560
7 #define SERIE Serial1
8 #else // En este proyecto solamente uso Placas Leonardo, Mega 2560 y Uno, as que tiene que ser un Arduino Uno si llega hasta aqu
9 #define SERIE Serial
10 #endif
11 #endif

Buscar varios textos en la respuesta del ESP8266


El cdigo del ejemplo anterior sirve para buscar un texto en la informacin enviada por el ESP8266 pero si
la respuesta puede incluir diferente informacin dependiendo del funcionamiento. Supongamos, para empezar
por un caso sencillo en el prximo ejemplo, que el texto enviado por el MCU ESP8266 es OK cuando la
operacin se realiza correctamente y ERROR en caso contrario, como ocurre con la orden AT+CWJAP? ,
que sirve para verificar si el mdulo wifi ESP8266 ya est conectado a un punto de acceso.
Ejemplo de comprobacin de varios mensajes recibidos desde el mdulo wifi ESP8266 hasta Arduino Arduino
1 #if defined(ARDUINO_AVR_LEONARDO)||defined(ARDUINO_AVR_MEGA2560) /* Es una placa Arduino Mega 2560 o Arduino Leonardo? */
2 #define SERIE Serial1 /* Si es una placa Arduino Mega 2560 o Arduino Leonardo usar Serial1 */
3 #else /* En este proyecto solamente uso Placas Leonardo, Mega 2560 y Uno, as que tiene que ser un Arduino Uno si llega hasta aqu */
4 #define SERIE Serial /* Si es una placa Arduino Uno usar Serial */
5 #endif
6 #define VELOCIDAD 115200 // Velocidad (en baudios) al que est configurado el mdulo wifi ESP8266 (Cuidado con la placa utilizada, no todas o siempre son c
7 #define ORDEN "AT+CWJAP?\r\n" // Verificar que est conectado a un punto de acceso
8 #define CANTIDAD_MENSAJES 2 // Se distingue entre dos mensajes: acierto y error que se identificarn con true y false
9 #define MENSAJE_ACIERTO "OK"
10 #define MENSAJE_ERROR "ERROR"
11 #define LONGITUD_MENSAJE 6 // Se necesita guardar, al menos, 5 letras y el terminador \0 (Un pequeo desperdicio al hacer una matriz en la que todos los el
12 #define PIN_LED_ACIERTO 2 // Pin al que se conecta el LED que informa del acierto
13 #define PIN_LED_ERROR 3 // Pin al que se conecta el LED que informa del error
14
15 #include <string.h> // strncpy
16
17 boolean esperando=true; // Todava no se ha encontrado el final del mensaje
18 char buffer_mensaje; // Para almacenar la ltima letra cargada desde el ESP8266
19 byte led_estado[CANTIDAD_MENSAJES]; // Un LED (pin) para cada estado
20 char mensaje[CANTIDAD_MENSAJES][LONGITUD_MENSAJE]; // Mensajes de acierto y error
21 byte posicion_mensaje[CANTIDAD_MENSAJES]; // Un contador de posicin para cada mensaje
22
23 void setup()
24 {
25 led_estado[true]=PIN_LED_ACIERTO;
26 led_estado[false]=PIN_LED_ERROR;
27 for(byte numero_mensaje=0;numero_mensaje<CANTIDAD_MENSAJES;numero_mensaje++)
28 {
29 pinMode(led_estado[numero_mensaje],OUTPUT); // Establecer el pin del LED
30 digitalWrite(led_estado[numero_mensaje],LOW); // Apagar el LED
31 posicion_mensaje[numero_mensaje]=0; // Inicializar a cero el nmero de letra a analizar de cada mensaje
32 }
33 strncpy(mensaje[true],MENSAJE_ACIERTO,LONGITUD_MENSAJE); // Preparar el mensaje de acierto
34 strncpy(mensaje[false],MENSAJE_ERROR,LONGITUD_MENSAJE); // Preparar el mensaje de error
35 SERIE.begin(VELOCIDAD); // Configurar el puerto serie de Arduino a la velocidad del ESP8266
36 SERIE.print(ORDEN); // Enviar la orden (verificar si existe conexin a un punto de acceso) al mdulo wifi ESP8266
37 }
38
39 void loop()
40 {
41 if(esperando) // Buscar infinitamente hasta que llegue el texto esperado (y si no existe el punto de acceso nunca llegar Es un ejemplo!)
42 {
43 while(SERIE.available()) // Si ha llegado algn dato por el puerto serie
44 {
45 buffer_mensaje=SERIE.read(); // almacenarlo en el buffer
46 for(byte numero_mensaje=0;numero_mensaje<CANTIDAD_MENSAJES;numero_mensaje++)
47 {
48 if(buffer_mensaje==mensaje[numero_mensaje][posicion_mensaje[numero_mensaje]]) // Si el dato que ha llegado es igual al que correspondera del mensa
49 {
50 posicion_mensaje[numero_mensaje]++; // Pasar a la siguiente letra del mensaje
51 if(mensaje[numero_mensaje][posicion_mensaje[numero_mensaje]]==0) // Ha terminado de analizarse todo el mensaje actual? (la ltima letra de la ca
52 {
53 esperando=false; // Si se ha encontrado algn mensaje y ya no se est esperando
54 digitalWrite(led_estado[numero_mensaje],HIGH); // Encender el LED correspondiente al mensaje encontrado
55 }
56 }
57 else // Si la letra que ha llegado por el puerto serie no corresponde con la buscada del mensaje
58 {
59 posicion_mensaje[numero_mensaje]=0; // empezar desde la primera letra del texto buscado
60 }
61 }
62 }
63 }
64 }

Esta nueva implementacin del mismo mtodo, que busca la coincidencia con varios posibles mensajes,
permite elegir entre diferentes acciones en funcin de la respuesta recibida desde el ESP8266, simplemente
encender el LED que corresponda.

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 6/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

Limitar el tiempo de espera de recepcin de una respuesta


Hasta ahora no se ha hecho referencia a una cuestin relevante: el tiempo de espera mximo (timeout)
antes de dar por fracasada una operacin. Si por cualquier circunstancia se pierde la conexin con el
mdulo wifi ESP8266, el mdulo con el punto de acceso, el punto de acceso con Internet o, por ejemplo, un
hipottico servidor no est disponible, el programa puede quedar bloqueado en un punto esperando
indefinidamente, por lo que habr que articular una respuesta a tales circunstancias. El tiempo de espera
mximo podr configurarse para toda la aplicacin, normalmente ser ms generoso en ese caso, o se
pueden programar tiempos de espera individuales para cada operacin.
Para comprobar que ha pasado (al menos) cierto intervalo de tiempo se suele restar de la hora actual la
hora del momento en el que inicia la cuenta y se verifica que la diferencia sea mayor que el lmite
buscado. Esta hora no tiene que ser el tiempo real, habitualmente corresponde con el intervalo que ha
transcurrido desde que el MCU empieza a contar el tiempo; esto no afecta al programa ya que lo que
interesa es tiempo transcurrido y no el absoluto.
Habitualmente, para comprobar si ha transcurrido cierto intervalo, se utiliza la expresin del tipo:
Comprobar si ha transcurrido cierto intervalo de tiempo (TIMEOUT) desde un instante (cronmetro) Arduino
1 (unsigned long)(millis()-milisegundos_al_empezar)>intervalo_de_tiempo

La variable milisegundos_al_empezar contiene el valor de millis() de cierto momento de la


ejecucin desde el que se cronometra, por lo que no es raro que su nombre haga referencia a la palabra
cronmetro. La variable intervalo_de_tiempo contiene la cantidad de milisegundos mxima que hace
cierta la expresin anterior, es decir, que representa el timeout; es habitual que sea una constante (o una
macro) y, como en el caso anterior, es frecuente que en su nombre aparezca la palabra TIMEOUT. Si se
trabaja con intervalos muy cortos se puede utilizar micros() en lugar de millis() (microsegundos en
lugar de milisegundos) aunque es mucho menos habitual y mucho menos preciso.
Comprobar si ha superado cierta cantidad de tiempo (TIMEOUT) desde un instante (cronmetro) Arduino
1 (unsigned long)(millis()-cronometro)>TIMEOUT

Un entero largo en Arduino ( unsigned long ) ocupa 4bytes (32bits), as que el valor mayor que puede
representar es 4294967295 (2 elevado a 32 menos uno, por empezar en cero). En una placa Arduino que
est funcionando continuamente el contador de milisegundos se reiniciar (volver a ser cero) cada 50 das
aproximadamente. Al restar con tipos de datos sin signo se reproduce el mismo comportamiento (dar la
vuelta al contador) por lo que es viable controlar indefinidamente el timeout.
Esperar un intervalo de tiempo mximo (TIMEOUT) antes de desistir en una operacin sobre el mdulo wifi ESP8266
Arduino

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 7/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

1 #if defined(ARDUINO_AVR_LEONARDO)||defined(ARDUINO_AVR_MEGA2560) /* Es una placa Arduino Mega 2560 o Arduino Leonardo? */


2 #define SERIE Serial1 /* Si es una placa Arduino Mega 2560 o Arduino Leonardo usar Serial1 */
3 #else /* En este proyecto solamente uso Placas Leonardo, Mega 2560 y Uno, as que tiene que ser un Arduino Uno si llega hasta aqu */
4 #define SERIE Serial /* Si es una placa Arduino Uno usar Serial */
5 #endif
6 #define VELOCIDAD 115200 // Velocidad (en baudios) al que est configurado el mdulo wifi ESP8266 (Cuidado con la placa utilizada, no todas o siempre son c
7 #define ORDEN "AT+CWJAP?\r\n" // Verificar que est conectado a un punto de acceso
8 #define CANTIDAD_MENSAJES 2 // Se distingue entre dos mensajes: acierto y error que se identificarn con true y false
9 #define MENSAJE_ACIERTO "OK"
10 #define MENSAJE_ERROR "ERROR"
11 #define LONGITUD_MENSAJE 6 // Se necesita guardar, al menos, 5 letras y el terminador \0 (Un pequeo desperdicio al hacer una matriz en la que todos los el
12 #define PIN_LED_ACIERTO 2 // Pin al que se conecta el LED que informa del acierto
13 #define PIN_LED_ERROR 3 // Pin al que se conecta el LED que informa del error
14 #define TIMEOUT 5000 // Espera 5 segundos la respuesta del ESP8266 (y su anlisis) antes de desistir
15
16 #include <string.h> // strncpy
17
18 boolean esperando=true; // Todava no se ha encontrado el final del mensaje
19 boolean encontrado=false; // Salvo que se encuentre el punto de acceso se considera que la operacin ha fracasado
20 char buffer_mensaje; // Para almacenar la ltima letra cargada desde el ESP8266
21 byte led_estado[CANTIDAD_MENSAJES]; // Un LED (pin) para cada estado
22 char mensaje[CANTIDAD_MENSAJES][LONGITUD_MENSAJE]; // Mensajes de acierto y error
23 byte posicion_mensaje[CANTIDAD_MENSAJES]; // Un contador de posicin para cada mensaje
24 unsigned long cronometro;
25
26 void setup()
27 {
28 led_estado[true]=PIN_LED_ACIERTO;
29 led_estado[false]=PIN_LED_ERROR;
30 for(byte numero_mensaje=0;numero_mensaje<CANTIDAD_MENSAJES;numero_mensaje++)
31 {
32 pinMode(led_estado[numero_mensaje],OUTPUT); // Establecer el pin del LED
33 digitalWrite(led_estado[numero_mensaje],LOW); // Apagar el LED
34 posicion_mensaje[numero_mensaje]=0; // Inicializar a cero el nmero de letra a analizar de cada mensaje
35 }
36 strncpy(mensaje[true],MENSAJE_ACIERTO,LONGITUD_MENSAJE); // Preparar el mensaje de acierto
37 strncpy(mensaje[false],MENSAJE_ERROR,LONGITUD_MENSAJE); // Preparar el mensaje de error
38 SERIE.begin(VELOCIDAD); // Configurar el puerto serie de Arduino a la velocidad del ESP8266
39 SERIE.print(ORDEN); // Enviar la orden (verificar si existe conexin a un punto de acceso) al mdulo wifi ESP8266
40 cronometro=millis();
41 }
42
43 void loop()
44 {
45 if(esperando) // Buscar infinitamente hasta que llegue el texto esperado (y si no existe el punto de acceso nunca llegar Es un ejemplo!)
46 {
47 while(SERIE.available()) // Si ha llegado algn dato por el puerto serie
48 {
49 buffer_mensaje=SERIE.read(); // almacenarlo en el buffer
50 for(byte numero_mensaje=0;numero_mensaje<CANTIDAD_MENSAJES;numero_mensaje++)
51 {
52 if(buffer_mensaje==mensaje[numero_mensaje][posicion_mensaje[numero_mensaje]]) // Si el dato que ha llegado es igual al que correspondera del mensa
53 {
54 posicion_mensaje[numero_mensaje]++; // Pasar a la siguiente letra del mensaje
55 if(mensaje[numero_mensaje][posicion_mensaje[numero_mensaje]]==0) // Ha terminado de analizarse todo el mensaje actual? (la ltima letra de la ca
56 {
57 encontrado=numero_mensaje; // (numero_mensaje!=0) Hay conexin con el punto de acceso
58 esperando=false; // Si se ha encontrado algn mensaje y ya no se est esperando
59 digitalWrite(led_estado[numero_mensaje],HIGH); // Encender el LED correspondiente al mensaje encontrado
60 }
61 }
62 else // Si la letra que ha llegado por el puerto serie no corresponde con la buscada del mensaje
63 {
64 posicion_mensaje[numero_mensaje]=0; // empezar desde la primera letra del texto buscado
65 }
66 }
67 }
68 if((unsigned long)(millis()-cronometro)>TIMEOUT&&!encontrado) // Se ha superado el tiempo de espera y no hay conexin (se ha verificado que no hay o no
69 {
70 digitalWrite(PIN_LED_ERROR,HIGH); // Si ha superado el tiempo de espera encender el LED de error
71 esperando=false;
72 }
73 }
74 }

El cdigo anterior muestra una implementacin muy bsica de la limitacin del tiempo de espera incorporando
las lneas marcadas con respecto de ejemplo que le precede. Como la verificacin del timeout se realiza
despus de procesar los datos que llegan desde el mdulo wifi ESP8266, puede darse por buena la operacin
aunque la recepcin tarde ms que el tiempo de espera impuesto.

Ejecutar una operacin compleja definida por varias rdenes AT


Para tener una referencia de ejemplo de la finalidad de la aplicacin que explota el mdulo wifi ESP8266,
supongamos que se trata de almacenar informacin en una base de datos a la que se accede por medio de
un servicio web para mantener un registro de la temperatura. El siguiente cdigo lee un sensor conectado
a una entrada analgica cada cierto intervalo de tiempo, calcula el valor medio y, transcurrido un intervalo
de tiempo mayor, lo enva al servidor web (al estilo IoT) por medio de una peticin HTTP (POST, GET).
Ejemplo de lectura de temperatura para enviar datos por wifi con el mdulo ESP8266 Arduino

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 8/9
2017-6-6 Operaciones bsicas sobre un mdulo wi ESP8266 desde Arduino

1 #define PIN_TEMPERATURA A0 // Pin analgico al que se conecta la salida del sensor de temperatura LM35
2 #define INTERVALO_LECTURA_TEMPERATURA 30000 // Leer la temperatura cada 30 segundos (30*1000)
3 #define INTERVALO_GRABACION_TEMPERATURA 300000 // Grabar la media de la temperatura cada 5 minutos (5*60*1000)
4
5 unsigned long muestras=0; // Nmero de veces que se ha medido la temperatura (para calcular la media)
6 float temperatura; // de -55.0 C a +150 C|de -550 mV a +1500 mV|de 0 V a 2.050 V| analogRead*5.0/1023.0*100-55.0->analogRead/2.46-55.0
7 float media_temperaturas=0.0;
8 unsigned long cronometro_lectura_temperatura;
9 unsigned long cronometro_grabacion_temperatura;
10
11 void setup()
12 {
13 Serial.begin(9600);
14 cronometro_lectura_temperatura=millis();
15 cronometro_grabacion_temperatura=millis();
16 }
17
18 void loop()
19 {
20 if((unsigned long)(millis()-cronometro_lectura_temperatura)>INTERVALO_LECTURA_TEMPERATURA)
21 {
22 cronometro_lectura_temperatura=millis();
23 temperatura=analogRead(PIN_TEMPERATURA)/2.46-55.0;
24 muestras++;
25 media_temperaturas=(float)temperatura/(float)muestras+media_temperaturas*(float)(muestras-1)/(float)(muestras
26 }
27 if((unsigned long)(millis()-cronometro_grabacion_temperatura)>INTERVALO_GRABACION_TEMPERATURA)
28 {
29 cronometro_grabacion_temperatura=millis();
30 // Aqu ira la parte del cdigo que graba la temperatura. Para verificar el funcionamiento, en este ejemplo simplemente se muestra en la consola
31 Serial.println("\nTemperatura media "+String(temperatura,DEC)+" C ("+String((float)millis()/1000.0,DEC)+" s)\n"
32 }
33 }

En este ejemplo de grabacin de temperaturas, se accede a un servidor web cada cinco minutos. Aunque la
disponibilidad no sea especialmente alta es de esperar que la propuesta funcionara pero si fuera necesaria
una frecuencia de grabacin mayor habra que implementar otros recursos, por ejemplo, se podra utilizar un
buffer de datos que esperan enviarse, para mandar varios cuando el servidor pueda atender y acopiarlos
para cuando no est disponible. Si la frecuencia con la que se necesita grabar los datos fuera an mayor
habra que plantear otro tipo de protocolos como alternativa al HTTP o incluso sustituir TCP por UDP para
poder enviar a la velocidad requerida la mayora de los datos an a costa de perder alguno.
Las operaciones que forman la tarea que se trata de realizar para ir enviando la temperatura seran:
Reiniciar el mdulo wifi
Desconectar del punto de acceso actual (por si existiera una conexin por defecto)
Establecer la configuracin. Para el ejemplo se supone que hay que configurar el modo de conexin
(simple) y el papel en las comunicaciones wifi (estacin)
Conectar al punto de acceso
Verificar que la conexin es correcta (en realidad, este es el punto de entrada) Si no hay conexin,
empezar el proceso desde el principio
Conectar al servidor
Enviar la peticin HTTP con los datos que deben almacenarse
El orden de las operaciones no tiene que ser exactamente as (aunque lo sea la operativa) y cada paso
puede necesitar varias rdenes AT del ESP8266, por ejemplo, la configuracin de la lista anterior
necesitara dos: AT+CIPMUX=0 y AT+CWMODE=1 .

Una estructura de datos para representar operaciones sobre el ESP8266


En los ejemplos anteriores, aunque de forma muy bsica, ya se insina una solucin genrica al problema:
utilizar una estructura de datos que almacene las posibles respuestas y las acciones que deben tomarse en
cada caso; enviar una accin, esperar una respuesta y proceder conforme a lo que la respuesta signifique.
Como cada operacin compleja requerir varias rdenes AT del ESP8266, la estructura de datos deber
enlazar una operacin con otras, siguientes o anteriores, las que corresponda realizar en cada caso en
funcin de la respuesta del ESP8266.
En los ejemplos anteriores se buscaba un mensaje dentro de la respuesta del ESP8266 y se interpretaba
como acierto o error. Adems de una recepcin (y anlisis) de todo el texto recibido, para tener un mnimo
genrico es recomendable atender tambin a la finalizacin del mensaje o, dicho de otro modo, a la
disponibilidad del mdulo wifi ESP8266 para recibir nuevas rdenes. De esta manera, el cambio a un estado
que podramos llamar, por ejemplo, wifi disponible, podra ser recibir el nombre del punto de acceso y
recibir el texto ERROR o el texto OK significara que el ESP8266 ha terminado la respuesta y que se puede
enviar ya la siguiente orden AT al ESP8266.
Estructura de datos bsica para almacenar una operacin compleja sobre el ESP8266 formada por varios pasos Arduino

https://polaridad.es/modulo-wi-esp8266-arduino-operacion-basica-conexion/ 9/9

Você também pode gostar