Aquest exemple és molt semblant a un d'anterior i, de fet, el programa per al microcontrolador és el mateix. La diferència és que ara farem la nostra aplicació amb App Inventor per poder controlar el LED d'una forma més còmoda.
Suposarem que es disposa d'uns coneixements mínims sobre l'entorn App Inventor 2; si no és així, en aquest espai web es pot trobar un tutorial i exemples. Atès que el nostre objectiu és l'ús de Bluetooth per fer aplicacions d'IoT, no ens entretindrem gaire en personalitzar l'aplicació (colors, posició dels elements, etc.). L'aspecte visual de l'aplicació, amb uns mínims coneixements d'App Inventor, és fàcil de modificar.
Començarem per un programa senzill i després li farem algunes millores. El programa per al microcontrolador és el següent:
#include <ArduinoBLE.h> #define ledPin 6 // Posem 6 per al de la placa
const char* devUuid = "0000FFE0-0000-1000-8000-00805F9B34FB"; const char* charUuid = "0000FFE1-0000-1000-8000-00805F9B34FB"; String comanda; BLEService Serv(devUuid); BLEStringCharacteristic Character(charUuid, BLERead | BLEWrite, 512);
void setup() {
Serial.begin(9600);
while (!Serial); // Espera que s'activi el canal sèrie
pinMode(ledPin, OUTPUT); // La pota del LED és de sortida
if (!BLE.begin()) { // Inicialitza BLE
Serial.println("BLE ha fallat");
while (1);
} else {
Serial.println("BLE inicialitzat");
}
// Dona el nom que serà visible
BLE.setLocalName("MKR Wi-Fi 1010");
BLE.setAdvertisedService(Serv);
// Afegeix la característica
Serv.addCharacteristic(Character);
// Activa el servei
BLE.addService(Serv);
// Inicialitza el valor per a la característica
Character.writeValue("");
// Fa el dispositiu visible
BLE.advertise();
}
void loop() {
// Definim l'element que controla la connexió
BLEDevice central = BLE.central();
// Si hi ha un element central connectat
if (central) {
Serial.print("Connectat a l'element central ");
// Agafa l'adreça MAC
Serial.println(central.address());
// Instruccions que es faran mentre es mantingui la connexió
while (central.connected()) {
// Si detecta que ens han enviat una comanda
if (Character.written()) {
comanda = Character.value();
Serial.print(F("comanda: "));
Serial.println(comanda);
if (comanda == "On") {
Serial.println(F("LED on"));
digitalWrite(ledPin, HIGH); // Encén el LED
}
if (comanda == "Off") {
Serial.println(F("LED off"));
digitalWrite(ledPin, LOW); // Apaga el LED
}
}
}
// Si es desconnecta
Serial.print(F("Desconnectat a l'element central "));
Serial.println(central.address());
}
}
Abans de començar a crear l'aplicació, hem de tenir en compte que les funcions per a BLE de l'App Inventor no estan incorporades directament a l'entorn i, per tant, les haurem d'afegir. Un cop estiguem dins de la pantalla de disposició dels elements de l'App Inventor, picarem sobre Extension (a la part inferior del menú de l'esquerra) i farem clic a Import extension. En la finestra que s'obre, picarem URL i en el requadre escriurem l'adreça de l'extensió
http://iot.App Inventor.mit.edu/assets/resources/edu.mit.App Inventor.ble-20181124.aix
També podem descarregar l'extensió al nostre ordinador i carregar-la des d'allà.
La pantalla de l'aplicació contindrà els següents elements:
| Propietat | Valor | Comentaris |
| Nom | Screen1 | Aquest nom ja està posat a l'inici i no es pot canviar |
| Propietat | Valor | Comentaris |
| Nom | Label_info | Aquest nom l'hem de posar en el requadre Components |
| Width | Fill parent | |
| Text | Pica Scan per buscar dispositius |
| Propietat | Valor | Comentaris |
| Nom | HorizontalArrangement1 | Aquest nom l'hem de posar en el requadre Components |
| AlignVertical | Center | |
| Width | Fill parent |
| Propietat | Valor | Comentaris |
| Nom | Button_scan | Aquest nom l'hem de posar en el requadre Components |
| Text | Scan |
| Propietat | Valor | Comentaris |
| Nom | ListPicker_conn | Aquest nom l'hem de posar en el requadre Components |
| Text | Connect |
| Propietat | Valor | Comentaris |
| Nom | Button_on | Aquest nom l'hem de posar en el requadre Components |
| Text | On |
| Propietat | Valor | Comentaris |
| Nom | Button_off | Aquest nom l'hem de posar en el requadre Components |
| Text | Off |
| Propietat | Valor | Comentaris |
| Nom | Label_estat | Aquest nom l'hem de posar en el requadre Components |
| Text | Estat |
| Propietat | Valor | Comentaris |
| Nom | Button_llegir | Aquest nom l'hem de posar en el requadre Components |
| Text | Llegir |
| Propietat | Valor | Comentaris |
| Nom | BluetoothLE1 | Aquest nom l'hem de posar en el requadre Components |
La presentació dels elements serà la següent:

