IoT | ESP8266-01 con Arduino y sincronización con ThingSpeak.com

En esta entrada vamos a aprender como enviar un array de variables desde la placa Arduino al módulo ESP8266-01 vía canal serie, conectar el módulo a nuestra red WIFI doméstica, y publicar los datos en la plataforma ThingSpeak.com periódicamente para su visualización desde nuestro PC o teléfono móvil.

Diagrama general

En esta entrada encontrareis todo lo necesario para:

  • Cablear y alimentar el módulo ESP8266-01 de forma correcta
  • Cargar Software y conectarnos a nuestra red WIFI domestica
  • Resolución de los errores más comunes
  • Enviar variables desde Arduino al módulo ESP8266-01 por el canal serie (SoftwareSerial.h) y publicarlas en la web ThingSpeak.
  • Se incluye un ejemplo donde enviamos un array de variables float desde la placa Arduino (que podrían representar las lecturas de varios sensores) al módulo ESP8266-01 a través del canal serie y se publican en la web ThingSpeak.

Pinout ESP8266-01Pinout ESP8266-01

  1. GNDGND
  2. GPIO2 es una entrada/salida de propósito general, similar a un pin digital de la placa Arduino. Es el pin digital número 2. Lo mantendremos siempre en estado HIGH.
  3. GPIO0 es una entrada salida de propósito general, similar a un pin digital de la placa Arduino. Es el pin digital número 0. LOW para programar, HIGH para ejecutar código.
  4. RXD es el pin por donde se van a recibir los datos del puerto serie.
  5. TXD es el pin por donde se van a transmitir los datos del puerto serie.
  6. CH_PD pin para apagar y encender el ESP-01: con 0V (LOW) se apaga, con 3,3V (HIGH) se enciende. Lo mantendremos siempre en estado HIGH.
  7. RESETpin para resetear el ESP8266-01: con 0V (LOW) se resetea. Lo mantendremos siempre en estado HIGH.
  8. Vcc es por donde alimentamos el ESP8266-01. Funciona a 3,3V y admite un máximo de 3,6V. La corriente suministrada debe ser mayor que 200mA.

El módulo acepta dos modos de funcionamiento en función de conexionado del pin GPI0 que hayamos realizado:

  1. GPIO0 a HIGH y GPIO2 a HIGH → Modo Flash → ejecuta el programa cargado.
  2. GPIO0 a LOW y GPIO2 a HIGH → Modo UART → a la espera de cargar un programa.
 GPIO0GPIO2
Modo UART (programar)LOWHIGH
Modo FLASH (ejecutar código)HIGHHIGH

La única diferencia entre ambas configuraciones es el pin GPIO0, que en un caso esta conectado a GND (Modo FLASH) y en el otro está al aire y unido internamente a +3.3V a través de una resistencia pull-up (Modo UART).

Material necesario:

ComponenteCantidadComprar
Arduino Nano1Comprar en Amazon
ESP8266–01 WIFI1Comprar en Amazon
Batería 3.7V 4000mAh1Comprar en Amazon
DCDC step-up 5V1Comprar en Amazon
Regulador LM1117-3.3V 0.8A1Comprar en Amazon
Surtido cabezal hembra 2.54mm1Comprar en Amazon

Cargar Software al módulo ESP8266-01

  • Conexionado necesario

La conexión del módulo ESP8266-01 con la placa Arduino es algo compleja, ya que el cableado necesario para cargar software y el necesario para ejecutarlo es algo diferente. Para cargar software al módulo WIFI utilizaremos los pines RX y TX de la placa Arduino, mientras que en funcionamiento normal,  para enviar variables desde la placa Arduino al módulo WIFI utilizaremos la librería SoftwareSerial.h y los pines D10 y D11.

Por lo tanto, para cargar software al módulo ESP8266-01 utilizaremos los pines TX y RX de la placa Arduino, y el mismo lenguaje y entorno de programación que en Arduino:

Pero en funcionamiento normal, una vez cargado el software al módulo WIFI, utilizaremos los pines D10 y D11 como canal serie (librería SoftwareSerial.h) para comunicar la placa Arduino con el módulo WIFI y recibir por parte de este las lecturas de los sensores que haya que subir a ThingsPeak.com:

