Wemos D1 conexión a mqtt


El proyecto wemos d1 conexion a mqtt esta planteado para enviar mensajes al servidor mosquitto donde esxplicamos el paso a paso y su funcionamiento

oscar Escrito por oscar 05 January 2020 4031 0

Acerca del proyecto

En este post vamos a hacer la primera conexión entre mqtt usando como servidor mosquitto y la placa wemos D1, 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 wemos D1 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
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
Wemos D1
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
Wemos D1 1 Cualquier placa arduino podemos trabajar
Cables de conexión Los que necesite Generalmente cables macho a macho

Pasos de conexión wemos D1 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:

Conexión

Para este ejercicio no se requiere realizar alguna conexión ya que el modulo cuenta con todos los componentes, lo único que se requiere es conectar el modulo al PC para cargar el código, de resto no se necesita nada adicional..

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.
//Cargamos las librerias
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

//Creamos las variables para el acceso al WIFI 
//y al servidor mosquitto
const char* ssid = "ce93151421541";
const char* password = "2ZD72AZKN0888";
const char* mqtt_server = "192.168.0.6";

//Inicializamos los objetos el cliente y el publicador
WiFiClient espClient;
PubSubClient client(espClient);

long lastMsg = 0;
char msg[50];
int value = 0;

//Creamos la función que nos permitira realizar
//la conexión del wifi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Conectado a: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("Direccion IP: ");
  Serial.println(WiFi.localIP());
}

//Creamos la función que permite realizar la conexión
//al servidor mosquitto
void reconnect() {
  //Validamos si existe una conexión al servidor, 
  //de lo contrario intentamos conectarlo de nuevo
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    //Creamos un clinete ID ramdon
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    //Intentamos conectarnos
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      //Enviamos un mensaje de prueba
      client.publish("outTopic", "hello world");
    } else {
      //Si la conexión fallo, intentamos de nuevo
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(9600);
  //Iniciamos la conexión del wifi
  setup_wifi();
  //Indicamos a que servidor nos conectamos
  client.setServer(mqtt_server, 1883);
}

void loop() {
  //Validamos la conexión si esta correcta
  if (!client.connected()) {
    reconnect();
  }
  
  //Dejamos el cliente el loop para que no cierre 
  //la conexión actual
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    //Creamos el mensaje
    snprintf (msg, 50, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    //Enviamos el mensaje
    client.publish("outTopic", msg);
  }
}

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


Comentario

Debe aceptar antes de enviar