La biblioteca ArduinoBLE té moltes funcions i possibilitats, aquí només comentarem les que fem servir en aquest web. Podeu trobar la descripció completa a la pàgina ArduinoBLE library.
Per poder fer servir aquesta biblioteca caldrà que estigui instal·lada. Podeu trobar les instruccions a instal·lació de biblioteques.
El Bluetooth 4.0 inclou tant el Bluetooth clàssic com el Bluetooth Low Energy (Bluetooth LE o BLE). El xip NINA-W10 que porta la placa MKR WiFi 1010 admet els dos tipus de Bluetooth però aquí comentarem només Bluetooth LE perquè és més flexible i Arduino disposa d'una biblioteca que ens facilita molt la feina.
La comunicació Bluetooth LE actua en base a uns dispositius que publiquen informació i uns altres dispositius que la llegeixen. Un bon símil seria un tauler d’anuncis en el que hi ha uns elements que pengen informació i uns altres que la llegeixen però si no la llegeixen en el moment oportú pot quedar substituïda per una versió més recent de la informació. Cada element pot ser un dels que publiquen (anomenats perifèrics) o un dels que llegeixen (anomenats dispositius centrals).
La informació que presenta un perifèric s'estructura com a un o més serveis, cada cun dels quals es subdivideix en característiques. Podríem assimilar els serveis a un document penjat al tauler i les característiques com cada un dels requadres que hi ha a cada document. Hi ha característiques sobre les que tant el perifèric corresponent com els elements centrals hi poden llegir i escriure i altres sobre les que cada un només pot fer una de les dues operacions.
Els serveis i les característiques s'identifiquen mitjançant números únics anomenats UUID, que poden ser de 16 bits (quatre xifres hexadecimals) o 128 bits (32 xifres). Per a les aplicacions comercials hi ha uns UUID establerts segons el tipus de servei però per fer prototipus tenim més flexibilitat.
A l'hora d'enviar diversos valors, podem optar per crear una característica per a cada valor (fent que siguin independents entre ells i més fàcils de tractar) o agrupant diversos valors en una sola característica (que és més eficient a l'hora d'enviar). En qualsevol cas, cal tenir present que hi ha un límit en el nombre de bytes que pot contenir una característica, típicament 512 bytes.
Per crear un servei, li hem de donar un nom i assignar-li un UUID. Per exemple:
const char* devUuid = "0000FFE0-0000-1000-8000-00805F9B34FB"; BLEService sensorServ(devUuid);
En el cas de les característiques, cal donar un nom, assignar un UUID i indicar quines accions estan activades (llegir, escriure, etc.). Les accions es posen com a una funció o entre les opcions que s'han triat. Opcionalment, podem indicar la mida màxima de la informació que pot contenir. Per exemple:
const char* charUuid = "0000FFE1-0000-1000-8000-00805F9B34FB"; BLEStringCharacteristic humitatCharacter(charUuid, BLERead | BLEWrite, 512);
Els UUID dels serveis i les característiques han de ser tots diferents entre ells.
La biblioteca inclou la possibilitat d'enviar dades de diferents tipus (byte, char, float, etc.) però probablement és més fàcil enviar totes les dades com a text (String) i, si cal, tractar-les adequadament.
El primer és inicialitzar el servei amb BLE.begin. Si l'ús de la comunicació Bluetooth és imprescindible per al bon funcionament del nostre programa, podem fer que es bloquegi si no s'ha pogut inicialitzar correctament:
if (!BLE.begin()) { // Inicialitza BLE
Serial.println("BLE ha fallat");
while (1);
} else {
Serial.println("BLE inicialitzat");
}
Els elements perifèrics es mostren públicament amb un nom que podem indicar de la següent manera:
BLE.setLocalName("MKR Wi-Fi 1010");
El nom que hem posat en aquest cas ens identifica clarament quin dels elements que podem veure com a perifèrics és el nostre microcontrolador, però si en tenim uns quants preferirem posar noms que ens permetin diferenciar-los:
BLE.setLocalName("Sensor temperatura");
Un cop establer el nom, podem publicar el servei:
BLE.setAdvertisedService(sensorServ);
Abans de poder fer servir la comunicació Bluetooth, hem d'assignar les seves característiques a cada servei i els serveis al mòdul Bluetooth.
// Afegeix la característica sensorServ.addCharacteristic(humitatCharacter); // Activa el servei BLE.addService(sensorServ);
Quan ja tenim el sistema configurat, farem el dispositiu visible per tal que pugui ser trobat pels elements centrals.
BLE.advertise();
En previsió que el dispositiu central es pugui desconnectar, la gestió de la connexió la farem des del loop i així si perdem la connexió podrem estar atents a quan es torni a connectar. Podem mantenir un bucle while que estigui actiu mentre la connexió està funcionant.
// 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 es desconnecta
Serial.print(F("Desconnectat a l'element central "));
Serial.println(central.address());
}
Per escriure dades (per a que siguin llegides des de l'element central) podem emprear la comanda writeValue:
String dada;
humitatCharacter.writeValue(dada);
Abans de llegir dades serà convenient comprovar que n'han arribat (amb la funció written, després les llegirem amb value:
String comanda;
if (humitatCharacter.written()) {
comanda = humitatCharacter.value();
...
}

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