2803-tutorial-mqtt-raspberry-pi-arduino-esp8266-3ebdc24c

La App Makers

En el anterior articulo instalamos y configuramos el broker  que en nuestro caso es Mosquito.

MQTT será el nexo entre hardware (actuadores, sensores,etc) y todos los elementos típicos del mundo software (servidores, bases de datos,etc). En esta capa nos preocupamos de que la información llegue a un sistema que posteriormente se ocupa de distribuirlo entre las demás partes y nos da igual lo que haya a partir de ese momento y su tamaño. Puede que no tengamos nada más que una web de visualización . Puede que seamos un particular enviando un dato de temperatura a un panel de visualización en su Raspberry o puede que seamos una multinacional que controla en tiempo real su producción de amoniaco a nivel global bajando y subiendo la carga de producción en sus diferentes fábricas según los costes de transporte y el consumo de sus diferentes centros de distribución. Nos es lo mismo a este nivel porque nosotros hacemos sólo una cosa y la hacemos bien: enviar datos de un dispositivo hardware a un sistema mucho mayor.

Volviendo con nuestro broker (Mosquito).Lo arrancamos y lo dejamos iniciado introduciendo en una consola:

mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf

Vamos a trabajar con un topic que nombraremos como ‘test’. Como recordarás, no necesitábamos explícitamente definir el topic sino que se creaba automáticamente en cuanto había un publicador o subscriptor usándolo.

En nuestro caso, vamos a poner un escuchador. Activamos un cliente subscrito al topic ‘test’ introduciendo en otra consola lo siguiente:

mosquitto_sub -t "test/#" -v

En otra consola, probamos que está funcionando correctamente escribiendo:

mosquitto_pub -t "test" -m "Hola"

Si todo está correctamente configurado, en la consola en la que abrimos el escuchado veremos que escucha el “Hola”.

 

MQTT y Arduino

Ahora que lo tenemos todo listo, veamos la parte de Arduino que es lo que realmente nos interesa.

Como habrás imaginado, para conseguir una comunicación MQTT, emplearemos una librería. Existen muchas disponibles gracias a la gran comunidad que existe alrededor de Arduino.

Concretamente, nosotros emplearemos una de las más conocidas y es que, tras probar varias alternativas, creo que es la más estable y flexible, lo que facilita su uso tanto hoy como en futuros proyectos que queramos realizar donde intervengan Arduino y MQTT.

Dicha librería es Arduino Client for MQTT y nos provee de un sencillo cliente que nos permite tanto subscribirnos como publicar contenido usando MQTT. Internamente, usa la API de Arduino Ethernet Client lo que lo hace compatible con un gran número de ‘shields’ y placas.

Inicialmente, debemos instalar dichar librería para lo cual clonaremos en nuestra carpeta de librerías de Arduino la última versión disponible en el repositorio oficial del proyecto.

Vamos a emplear un Arduino UNO junto con un Arduino Ethernet y un sensor DHT22. , tiene un diagrama muy sencillo que puedes ver en la siguiente imagen:

La Shield Ethernet irá montado encima y la conectaremos a nuestro router a través de un cable de red.

El sketch que usaremos es el siguiente:

#include <SPI.h>

#include <Ethernet.h>

#include <PubSubClient.h>

#include <DHT.h>


#define DHTPIN 2

#define DHTTYPE DHT11


// Direccion MAC

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


// IP del servidor

IPAddress mqtt_server(192, 168, 1, 38);


// Topic con el que trabajamos

const char* topicName = "test";


DHT dht(DHTPIN, DHTTYPE);

EthernetClient ethClient;

PubSubClient client(ethClient);


void setup()

{

  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

  }

  client.setServer(mqtt_server, 1883);

  dht.begin();

}


void loop()

{

  if (!client.connected()) {

    Serial.print("Connecting ...n");

    client.connect("Arduino Client");

  }

  else {

    // Envio

    float temp = dht.readTemperature();

    char buffer[10];

    dtostrf(temp,0, 0, buffer);

    client.publish(topicName, buffer);

  }

  // Tiempo entre envios (en ms)

  delay(5000);

}

Con toda la parte hardware montada y con este trozo de código metido en nuestro Arduino, podemos alimentarlo y veremos como, cada cinco segundos, en la terminal que habíamos abierto y que estaba subscrita al topic ‘test’ irán apareciendo la medición de temperatura que realiza nuestro sensor cada cinco segundos.

Ahora, podemos probar la comunicación opuesta, es decir, recibir mensajes en nuestro Arduino a través de MQTT. En esta ocasión, no necesitamos nada más que el Arduino UNO y la placa Ethernet.

El sketch que emplearemos ahora será:

#include <SPI.h>

#include <Ethernet.h>

#include <PubSubClient.h>


// Direccion MAC

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


// IP del servidor

IPAddress mqtt_server(192, 168, 1, 38);


// Topic con el que trabajamos

const char* topicName = "test";


EthernetClient ethClient;

PubSubClient client(ethClient);


void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived [");

  Serial.print(topic);

  Serial.print("] ");

  int i=0;

  for (i=0;i<length;i++) {

    Serial.print((char)payload[i]);

  }

  Serial.println();

}


void setup()

{

  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

  }

  client.setServer(mqtt_server, 1883);

  client.setCallback(callback)

}


void loop()

{

  if (!client.connected()) {

      Serial.print("Connecting ...");

      if (client.connect("rece_arduino")) {

        Serial.println("connected");

        client.subscribe(topicName);

      } else {

        delay(5000);

      }

  }

  // Cliente a la escucha

  client.loop();

}

Si tienes dos Arduinos, podrás probar ambos a la vez pero recuerda que deberás modificar algunos datos que deben ser únicos en la red como la dirección MAC o la IP (la del server lógicamente se mantiene).

De cualquier modo, vamos a hacer la prueba suponiendo que sólo tuviéramos un Arduino. Para ello, conectamos nuestro Arduino UNO con el código segundo subido y la placa Ethernet y los dejamos conectados por USB al ordenador.

Abrimos el monitor serie del IDE de Arduino y comprobamos que recibimos el mensaje “Connected”. Ahora vamos a una consola del sistema y en ella ejecutamos de nuevo:

mosquitto_pub -t "test" -m "Hola"

Veremos como en nuestro monitor serie aparece el mensaje “Hola” que acabamos de mandar.

Esta información, en vez de “imprimirla” a través del puerto serie, podría servirnos dentro de la lógica de nuestra aplicación pero ya habrás advertido como, aunque el envío es muy sencillo, la recepción, al ser byte a byte, es algo más compleja requiriendo un tratamiento algo mayor.

De cualquier modo, no es nada excesivamente complicado y podríamos tener el valor recibido en una variable con esta función :

String data;


void callback(char* topic, byte* payload, unsigned int length) {

  char dataArray[length];

  for (int i=0;i<length;i++) {

    dataArray[i] = (char)payload[i];

  }

  data = str(dataArray)

}

En la variable data tendriamos en formato String el contenido recibido.

Aplicando estos sencillos pasos, seremos capaces de conectar el nivel más bajo del  Internet de las Cosas ,la sensorización con las capas intermedias que se encargan de procesar y consumir dicha información, tanto de forma discrecional como empleando técnicas más complejas de análisis de datos.

Saludos


Ayuda a los autores

  • Tutorial
  • Arduino
0 Comentarios

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account