La necesidad de modificar el conexionado para cargar software y para ejecutarlo hace que haya que buscar una solución fácil para hacer el intercambio de forma sencilla. La solución que he escogido para poder cargar software de forma sencilla es la siguiente. No soldaremos el módulo WIFI directamente a la placa de soldadura, lo conectaremos a través de un conector 4×2 hembra como el de la imagen, de forma que podamos conectar/desconectar el módulo de forma simple. Ademas de esto, utilizaremos otro conector 4×1 hembra donde sacaremos las siguientes cuatro señales: RX, TX, GND, +3.3V de la salida del regulador necesarias para la carga de software. Con estos dos simple conectores, ahorraremos mucho tiempo y dolores de cabeza mas adelante:

 ESP8266-01 Arduino, conectores necesariosDe esta forma, cuando conectemos el módulo al conector 4×2 para su funcionamiento normal, este quedará conectado a los pines D10 y D11, mientras que si queremos cargar software, lo podremos hacer de forma sencilla desconectando el módulo y utilizando las señales del conector 4×1 y cable macho hembra.

A la hora de alimentar el módulo, es muy importante usar una fuente capaz de proporcionar mínimo 250mA de forma continua. En este caso, he utilizado una batería de +3.7V y un regulador de tensión LM1117-3.3V para garantizar una tensión constante de +3.3V. Utilizando un interruptor manual S1 encendemos/apagamos el módulo ESP8266-01 de forma fácil. Aquí os dejo la opción que he utilizado yo:

ESP8266-01 conexión

** El interruptor nos facilitará mucho el trabajo como veremos mas adelante, recomiendo instalarlo. 

Como hemos visto, el módulo ESP8266-01 cuenta con dos modos de funcionamiento en función de la conexión con el pin GPIO0 que hagamos (+3.3V o GND), ‘modo programación’ y ‘modo ejecutar código’. Por lo tanto, el primer paso para cargar software es cablear el módulo con la placa Arduino de forma que activemos el ‘modo programación’ o ‘UART’. Para ello, utilizaremos los pines del conector 4×1 que hemos instalado en la placa de soldadura y conectaremos el módulo de la siguiente forma utilizando cable macho-hembra:

Conexión módulo ESP8266-01. Arduino

Para cargar software utilizamos los pines TX/RX de la placa Arduino. Fijaos bien. El pin TX de la placa Arduino tiene que estar conectado al pin RX del módulo ESP8266-01 y viceversa. ¡Ni se os ocurra conectar el pin TX con el TX! El pin TX solo habla o transmite, y el RX solo escucha… de nada servirá conectar dos pines que solo hablan, nunca llegarán a atenderse.

Una vez cableado el módulo y antes de cargar nada, vamos a realizar un pequeño diagnóstico del dispositivo para asegurar que está vivo y bien cableado para cargar código. Para ello, cableamos el módulo como en la imagen anterior, abrimos el monitor serie y reiniciamos el módulo (quitar y poner alimentación con el switch S1). Recibiremos una traza de este tipo. Si veis caracteres sin sentido, tendréis que ajustar el ‘Baud Rate’ del monitor serie de Arduino hasta que podáis leer las trazas que envía el módulo. Deberías recibir algo como esto:Diagnóstico ESP ArduinoEl primer parámetro de boot mode: (1,0) tiene que estar a 1. Si está a uno el módulo ha arrancado en modo ‘cargar software’. No hagáis caso del segundo parámetro entre paréntesis. Si por el contrario recibís algo diferente, revisad el cableado.

¡¡Estamos listo para cargar software!!

Consejo: no alimentéis el módulo directamente desde la salida +3.3V de la placa Arduino. Puede que os funcione para cargar software, pero tendréis problemas cuando intentéis conectaros a vuestra red domestica (lo digo por experiencia).

Nota: hay mucho debate en torno a si se puede conectar en canal TX de la placa Arduino (que es de +5V) directamente al módulo ESP8266-01 (que trabaja a +3.3V). Como veis yo he hecho una conexión directa, de hecho, es la única manera en la que me ha funcionado. En teoría habría que utilizar o un divisor resistivo o un level shifter, pero a mi no me han dado resultado. Hay varias webs donde se indica que estos pines son compatibles con +5V (aquí, aquí y aquí), pero el datasheet del módulo no lo especifica. Yo lo tengo conectado directamente y funciona sin problemas.

  • Cargar Software

Abrimos el IDE de Arduino: Archivo → Preferencia. En el recuadro donde pone ‘Gestor de URLs adicionales de tarjetas’ pegamos el siguiente enlace:

