Vídeo
A continuación, encontrara el vídeo en donde se explica el funcionamiento del circuito.
Acerca del proyecto
En este post vamos a hacer la primera conexión entre mqtt usando como servidor mosquitto y el esp8266-01 conectado al arduino, se va a explicar paso a paso que se necesita para poder enviar un mensaje y poderlo visualizar por el momento en la terminar serial.
El alcance de este post es poder conectar el esp8266 a la red wifi, crear en local el servidor habilitando el protocolo mqtt y poder crear un topic para que se pueda suscribir el broker y enviar mensajes, en post futuros vamos a tomas la información que nos llega y manipularla.
Conocimiento previo
Antes de iniciar debemos tener en cuenta los siguientes post para avanzar con el esp8266 y su conexión, aunque se explicara paso a paso, recomiendo dar un repaso de los temas que menciono a continuación.
Post | Descripción |
---|---|
Datasheet ESP8266 | Como vamos a trabajar con el esp8266 es bueno tener en cuenta sus características, pines y conexiones. |
Conectar ESP8266 | La primera conexión que vamos a realizar con el ESP8266 es para cargar el firmware, pero debemos verificar que el modulo este funcionando, para ello este post explica como conectar el modulo vía USB-serial. |
ESP8266 flasher firmware | Uno de los pasos es cargar el firmware apropiado para la esp8266, recomiendo dar un repaso a este post. |
Mosquitto server | Antes de iniciar debemos conocer el servidor quien sera el encargado de recibir la información, sus características y como instarlo en los diferentes sistemas operativos. |
Materiales
Software
Para el desarrollo de este proyecto vamos a requerir los siguientes programas, librerías e instaladores, a continuación encontrara los link para que los descargue y los post donde podrá realizar la instalación.
Software | Descripción | Link |
---|---|---|
Arduino | ||
Software flasher esp8266 | Encontrara el firmware y el programa para poder hacer el flasher del esp. | ESP8266 software |
PubSubClient | Esta biblioteca proporciona un cliente para realizar mensajes simples de publicación/suscripción con un servidor que admita MQTT. | pubsubclient por Nick O'Leary |
WiFiEsp | La líbreria WiFiEsp permite que la placa arduino se conecte a intenet. | WiFiEsp por bportaluri |
Otros instaladores | ||
Instalar mosquitto | Tenemos unos post en donde explicamos la instalación de mosquitto con el protocolo mqtt, y en donde se realizan las primeras pruebas, recomiendo realizar este post antes de continuar. |
Componentes electrónicos
Material | Cantidad | Descripción |
---|---|---|
Arduino | 1 | Cualquier placa arduino podemos trabajar |
ESP8266-01 | 1 | Modulo de conexión a intenet |
Cables de conexión | Los que necesite | Generalmente cables macho a macho |
Pasos para esp8266 conexión a mqtt
Configurar mosquitto
Primero vamos a configurar mosquitto para ello iniciamos el servidor en la red local y vamos a crear un topic en donde estará a la espera de la conexión del broker. Si aun no tiene instalado el mosquitto en la sección de materiales > sotware, tenemos los link a los post para instalar el servidor según el sistema operativo que este usando.
Para iniciar el servidor y crear el topic usamos:
mosquitto_sub -h localhost -t outTopic -v
Donde nos deberá quedar de la siguiente forma:
Firmware para WiFiEsp
Para utilizar la librería WiFiEsp requiere una versión de SDK del ESP superior a 1.1.1 y en comandos AT superior a la 0.25, si usted compro el modulo recientemente, no se preocupe que ya debe estar con el SDK correspondiente, ahora si esta realizando las pruebas y en el log del proyecto le indica que debe actualizar el SDK, siga los siguientes pasos, de lo contrario su modulo ESP8266 no requiere cambiar el firmware.[1]
Despues de haber descargado el software para el flasher esp8266 que indicamos en los materiales, vamos a abrir el esp8266_flasher.exe, configuramos el puerto serial al cual se conecto el modulo ESP y vamos a seleccionar el archivo ESP8266_AT25-SDK112-512k.bin que se encuentra en la carpeta Firmware ESP8266 y cargamos el firmware como se muestra en la siguiente imagen.
Si tiene algún inconveniente con el proceso del firmware, en el post de esp8266 flasher firmware explicamos el paso a paso.
Cambio velocidad transmisión en el ESP
Para establecer una buena comunicación entre el arduino y el modulo ESP8266-01 es recomendado que la velocidad de comunicación este a 9600 baudios, así que en el modulo ESP debe estar configurado vía comandos AT esta velocidad, si necesita cambiar la velocidad el comando AT es el siguiente:
AT+UART_DEF=9600,8,1,0,0
Conexión del modulo al arduino
La conexión es simple, ya que la comunicación del modulo ESP8266 al arduino es serial, no es la misma que usa el arduino para comunicarse al PC, así que tenemos que crear una comunicación virtual,en el código vamos a ver como.
En la siguiente tabla se muestra que pines se conectan al arduino y la alimentación del modulo.
Arduino | ESP8266 |
---|---|
3V | CH_PD o pin 6 |
3V | VCC o pin 2 |
Pin 2 | TX o pin 8 |
Pin 3 | RX o pin 1 |
GND | GND |
Código
Expliquemos el código paso a paso, para poderlo analizar mejor antes de entrar a verlo al detalle.
- Primero vamos a incluir las librerías necesarias para realizar la comunicación, el link de descarga son los mencionados en los materiales, estas librerías se deben cargar al programa arruino.
- Vamos a declarar una serie de variables en donde guardaremos el nombre de la red, contraseña y nombre del servidor.
- Después inicializaremos los objetos correspondientes WiFiEspClient, PubSubClient, y softwareserial.
- Ahora la primera acción que vamos a realizar es iniciar con el wifi, en donde validaremos si esta conectado y comunicándose el modulo, luego vamos a realizar la conexión al modulo con el nombre de la red y la contraseña.
- Después de tener conexión al wifi indicamos cual es el servidor en donde esta mosquitto con el fin de abrir una conexión permanente para poder enviar información al topic.
- Finalmente enviamos la cadena de texto con el dato que necesitamos enviar.
#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <PubSubClient.h>
#include "SoftwareSerial.h"
//Conexión a la red wifi: nombre de la red y contraseña
#define WIFI_AP "ce93151421541"
#define WIFI_PASSWORD "2ZD72AZKN0888"
//Nombre o IP del servidor mosquitto
char server[50] = "192.168.0.8";
//Inicializamos el objeto de cliente esp
WiFiEspClient espClient;
//Iniciamos el objeto subscriptor del cliente
//con el objeto del cliente
PubSubClient client(espClient);
//Conexión serial para el esp con una comunicación
//serial, pines 2: rx y 3: tx
SoftwareSerial soft(2, 3);
//Contador para el envio de datos
unsigned long lastSend;
int status = WL_IDLE_STATUS;
void setup() {
//Inicializamos la comunicación serial para el log
Serial.begin(9600);
//Iniciamos la conexión a la red WiFi
InitWiFi();
//Colocamos la referencia del servidor y el puerto
client.setServer( server, 1883 );
lastSend = 0;
}
void loop() {
//Validamos si el modulo WiFi aun esta conectado a la red
status = WiFi.status();
if(status != WL_CONNECTED) {
//Si falla la conexión, reconectamos el modulo
reconnectWifi();
}
//Validamos si esta la conexión del servidor
if(!client.connected() ) {
//Si falla reintentamos la conexión
reconnectClient();
}
//Creamos un contador para enviar la data cada 2 segundos
if(millis() - lastSend > 2000 ) {
sendDataTopic();
lastSend = millis();
}
client.loop();
}
void sendDataTopic()
{
Serial.println("sendDataTopic");
// Prepare a JSON payload string
String payload = "Hola desde arduino";
// Send payload
char attributes[100];
payload.toCharArray( attributes, 100 );
client.publish( "outTopic", attributes );
Serial.println( attributes );
}
//Inicializamos la conexión a la red wifi
void InitWiFi()
{
//Inicializamos el puerto serial
soft.begin(9600);
//Iniciamos la conexión wifi
WiFi.init(&soft);
//Verificamos si se pudo realizar la conexión al wifi
//si obtenemos un error, lo mostramos por log y denememos el programa
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("El modulo WiFi no esta presente");
while (true);
}
reconnectWifi();
}
void reconnectWifi() {
Serial.println("Iniciar conección a la red WIFI");
while(status != WL_CONNECTED) {
Serial.print("Intentando conectarse a WPA SSID: ");
Serial.println(WIFI_AP);
//Conectar a red WPA/WPA2
status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
delay(500);
}
Serial.println("Conectado a la red WIFI");
}
void reconnectClient() {
//Creamos un loop en donde intentamos hacer la conexión
while(!client.connected()) {
Serial.print("Conectando a: ");
Serial.println(server);
//Creamos una nueva cadena de conexión para el servidor
//e intentamos realizar la conexión nueva
//si requiere usuario y contraseña la enviamos connect(clientId, username, password)
String clientId = "ESP8266Client-" + String(random(0xffff), HEX);
if(client.connect(clientId.c_str())) {
Serial.println("[DONE]");
} else {
Serial.print( "[FAILED] [ rc = " );
Serial.print( client.state() );
Serial.println( " : retrying in 5 seconds]" );
delay( 5000 );
}
}
}
Prueba funcionamiento
La prueba que vamos a realizar es la siguiente, vamos a cargar el código al arduino y comprobamos que el servidor mosquitto este corriendo, esto lo vimos en la sección Configurar mosquitto, abrimos la terminal serial de arduino para ver el log y saber si se nos presenta algún error o realiza la conexión correctamente.
Como podemos observar en las siguientes pantallas vemos que el modulo esp8266 conectado al arduino esta enviando la cadena de texto correctamente al topic que acabamos de crear y que en el servidor podemos ver el mensaje con el topic correspondiente.
Referencias
[1] create arduino https://create.arduino.cc/projecthub/thingsboard/temperature-dashboard-using-arduino-uno-esp8266-and-mqtt-5e26eb, Consultado noviembre 2019