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
![]()
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 |
![]() |
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 |
![]() |
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
![]()
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
![]()
L'aspecte dels botons de l'aplicació serà, segons l'estat del LED, un dels que es mostren a les següents imatges:


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