https://arduino.esp8266.com/stable/package_esp8266com_index.json

Vamos al gestor de tarjetas (Herramientas → Placas → Gestor de tarjetas…) y buscamos ESP8266. Instalamos la librería (en la imagen ya estaría instalado):

Instalando librería ESP8266-01 Arduino

Instalado. Ahora, en gestor de tarjetas, podemos elegir el módulo ESP8266 como una placa más justo con los diferentes modelos de Arduinos. Cuando seleccionamos esta placa, el IDE de Arduino sabrá que el software que va a cargar, va destinado a un módulo ESP8266. No hace falta modificar la configuración por defecto, la dejamos tal cual está:

Librería instalada con éxito ESP8266-01 Generic ESP8266 Module

Una vez descargado y seleccionado el módulo, en la lista de ejemplos disponibles (Archivo → Ejemplos) aparecerá una lista de ejemplo para cargar en el módulo ESP. En primer lugar, recomiendo cargar alguno de los ejemplos que vienen con la librería ‘<ESP8266WiFi.h>’, en concreto el sketch WiFiScan (Archivo → Ejemplos → ESP8266WiFi WiFiScan). Este ejemplo muestra todas las redes WIFI detectadas por el módulo y las publica por el canal serie. 

Una vez abierto el ejemplo, pulsamos ‘Subir’ como si de un sketch normal se tratará. Automáticamente, el software se subirá al módulo ESP8266-01. Mantened el módulo apagado mientras se está compilando el programa, y en el instante en el vemos ‘Subiendo…’ en el IDE de Arduino, encended el módulo (con el switch).

Cargando software en ESP8266-01 Arduino

Si habéis seguido los pasos de forma satisfactoria hasta ahora, deberíais ver en el monitor serie una lista con todas las redes WIFI detectadas por el módulo. Si tenéis problemas para cargar este software o no detectáis redes WIFI, en el apartado ‘Problemas comunes con ESP8266-01’ tenéis algunas pistas útiles para solucionar los problemas más comunes. No sigáis adelante hasta no solventar estos problemas.

Si habéis conseguido cargar el ejemplo de forma correcta, y detectáis vuestra red doméstica, felicidades, lo más complicado ya está hecho. Ahora veamos como sincronizar los datos que ha recibido el módulo por el canal serie con la web ThingSpeak.com y visualizarlos de forma gráfica.

Sincronizar datos con ThingSpeak.com

Una vez que somos capaces de cargar Software y de que el módulo detecta nuestra red doméstica, vamos a crear una cuenta en ThingsSpeak.com y subir datos de prueba a la web. Para ello utilizaremos la librería ThingSpeak.h. Podéis descargarla aquí.

Tras instalar la librería, el siguiente paso es crear una cuenta el ThingSpeak.com. Acudimos a la web, nos registramos con nuestro email, y creamos un nuevo canal en la pestaña ‘Channels → My Channels’. En este ejemplo vamos a escribir sobre 4 campos o gráficas, por lo que habrá que generar estos campos también en la web.

Ejemplo thingspeak.com arduino ESP8266-01

Una vez creada la cuenta, cargamos en ejemplo WriteMultipleFields (Archivo → Ejemplos → ThingSpeak → WiFiScan → ESP8266 → Program board directly → WriteMultipleFields) en el módulo ESP8266-01 modificando la pestaña secrets.h con los datos de vuestra red WIFI y vuestra cuenta ThingSpeak.com. 

// Use this file to store all of the private credentials 
// and connection details

#define SECRET_SSID "MySSID"		// replace MySSID with your WiFi network name
#define SECRET_PASS "MyPassword"	// replace MyPassword with your WiFi password

#define SECRET_CH_ID 000000	    // replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "XYZ"   // replace XYZ with your channel write API Key

Las claves API para sincronizar vuestro canal las tenéis en la pestaña ‘API Keys’ de ThingSpeak.

Este ejemplo simplemente publica 4 valores aleatorios en nuestro canal utilizando el comando ThingSpeak.writeFields(). Cargáis el software y accedéis a la web. Los cuatro canales que hemos creado deberían empezar a actualizarse con los valores aleatorios del ejemplo.

