View Categories

Utilidad y ubicación #

Este artículo se lleva a cabo en el siguiente vídeo:

microLSB se puede utilizar como una librería «gráfica» que simplifica mediante bloques la programación de ciertas funciones complejas, como la comunicación por Wifi mediante MQTT, pero seguir posteriormente programando mediante texto en un entorno como el IDE 2 de Arduino.

Tras incluir en cajas de texto los datos de la red y del servidor, con otros dos bloques se pueden configurar los temas en los que se van a intercambiar datos y las variables en las que se van a almacenar dichos datos para trabajar con ellos mediante texto, ya en el IDE 2 de Arduino, o cualquier otro editor de código compatible.

A la izquierda vemos un ejemplo de cómo realizar una conexión completa y suscribirnos a un tema y publicar en otro.

Los bloques para la conexión con la red wifi y con el servidor MQTT, se encuentran en la siguiente ubicación:

Y los bloques para definir el intercambio de datos:

Bloque suscribir #

El siguiente bloque se suscribe a la suma del texto del prefijo + el «temaMQTT», pero la variable creada para almacenar y trabajar con los valores recibidos, será solo el «temaMQTT».

Ejemplo:

El anterior bloque se va a suscribir al tema completo de dos niveles «cliente1/luzSalon». Sin embargo, la variable global que podremos usar, en este ejemplo del tipo bool, será «luzSalon», que tendrá el estado que se indique desde internet. De esta forma, por ejemplo, podríamos completar nuestro código a mano con lo siguiente:

if(luzSalon){
digitalWrite(15, HIGH);
} else {
digitalWrite(15, LOW);

Esto nos activará o apagará el GPIO15 en función de un posible interruptor virtual en un servidor MQTT, por ejemplo. Eso sí, recuerda que si usas GPIOS debes definirlos en el void Setup.

Bloque publicar #

El siguiente bloque publicará en el tema que sea la suma del texto del prefijo + el «temaMQTT». En este caso no se trabajará con una variable, se trabajará con una función, pero de forma muy sencilla. Simplemente hay que incluirla en el momento en el que quieres que se publique dicho dato.

La función estará compuesta por la palabra publicar + _ + (el texto de la segunda casilla);

Ejemplo de función para publicar:

Si tenemos el siguiente bloque,

cuando queramos publicar el valor de «estado» en el tema «cliente1/estado», tendremos que incluir el siguiente código: publicar_estado(estado);

Ejemplo:

Se quiere que se publique el valor que tenga la variable global «contador», que irá sumando 1 cada vez que se accione un pulsador conectado al pin 2.

    if(digitalRead(2)){
      contador = contador + 1;
      publicar_contador(contador);
      delay(1000);
    }

Ayuda como comentarios #

Si incluimos los siguientes tres bloques, en el void loop nos aparecerá un comentario de cada uno recordándonos cómo usarlos.

    // Los datos recibidos en el tema Pedro_Domingo/f/interruptor se almacenan en la variable tipo 
    //Bool: "interruptor"
    // Los datos recibidos en el tema Pedro_Domingo/f/reset se almacenan en la variable tipo 
    //float: "reset"
    //La función para publicar el estado de "cuenta", será "publicar_cuenta(cuenta);"

Caso de estudio #

Se tiene un pulsador con resistencia Pull-Down conectado al GPIO2, y otro al GPIO12. Además, hay un Led conectado al GPIO15. Se pide el siguiente intercambio de datos y órdenes a través del servidor MQTT io.adafruit.com:

  • Si se acciona un pulsador virtual, a través de la variable global booleana «interruptor», se debe controlar el estado del Led conectado al GPIO15.
  • Si se acciona el pulsador durante menos de 1 segundo, una variable global denominada «contador», incrementará en 1 su valor.
  • Si se presiona el pulsador conectado al GPIO12, se deberá poner a cero el valor de la variable «contador», y hacerlo mediante la variable «reset».
 (...)
 
   void setup() //**************************************************************
  {
    Serial.begin(115200); //incluido de serie
    espwifi_setup();      //incluido de serie
    espmqtt_setup();      //incluido de serie

// ************************* Definición de pines por el usuario ************
    pinMode(2, INPUT);
    pinMode(12, INPUT);
    pinMode(15, OUTPUT); 
  }
  
  void loop()//*****************************************************************
  {
    yield();           //incluido de serie
    espmqtt_loop();    //incluido de serie
    interruptor_fun(); //incluido de serie
    
    // Los datos recibidos en el tema Pedro_Domingo/f/interruptor se almacenan en la variable tipo 
    //Bool: "interruptor"
    // Los datos recibidos en el tema Pedro_Domingo/f/reset se almacenan en la variable tipo 
    //float: "reset"
    //La función para publicar el estado de "cuenta", será "publicar_cuenta(cuenta);"
  
  //************************** código elaborado  por el usuario ***************************
  
    if(interruptor){
      digitalWrite(15, HIGH);
    } else {
     digitalWrite(15, LOW);
    }

    if(digitalRead(2)){
      cuenta = cuenta + 1;
      publicar_cuenta(cuenta);
      delay(1000);
    }

    if(digitalRead(12)){
      cuenta = reset;
      publicar_cuenta(cuenta);
      delay(1000);
    }
  }
  

Información complementaria sobre MQTT #

Para los usuarios que no conozcan el proceso de intercambio de datos por internet mediante MQTT, dejamos a continuación, un recurso en el que se explica el protocolo. De igual forma, se facilita un tutorial con el servidor gratuito elegido, io.adafruit.com.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *