Contenido


Construya un sensor de temperatura listo para la nube con Arduino Uno e IBM IoT Foundation, Parte 2

Escriba un bosquejo y conéctese a la Quickstart de IBM IoT Foundation

Comments

Contenido de la serie:

Este contenido es la parte # de # de la serie: Construya un sensor de temperatura listo para la nube con Arduino Uno e IBM IoT Foundation, Parte 2

Manténgase en contacto por contenidos adicionales de esta serie.

Este contenido es parte de la serie:Construya un sensor de temperatura listo para la nube con Arduino Uno e IBM IoT Foundation, Parte 2

Manténgase en contacto por contenidos adicionales de esta serie.

En la Parte 1 de esta serie de tutoriales de cuatro partes, analicé el diseño de un proyecto para supervisar las temperaturas en mi armario de cableado, construido mediante el uso de Arduino Uno y el sensor de temperatura DHT11 de Virtuabotix. Mostré la construcción del circuito para el proyecto y lo guié hacia la instalación de Arduino IDE y cómo probar cada uno de los componentes individuales del proyecto con diferentes bosquejos de muestra de Arduino. Ahora está listo para ver el diseño del bosquejo que vincula el proyecto IoT en la nube y los pasos para permitir el monitoreo de los datos de temperatura y humedad en tiempo real de forma remota. Pero, primero debo discutir el protocolo que utilizará para comunicarse con IBM IoT Foundation: MQTT.

¿Qué es MQTT?

MQTT (anteriormente Message Queueing Telemetry Transport) es un protocolo de comunicaciones rápido y liviano diseñado para Internet of Things. Tiene sus orígenes en IBM (donde fue desarrollado originalmente por Andy Stanford-Clark), y desde entonces ha sido enviado a la Organización para el Avance de Estándares de Información Estructurada (OASIS) para la estandarización, donde la versión actual del estándar de protocolo es la versión 3.1. La Especificación de Protocolo V3.1 de MQTT indica que su propósito es ser un "protocolo de mensajería leve para publicar/suscribirse basado en intermediarios, diseñado para ser abierto, simple, liviano y fácil de implementar". En el período desde su presentación, la parte "fácil de implementar" ciertamente se ha probado que es verdadera, ya que se han desarrollado varias bibliotecas diferentes que implementan clientes de MQTT. Puede encontrar enlaces a casi todas ellas enla página del proyecto Eclipse Paho.

MQTT es perfecto para el uso de dispositivos incorporados porque:

  • Es asíncrono, con múltiples niveles diferentes de calidad de servicio, lo que es importante en los casos en los que las conexiones de Internet no son confiables.
  • Envía mensajes cortos y concisos que lo hacen útil para los casos de banda ancha baja.
  • No requiere mucho software para implementar un cliente, lo que lo hace excelente para dispositivos como Arduino con memoria limitada.

MQTT es el protocolo sobre el que QuickStart de IBM IoT Foundation está diseñado para aceptar entradas.

Descarga e instalación de las bibliotecas MQTT de Arduino

En este tutorial, utilizará los dispositivos incorporados de QuickStart de IBM Internet of Things Foundation para representar gráficamente los datos en tiempo real del sensor de Arduino.

Instalar las bibliotecas de clientes de MQTT para Arduino es tan fácil como localizar e instalar las bibliotecas que ya analizó en laParte 1 para los dispositivos de hardware específicos. La biblioteca específica a ser utilizada para su proyecto se puede encontrar en el sitio Webcliente Arduino para MQTT , que describe la biblioteca, ofrece enlaces para la documentación, y brinda otro enlace a GitHub donde puede descargarlo.

En mi ejemplo, utilicé el cliente V1.9.1 del enlace GitHub. Descargue el archivo ZIP o TAR y luego extraiga el directorio PubSubClient del archivo en el subdirectorio de bibliotecas del directorio de Arduino IDE. A continuación, reinicie Arduino IDE. Las opciones del menú PubSubClient>mqtt_auth, PubSubClient>mqtt_basicy PubSubClient>mqtt_publish_in_callback deben estar disponibles ahora, como se muestra en la Figura 1.

Figura 1. Menú PubSubClient
Screenshot of the PubSubClient menu options
Screenshot of the PubSubClient menu options

Prueba local de MQTT