El programa és el següent:



A l'hora d'emprar l'aplicació, primer haurem de picar el botó Scan i esperar que ens indiqui que ha trobat dispositius. Llavors picarem el botó Connect i triarem el nostre dispositiu. Un cop connectats, podem fer servir els botons On i Off per encendre i apagar, respectivament, el LED. Amb el botó Llegir podrem veure (a l'espai del seu costat) el darrer valor enviat al LED.
A l'hora de provar el programa del microcontrolador, hem de tenir en compte que aquest no s'iniciarà fins que no obrim el monitor sèrie. Així ens assegurem que no perdem cap informació. Si no ens interessa aquest bloqueig, haurem de suprimir la línia que hem marcat en color.
El botó de llegir de l'aplicació llegeix el darrer valor enviat i no l'estat real del LED. La següent versió del programa permet enviar ordres per controlar, també, el LED des de la consola sèrie i preveu consultar el valor real del LED.
#include <ArduinoBLE.h> #define ledPin 6 // Posem 6 per al de la placa
const char* devUuid = "0000FFE0-0000-1000-8000-00805F9B34FB"; const char* charUuid = "0000FFE1-0000-1000-8000-00805F9B34FB"; String comanda, rebut; BLEService Serv(devUuid); BLEStringCharacteristic Character(charUuid, BLERead | BLEWrite, 512);
void setup() {
Serial.begin(9600);
while (!Serial); // Espera que s'activi el canal sèrie
pinMode(ledPin, OUTPUT); // La pota del LED és de sortida
if (!BLE.begin()) { // Inicialitza BLE
Serial.println("BLE ha fallat");
while (1);
} else {
Serial.println("BLE inicialitzat");
}
// Dona el nom que serà visible
BLE.setLocalName("MKR Wi-Fi 1010");
BLE.setAdvertisedService(Serv);
// Afegeix la característica
Serv.addCharacteristic(Character);
// Activa el servei
BLE.addService(Serv);
// Inicialitza el valor per a la característica
Character.writeValue("");
// Fa el dispositiu visible
BLE.advertise();
}
void loop() {
// Definim l'element que controla la connexió
BLEDevice central = BLE.central();
// Si hi ha un element central connectat
if (central) {
Serial.print("Connectat a l'element central ");
// Agafa l'adreça MAC
Serial.println(central.address());
// Instruccions que es faran mentre es mantingui la connexió
while (central.connected()) {
if (Serial.available() > 0) {
// Llegim el següent caràcter
rebut = Serial.readString();
Serial.print(F("rebut: "));
Serial.println(rebut);
if (rebut == "On") {
Serial.println(F("LED on"));
digitalWrite(ledPin, HIGH); // Encén el LED
Character.writeValue(rebut);
}
if (rebut == "Off") {
Serial.println(F("LED off"));
digitalWrite(ledPin, LOW); // Apaga el LED
Character.writeValue(rebut);
}
}
// Si detecta que ens han enviat una comanda
if (Character.written()) {
comanda = Character.value();
Serial.print(F("comanda: "));
Serial.println(comanda);
if (comanda == "On") {
Serial.println(F("LED on"));
digitalWrite(ledPin, HIGH); // Encén el LED
}
if (comanda == "Off") {
Serial.println(F("LED off"));
digitalWrite(ledPin, LOW); // Apaga el LED
}
}
}
// Si es desconnecta
Serial.print(F("Desconnectat a l'element central "));
Serial.println(central.address());
}
}

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