Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Controlem l'encesa d'un LED amb MQTT

En aquest exemple controlarem l'encesa del LED de la placa des d'una aplicació mòbil fent servir MQTT. En aquest cas, a més del programa del microcontrolador, ens caldrà configurar l'aplicació per poder fer la interacció. El programa del microcontrolador seria el que surt a continuació i que més endavant comentarem.

// Està parcialment basat en programes de Demetrio Pina i Fábio Souza
#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
#include <PubSubClient.h>   // Biblioteca per a MQTT
#define LED 6    // pota on hi ha el LED
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
const char servidor[] = "broker.mqtt-dashboard.com";    // Contrasenya de connexió 
WiFiClient clientwifi;   // Client Wi-Fi
PubSubClient client(clientwifi);    // Client MQTT
void connecta_xarxa() {
  delay(1000);
  Serial.print("Connectant a la xarxa ");
  Serial.println(idXarxa);
  WiFi.begin(idXarxa, contrasenya);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.print("Connectat!");
  Serial.print("Adreça IP: ");
  Serial.println(WiFi.localIP());
}
// Aquesta funció s'executarà automàticament quan es detecti un canvi
void callback(char* topic, byte* payload, unsigned int length) {
  char rebut = (char)payload[0];
  Serial.print("Comanda rebuda: ");
  Serial.println(rebut);
  if (rebut == '0'){
    digitalWrite(LED, LOW);  // Apaga el LED
    Serial.println("Apaguem LED");
    client.publish("oba_estat_LED", "LED\napagat");  // el \n és un salt de línia
  } else if (rebut == '1'){
    digitalWrite(LED, HIGH);  // Apaga el LED
    Serial.println("Encenem LED");
    client.publish("oba_estat_LED", "LED\nencès");  // el \n és un salt de línia
  } else {
    Serial.println("Valor incorrecte");
  }
}
void connecta_mqtt() {
  while (!client.connected()) {
    Serial.println("Connectant al servidor MQTT");
    if (client.connect("oba_mqtt")) {
      Serial.println("Connectat!");
      client.subscribe("oba_accio_LED");
    } else {
      Serial.println("Ha fallat la connexió!");
      Serial.print("Resposta = ");
      Serial.println(client.state());
      delay(5000);
    }
  }
}
void setup() {    // Inicialització
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  connecta_xarxa();
  client.setServer(servidor, 1883);
  client.setCallback(callback);
}
void loop() {    // Programa que es repeteix indefinidament
  if (!client.connected()) {
    connecta_mqtt();
  }
  client.loop();  // Consulta el servidor MQTT
}

Observem que el programa té tres funcions. Una d'elles (connecta_xarxa) serveix per connectar-se al punt d'accés Wi-Fi. Una altra funció (callback) és la que s'executarà automàticament quan es detecti un canvi en el contingut vinculat a l'etiqueta. En aquest cas rebrem un 1 o un 0 i encendrem o apagarem el LED en concordança. Al mateix temps, enviarem l'estat del LED per tal que sigui mostrat a l'usuari de l'aplicació. La tercera funció (connecta_mqtt) fa la connexió amb el servidor MQTT i subscriu l'etiqueta corresponent, que serà la que activi la funció callback.

El programa pròpiament dit és molt senzill. En la inicialització es fa la connexió a la xarxa, la definició del servidor MQTT i la vinculació de la funció callback. En el bucle es comprova que la connexió es mantingui i es va refrescant la lectura de les etiquetes.

Un cop tenim fet el programa per al microcontrolador, cal preparar l'aplicació per tal que es puguin comunicar. En aquesta pàgina podem trobar informació més general sobre l'ús de l'aplicació. Per a aquest exemple en concret, crear un espai per al projecte picant al botó ⊕ i deixant la majoria de paràmetres per defecte. Només haurem d'editar els següents:

Paràmetre Exemple Comentaris
Name Control LED Qualsevol nom que ens permeti diferenciar el projecte dels altres
Address broker.mqtt-dashboard.com Adreça del servidor MQTT que fem servir
Port 1883 Port emprat pel servidor, el normal és 1883

Després d'acabar la configuració, picarem sobre la icona Disquet

Dins del projecte posarem dos elements. Un botó (switch/button) per encendre i apagar el LED i un text (text) per mostrar l'estat en cada moment. En el cas del botó, els paràmentres que hem de configurar són:

Paràmetre Exemple Comentaris
Name LED
Topic (sub) oba_accio_LED L'etiqueta que hem posat al programa
On 1 Text que s'envia quan piquem per encendre
Bombeta Icona que es mostra quan piquem per encendre
Color de la icona que es mostra quan piquem per encendre
Off 0 Text que s'envia quan piquem per apagar
Bombeta Icona que es mostra quan piquem per apagar
Color de la icona que es mostra quan piquem per apagar

Després d'acabar la configuració, picarem sobre la icona Disquet

Els paràmentres que hem de configurar al text són:

Paràmetre Exemple Comentaris
Name Estat LED Qualsevol nom que ens permeti diferenciar aquest element d'altres similars
Topic (sub) oba_estat_LED L'etiqueta que hem posat al programa
Main text size Medium Mida de la lletra del text que es mostrarà
Main text color Color de la lletra del text que es mostrarà

Després d'acabar la configuració, picarem sobre la icona Disquet

L'aspecte dels botons de l'aplicació serà, segons l'estat del LED, un dels que es mostren a les següents imatges:

Botons de l'aplicació           Botons de l'aplicació

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.