Es importante mencionar que para estos ejemplo, solo estamos utilizando la placa Arduino como medio para cargar el software en el módulo ESP8266-01, para nada más. No estamos ejecutando nada con ella. Esto valores aleatorios que hemos subido a ThingSpeak.com se han generado en  el cerebro (MCU) del módulo ESP8266-01. En el siguiente ejemplo en cambio, vamos a generar una serie de valores aleatorio en la placa Arduino (que podría representar las lecturas de algún sensor), y enviarlas al módulo ESP vía SoftwareSerial para que este las publique en la web.

¿Veis la diferencia no? 😉

Enviar datos desde Arduino al módulo ESP8266-01 por el canal serie y subir datos a la plataforma ThingSpeak.com

SoftwareSerial.h - ESP8266-01 Arduino

Para enviar datos por el canal serie he utilizado la librería SoftwareSerial.h. Esta librería permite utilizar casi cualquier pin de la paca Arduino como canal serie, liberando los pines TX y RX para poder visualizar variables por el monitor serie al mismo tiempo que se envían las variables.

Enviar datos desde la placa Arduino al módulo ESP8266-01 por el canal serie es muy sencillo. Primero se incluye la librería y se declara el nombre de la conexión junto con los pines que queremos utilizar como sustitutos de TX y RX, en este caso los pines digitales D10 y D11:

#include <SoftwareSerial.h>
SoftwareSerial ESPSerial(10, 11); // RX, TX

Es necesario declarar la longitud del array que vamos a enviar por el canal serie que hemos creado, en este caso, 3 variables tipo float. La declararemos en el módulo ESP de la misma forma. Así, tanto la placa Arduino como el módulo WIFI conocerán la longitud de los datos que van a manejar:

const size_t LengthData = 3;
float data[LengthData];

Finalmente se crea el array que queremos enviar por el nuevo canal serie que hemos creado (de nombre ESPSerial) y los enviamos utilizando el comando ESPSerial.write(). En este ejemplo sincronizaremos con la web ThingSpeak.com estas tres variables aleatorias, pero podéis sustituirlas por las lecturas de algún sensor como hemos hecho en el siguiente ejemplo.

data[0] = random(0, 100) - 0.2;
data[1] = random(0, 100) + 4.9;
data[2] = random(0, 100) + 90.158;

ESPSerial.write((byte*)data, LengthData * sizeof(data[0]));

Para recibir estos datos en el módulo ESP8266-01 haremos lo siguiente. Utilizando el comando Serial.available() esperamos hasta que los tres valores se hayan almacenado en el buffer, y leemos los datos utilizando el comando Serial.readBytes():

