ESP8266 conexión a mqtt con arduino

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.

Materisles

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 intener
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 debera 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

Comentarios

Para dejar el comentario solo necesitamos tu correo que registraste en la pagina, pero si aun no te haz registrado se creara el usuario automaticamente.

Detalle contenido

base-esp8266-conexion-mqtt-arduino
Generic placeholder image
Oscar Fernandez Alzate

29, Noviembre 2019

39
Categorías
IOT