El proceso que ha seguido hasta ahora en esta serie de tutoriales tiene como objetivo introducir un nuevo componente o tecnología en la solución y luego probarlo independientemente para asegurarse de que funciona correctamente. Ahora que ha descargado e instalado el software del cliente de MQTT, hará lo mismo con él. No obstante, aún necesitará un software adicional para probar el cliente.

MQTT es un protocolo basado en intermediarios: los clientes se conectan a un intermediario que realiza la mediación de comunicación entre ellos. En realidad, es un proceso simple. Un conjunto de clientes registran su interés sobre un tema con el intermediario. Cuando otro cliente publica un mensaje sobre ese tema, el intermediario reenvía el mensaje a los clientes que se suscriben.

El intermediario que utilizará para la prueba local es otra contribución de origen abierto denominada Mosquitto. Puede instalarlo en la PC local que está utilizando para programar Arduino y luego probar que este puede comunicarse con el intermediario.

Mosquitto

Puede descargar Mosquitto desde elsitio Web Mosquitto. Está disponible para Windows®, Mac, y la mayoría de las variantes de Linux® . Su instalación es simple: para Linux, simplemente equivale a la instalación de un nuevo paquete; para Windows, puede instalar el sistema como un servicio de Windows o un ejecutable separado. Si está utilizando Windows, asegúrese de desmarcar el recuadro de selección para instalarlo como un servicio. Es más fácil ejecutarlo desde la línea de comandos porque puede ver mejor la información de depuración según se registra.

Después de instalar Mosquitto, inícielo desde la línea de comandos (en cualquier plataforma) ejecutando el comando:

mosquitto -v

La marca -v es para el registro "verboso", lo que significa que puede ver la información acerca de las conexiones realizadas y los mensajes recibidos o enviados. Podrá ver el resultado de esto al minuto de comenzar a enviar mensajes al intermediario local.

Descarga del bosquejo de muestra

El siguiente paso consiste en descargar el bosquejo de muestra que reúne todas las partes (consulte Descargar). Publicará un mensaje a través de MQTT a un intermediario de MQTT (primero a su intermediario local, y luego al intermediario que forma parte de QuickStart de IoT Foundation). Para que QuickStart de IoT Foundation finalmente analice y muestre los datos del sensor, debe publicarlo con un tema denominado iot-2/evt/status/fmt/json. Asimismo, también debe formatear los datos de una forma específica. En la documentación de QuickStart de IoT Foundation para la fórmula "Conectar mi dispositivo a QuickStart", podrá ver que los datos deben estar en el siguiente formato de Notación de Objetos de JavaScript (JSON):

{
    "d": {
         "name1": "stringvalue",
         "name2": intvalue,
         ...
    }
}

El bosquejo de muestra es un programa simple. En las otras muestras de Arduino que le mostré en la Parte 1, podrá ver que todos los programas de Arduino tienen la misma estructura. Estos incluyen un conjunto estándar de funciones denominadas setup() y loop(), junto con algunas declaraciones de variables opcionales y declaraciones de cualquier función de utilidad que utiliza en las funciones setup() o loop() . Primero, deberá realizar algunos cambios al principio del código en algunas de esas declaraciones de variables para que pueda probar el programa de forma local.

Cambios en el bosquejo de muestra

Como en todos los demás bosquejos de Arduino, la parte superior del programa contiene referencias a las bibliotecas que utiliza en el bosquejo:

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <dht11.h>

Como puede ver, el bosquejo utiliza las bibliotecas Ethernet para orientar el protector Ethernet y las bibliotecas DHT11 para acceder a las lecturas desde DHT11 — como se muestra en los ejemplos de la Parte 1. Sin embargo, también está utilizando las bibliotecas PubSubClient por primera vez. Para poder aprovecharlas, es necesario realizar algunos cambios en el código para probarlo en relación con el servidor local:

// Actualice esto en la dirección MAC que se encuentra en la etiqueta del protector Ethernet (nunca los protectores)
// o un valor hexadecimal aleatorio diferente (cambie al menos los últimos cuatro bytes)
byte mac[]    = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
char macstr[] = "deedbafefeed";
// Tenga en cuenta que el siguiente valor solo se utiliza si intenta realizar una prueba en relación con un servidor MQTT local
byte localserver[] = {192, 168, 1, 98 };
// Actualice este valor a una IP abierta adecuada en su red local
byte ip[]     = {192, 168, 1, 20 };