if (Serial.available() >= LengthData * sizeof(data[0])) {
    Serial.readBytes((byte*)data, LengthData * sizeof(data[0]));
end

Las variables que ha recibido quedarán registradas dentro de la variable data.

La librería SoftwareSerial.h solo la utilizaremos en la placa Arduino, por lo que el comando para leer el canal serie en el módulo ESP8266-01 es Serial.readBytes() y no ESPSerial.readBytes().

A continuación, os dejo un ejemplo completo donde enviamos 3 tipo float variables desde la placa Arduino al módulo ESP8266-01 vía canal serie, y las publicamos en la plataforma ThingSpeak. Este ejemplo incluye también la recepción por parte de la placa Arduino de la información relativa a la conexión enviada por el módulo ESP8266-01.

Cargar en Arduino

Cargando software ESP8266-01 Arduino

#include <SoftwareSerial.h>
SoftwareSerial ESPSerial(10, 11); // RX, TX

const size_t LengthData = 3;
float data[LengthData];
int ESP_Status;

void setup() {
  Serial.begin(115200);
  ESPSerial.begin(9600);
  Serial.println("READY");
  delay(1000);
}

void loop() {
  data[0] = random(0, 100) - 0.2;
  data[1] = random(0, 100) + 4.9;
  data[2] = random(0, 100) + 90.158;
  ESPSerial.write((byte*)data, LengthData * sizeof(data[0]));
  Serial.println("ENVIADO");
  for (int i = 20; i > 0; i--) {
    Serial.println(i);
    delay(1000);
  }

  if (ESPSerial.available()) {
    ESP_Status = ESPSerial.parseInt();
  }
  Serial.print("ESP dice: ");
  Serial.println(ESP_Status);
}

Una vez cargado el software, ya podemos conectar el módulo ESP8266-01 al conector 4×2, saliendo del ‘modo programación’ o ‘modo UART‘ para pasar al modo ‘ejecutar código’ o ‘modo FLASH‘:

Conexión ESP8266-01. Arduino

Cargar en módulo ESP8266-01

#include "ThingSpeak.h"
#include "secrets.h"
#include <ESP8266WiFi.h>

#define SECRET_SSID "Tech_D0002774"    // replace MySSID with your WiFi network name
#define SECRET_PASS "GSCSVRRP"  // replace MyPassword with your WiFi password

#define SECRET_CH_ID 782272     // replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "5XFY1WR0IIJ3NL01"   // replace XYZ with your channel write API Key

char ssid[] = SECRET_SSID;   // your network SSID (name)
char pass[] = SECRET_PASS;   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

const size_t LengthData = 3;
float data[LengthData];
int ESP_Status;

void setup() {
  Serial.begin(9600);  // Initialize serial

  WiFi.mode(WIFI_STA);
  ThingSpeak.begin(client);  // Initialize ThingSpeak
  delay(1000);
}

void loop() {
  //
  if (Serial.available() >= LengthData * sizeof(data[0])) {
    Serial.readBytes((byte*)data, LengthData * sizeof(data[0]));

    if (WiFi.status() != WL_CONNECTED) {
      while (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
        delay(3000);
      }
    }

    ThingSpeak.setField(1, data[0]);
    ThingSpeak.setField(2, data[1]);
    ThingSpeak.setField(3, data[2]);
    ESP_Status = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

    Serial.print(ESP_Status);
  }

  delay(100);
}

Problemas comunes con ESP8266-01

  • Comprobar si está vivo

Simplemente conectamos el módulo como hemos visto al comienzo de esta entrada, abrimos el monitor serie de Arduino, y reiniciamos el módulo (quitar y poner alimentación utilizando el interruptor). Si veis caracteres sin sentido, tendréis que ajustar el ‘Baud Rate’ del monitor serie de Arduino hasta que podáis leer las trazas que envía el módulo. En mi caso, 78400:

modo cargar software a ESP8266-01

Si recibimos ‘cosas’ legibles, como por ejemplo el mensaje anterior, enhorabuena, el módulo está bien conectado y ha respondido a nuestra llamada. ¡Está vivo!

  • No consigo cargar Software

En primer lugar, asegurad que el módulo está bien cableado y comprobar el punto 1). Para cargar Software es necesario activar el modo programación como hemos visto en anteriormente.

Igual que en el ejemplo anterior, abrimos el monitor serie y reiniciamos el módulo (quitar y poner alimentación). Recibiremos una traza de este tipo. Si veis caracteres sin sentido, tendréis que ajustar el ‘Baud Rate’ del monitor serie de Arduino hasta que podáis leer las trazas que envía el módulo.

modo cargar software a ESP8266-01

El primer parámetro de boot mode: (1,0) tiene que estar a 1. Si está a uno el módulo ha arrancado en modo ‘cargar Software’. No hagáis caso del segundo parámetro entre paréntesis. Si por el contrario recibís algo diferente, revisad el cableado.

Si habéis comprado el módulo en ebay o aliexpress, es muy probable que os encontréis con el siguiente problema que tuve yo, y es que, a pesar de tener bien la conexión, a pesar de recibir correctamente desde el módulo confirmación de que estamos en modo programación, no conseguimos cargar e Software y obtenemos continuamente este mensaje:

Error subiendo código a ESP8266-01

La solución es bien sencilla, a pesar de no tener claro por qué se original el problema. Simplemente, mantened el módulo apagado mientras se está compilando el programa, y en el instante en el vemos ‘Subiendo…’ en el IDE de Arduino, encended el módulo.  Voila… el programa comienza a subirse:

  • No detecta redes WIFI

En caso de que el módulo no detecte ninguna red, y si estáis completamente seguros de que hay redes disponibles, lo mas probable es que el módulo no esté recibiendo la energía que necesita para poder funcionar. No olvidéis que este módulo necesita 250mA para poder funcionar de forma correcta.

Si habéis alimentado el módulo desde la salida +3.3V de la placa Arduino, es muy probable que no consigáis arrancar.

SUERTE A TODO 😉


También te podría interesar:

Como hacer un drone con Arduino, paso a paso

Boya marina Arduino con GPS y comunicación Iridium vía satélite

 

Rate this post
3 Comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *