ble_service.ino
La radio BLE (módulo NINA) difunde un servicio custom F0F0 con una característica notify que lleva la temperatura en décimas de grado. Desde la app nRF Connect el valor se actualiza en vivo: el patrón de todo sensor inalámbrico Arduino.
Hardware
Una Arduino Nicla Vision (STM32H7 M7+M4, 23×23 mm) con cámara GC2145, IMU LSM6DSOX, micrófono PDM, ToF (VL53Lx), módulo ESP32 Wi-Fi/BLE y LED RGB (LEDR/G/B). La placa sola; un teléfono con nRF Connect o LightBlue para leer la característica.
Cableado
Sin cableado. Sustituir la simulación por un sensor real (I2C o 0-3,3 V en A0 = pin 15) para temperatura verdadera.
Funcionamiento
BLE.begin enciende la radio; servicio y característica se declaran antes de advertise; writeValue dispara una notificación a los clientes suscritos. BLE.poll mueve la pila.
Ejecución
Programación desde Arduino IDE (core ArduinoCore-mbed) por USB-C; librerías Camera, PDM, LSM6DSOX, WiFiNINA y ArduinoBLE.
Variantes
Añadir varias características (humedad, RSSI), activar pairing, o conectar BLE y Wi-Fi a la vez como pasarela sensor → nube.
ble_service.ino
// Périphérique BLE : service custom + caractéristique notify
// portant la température (ici simulée, à câbler sur un capteur).
// Bibliothèque ArduinoBLE du core.
#include <ArduinoBLE.h>
BLEService surveillance("F0F0");
BLEIntCharacteristic temperature("F0F1", BLENotify | BLERead);
void setup() {
Serial.begin(115200);
if (!BLE.begin()) {
Serial.println("Radio BLE indisponible");
while (1) { ; }
}
BLE.setLocalName("NiclaVision");
BLE.setAdvertisedService(surveillance);
surveillance.addCharacteristic(temperature);
BLE.addService(surveillance);
temperature.writeValue(210); // 21,0 °C en dixièmes
BLE.advertise();
Serial.println("BLE « NiclaVision » diffusé");
}
void loop() {
BLE.poll(); // sert la pile BLE
static unsigned long t = 0;
if (millis() - t > 2000) { // rafraîchit toutes les 2 s
t = millis();
int dixiemes = 200 + random(0, 50); // simulation capteur
temperature.writeValue(dixiemes);
}
}