Como dice el primer comentario, el primer cambio que debe realizar es actualizar las variables de mac y macstr para que coincidan con la dirección MAC de su protector Ethernet. Los protectores Ethernet nunca tienen esta información impresa en la etiqueta de la tarjeta. Si está utilizando una tarjeta más antigua, solo cambie de forma aleatoria los últimos cuatro caracteres hexadecimales a otros valores hexadecimales válidos y no tendrá problemas. Luego, cambie la variable ip para que sea una dirección IP abierta en la red local. Las bibliotecas Ethernet pueden utilizar DHCP, y si está interesado, puede buscar cómo hacerlo, pero es más fácil utilizar direcciones IP fijas siempre que se posible. A continuación, actualice la variable servidor local a la dirección IP del computador en el que está utilizando el servidor Mosquitto. Finalmente, actualizará el bosquejo para que se conecte al servidor MQTT local en lugar del servidor QuickStart de IBM IoT Foundation.

Localice esta sección del código:

// Elimine el comentario de esta siguiente línea y comente la línea posterior para probarla en relación con un servidor MQTT local
//cliente PubSubClient (localserver, 1883, 0, ethClient);
cliente PubSubClient (servername, 1883, devolución de llamada, ethClient);

Elimine el comentario de la línea que contiene el constructor iniciando en client(localserver y comente la línea de abajo iniciando en client(servername. Luego, guarde el bosquejo.

Ahora que ha realizado los cambios necesarios, analizará rápidamente el resto de este programa simple. Entre los dos fragmentos que ha visto, se incluye un conjunto de declaraciones de variables:

servername[] de caráct.="messaging.quickstart.internetofthings.ibmcloud.com";
Cadena clientName = cadena("d:quickstart:arduino:") + macstr;
Cadena topicName = Cadena("iot-2/evt/status/fmt/json");
dht11 DHT11;
tempF flotante = 0.0;
tempC flotante = 0.0;
humedad flotante = 0.0;
EthernetClient ethClient;

Como puede ver, estas son variables para la temperatura en Fahrenheit y Celsius y para la humedad. También hay una variable que incluirá la instancia del cliente Ethernet que será utilizado por el cliente PubSub.

A continuación se incluye la definición de la función setup() :

setup() inválida

{
  // Inicie el cliente Ethernet, abra el puerto serie para la depuración, y adjunte el sensor DHT11
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  DHT11.attach(3);
}

Esta función es bastante simple; inicia el cliente Ethernet con la dirección MAC proporcionada y la dirección IP estática en la que el cliente será ejecutado. Luego inicia el puerto serie (para la comunicación a la Supervisión Serie para fines de depuración) y finalmente abre la comunicación con DHT11 en el contacto 3.

La siguiente función a examinar es el loop(), a la que se llama continuamente siempre que Arduino esté en funcionamiento:

loop() inválido
{
  caráct. clientStr[34];
  clientName.toCharArray(clientStr,34);
  caráct. topicStr[26];
  topicName.toCharArray(topicStr,26);
  getData();
  si (!client.connected()) {
    Serial.print("Tratando de conectar a: ");
    Serial.println(clientStr);
    client.connect(clientStr);
  }
  si (client.connected() ) {
    Cadena json = buildJson();
    caráct. jsonStr[200];
    json.toCharArray(jsonStr,200);
    pubresult booleano = client.publish(topicStr,jsonStr);
    Serial.print("intento de envío ");
    Serial.println(jsonStr);
    Serial.print("a ");
    Serial.println(topicStr);
    si (pubresult)
      Serial.println("enviado correctamente");
    else
      Serial.println("no se envió correctamente");
  }
  retardo(5000);
}

Como puede ver, la mayor parte de esta función se dedica a producir la salida de depuración. Sin embargo, hay algunos elementos fundamentales a tener en cuenta. Cerca de la parte superior de la función hay una llamada a la función getData() (que examinará a continuación) que obtiene los datos del sensor desde DHT11. La función loop() luego verifica para ver si el cliente PubSubClient está conectado. Si este no está conectado, la función loop() intenta conectarse al intermediario MQTT. Si está conectado, la función loop() formatea una cadena JSON utilizando buildJson() y luego la publica al intermediario MQTT utilizando el método publish() de PubSubClient. Finalmente, loop() espera durante 5.000 ms en la parte inferior de la función antes de que el tiempo de ejecución de Arduino vuelva al punto inicial y llame a la función nuevamente.

A continuación, analice la función getData() :

getData() inválida {
  int chk = DHT11.read();
  conmutador (chk)
  {
  caso 0:
    Serial.println("Se leyó correctamente");
    humedad = (float)DHT11.humidity;
    tempF = DHT11.fahrenheit();
    tempC = DHT11.temperature;
    pausa;
  caso -1:
    Serial.println("Error de verificación");
    pausa;
  caso -2:
    Serial.println("Error de tiempo de espera excedido");
    pausa;
  predeterminado:
    Serial.println("Error desconocido");
    pausa;
  }
}

Esta función simplemente verifica el estado de los datos de la biblioteca de DHT11, luego lee los valores de los datos del sensor si están listos; de lo contrario, imprime un mensaje informativo en la consola.

Por último, analiza la función que formatea la salida JSON:

Cadena buildJson() {
  Datos de cadena = "{";
  datos+="\n";
  datos+= "\"d\": {";
  datos+="\n";
  datos+="\"myName\": \"Arduino DHT11\",";
  datos+="\n";
  datos+="\"temperatura (F)\": ";
  datos+=(int)tempF;
  datos+= ",";
  datos+="\n";
  datos+="\"temperatura (C)\": ";
  datos+=(int)tempC;
  datos+= ",";
  datos+="\n";
  datos+="\"humedad\": ";
  datos+=(int)humedad;
  datos+="\n";
  datos+="}";
  datos+="\n";
  datos+="}";
  devolver datos;
}

Uno de los puntos débiles del Procesamiento como se implementa en Arduino es la falta de buenas instalaciones para el procesamiento de cadenas de caracteres. Debe haber notado algunas de las conversiones extrañas que se deben hacer entre las instancias de la clase Cadena y el tipo de cadena para llamar a las funciones que esperan una o la otra. De igual modo, incluso el formateo de una cadena JSON simple como esta puede ser desafiante debido a la falta de una buena biblioteca de formateo de cadenas — aunque tales funciones existen para el formateo de la salida a la consola.

Prueba en relación con un intermediario de Mosquitto local

Bien, la primera parte está casi concluida. Ahora, suba el bosquejo modificado a Arduino siguiendo los procedimientos analizados en la Parte 1. Cuando vea el estado "Carga realizada" en la línea de estado de Arduino IDE, abra la Supervisión Serie presionando Ctrl-Shift-M.

Validación de la salida

Ahora, asumiendo que todo salió correctamente, debe ver el siguiente tipo de salida en la ventana de terminal donde inició Mosquitto:

1405807697: versión mosquitto 1.2.3 (fecha de compilación 22/12/2013 13:36:32.54) iniciando
1405807697: Utilizando config. predeterminada
1405807697: Abriendo socket de lectura ipv6 en el puerto 1883.
1405807697: Abriendo socket de lectura ipv4 en el puerto 1883.
1405807718: Nueva conexión desde 192.168.1.20 en el puerto 1883.
1405807718: Nuevo cliente conectado desde 192.168.1.20 como d:quickstart:arduino:deedb
afefeed (c2, k15).
1405807718: Enviando CONNACK a d:quickstart:arduino:deedbafefeed (0)
1405807718: Recibido PUBLISH desde d:quickstart:arduino:deedbafefeed (d0, q0, r0,
 m0, 'iot-2/evt/status/fmt/json', ... (100 bytes))
1405807723: Error de socket en el cliente d:quickstart:arduino:deedbafefeed, desconectan
do.
1405807723: Nueva conexión desde 192.168.1.20 en el puerto 1883.
1405807723: Nuevo cliente conectado desde 192.168.1.20 como d:quickstart:arduino:deedb
afefeed (c2, k15).
1405807723: Enviando CONNACK a d:quickstart:arduino:deedbafefeed (0)
1405807723: Recibido PUBLISH desde d:quickstart:arduino:deedbafefeed (d0, q0, r0,
 m0, 'iot-2/evt/status/fmt/json', ... (100 bytes))
1405807729: Recibido PUBLISH desde d:quickstart:arduino:deedbafefeed (d0, q0, r0,
 m0, 'iot-2/evt/status/fmt/json', ... (100 bytes))
1405807734: Recibido PUBLISH desde d:quickstart:arduino:deedbafefeed (d0, q0, r0,
 m0, 'iot-2/evt/status/fmt/json', ... (100 bytes))

La clave para saber si está recibiendo las cosas correctamente es si puede ver las últimas líneas acerca de PUBLISH recibido desde.... Que significa que el bosquejo de Arduino se está conectando correctamente al intermediario Mosquitto. Ahora, mire el Supervisor Serie; debe contener mensajes como el siguiente:

Se leyó correctamente
Intentando conectarse a d:quickstart:arduino:deedbafefeed
intento de envío {
"d": {
"myName": "Arduino DHT11",
"temperatura (F)": 71,
"temperatura (C)": 22,
"humedad": 43
}
}
a iot-2/evt/status/fmt/json
se envió correctamente

Conexión de Arduino a Quickstart de IoT Foundation

Bien, ahora que las cosas están funcionando a nivel local, está listo para probar esto en relación con Quickstart de IoT Foundation. En el navegador, visite el website IBM Internet of Things Foundation , que se muestra en la Figura 2.

Figura 2. Página de inicio de IBM IoT Foundation

Haga clic en el botón que dice Inténtelo con nuestra Quickstart. Podrá ver la página que se muestra en la Figura 3.

Figura 3. Página de bienvenida de Quickstart de IBM IoT Foundation

En este tutorial, utilizará los dispositivos incorporados de Quickstart de IoT Foundation para representar gráficamente los datos en tiempo real del sensor de Arduino. En la Parte 3 y la Parte 4, escribirá una aplicación para hacer algo más interesante con los datos que recibe.

IoT Foundation tiene varias fórmulas existentes para otros dispositivos. Si tiene un dispositivo más sofisticado como un Intel Galileo o un Raspberry Pi, deseará probar esas fórmulas. Por ahora, simplemente escriba la dirección MAC de Arduino. Pero antes de hacer clic en Ir, debe realizar un cambio más en el bosquejo.

Cambio del bosquejo

¿Se acuerda de algunas instrucciones cuando modificó el bosquejo para que indique el servidor MQTT local en lugar del servidor MQTT de IoT Foundation? Ahora está listo para cambiarlo nuevamente. Comente y elimine el comentario de las líneas que cambió al código original:

// Elimine el comentario de esta siguiente línea y comente la línea posterior para probarla en relación con un servidor MQTT local
//cliente PubSubClient (localserver, 1883, 0, ethClient);
cliente PubSubClient (servername, 1883, devolución de llamada, ethClient);

Una vez realizado este cambio, guarde el bosquejo y súbalo a Arduino. Si desea reiniciar el Supervisor Serie, puede hacerlo, pero la prueba real será lo que ve en IoT Foundation. Vuelva al navegador, haga clic en el botón Ir en la página de la dirección MAC, y espere unos minutos.

Representación gráfica de los datos

Si todo funcionó correctamente, debe ver una página que muestra un gráfico de las lecturas de temperatura, como el que se muestra en la Figura 4.

Figura 4. Datos representados gráficamente

¡Lo consiguió! Ahora tiene un dispositivo construido por usted que forma parte de IoT global. Para mi caso simple y particular, esto es todo lo que necesitaba: un gráfico al que pueda ver por unas horas para verificar la temperatura dentro de mi armario de cableado. La mala noticia es que incluso al mediodía de un día caluroso, la temperatura nunca se movió por encima de los 73°F, por lo que nuevamente volví al panel para descubrir cuál es mi problema. Pero la experiencia de aprendizaje sobre cómo tomar ventaja de IoT recién está comenzando.

¿Qué sigue?

En los dos tutoriales siguientes de esta serie (Parte 3 y Parte 4), escribirá su propia aplicación — que se ejecutará en IBM® Cloud™— que podrá mantener los datos enviados desde Arduino y permitir la visualización y comparación de los datos actuales en relación con los datos históricos.


Recursos para Descargar


Temas relacionados


Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Internet of Things
ArticleID=1012813
ArticleTitle=Construya un sensor de temperatura listo para la nube con Arduino Uno e IBM IoT Foundation, Parte 2: Escriba un bosquejo y conéctese a la Quickstart de IBM IoT Foundation
publish-date=09162014