ble_service.ino
La radio BLE (module NINA) diffuse un service custom F0F0 avec une caractéristique notify de température en dixièmes de degré. Depuis l’app nRF Connect, la valeur se met à jour en direct — le patron de tout capteur sans fil Arduino.
Matériel requis
Une Arduino Nicla Vision (STM32H7 double cœur M7+M4, 23×23 mm) avec caméra GC2145 2 MP, IMU LSM6DSOX, micro PDM, capteur ToF (famille VL53Lx), module sans fil ESP32 (Wi-Fi/BLE) et LED RGB (LEDR=23, LEDG=24, LEDB=25). La carte seule ; un smartphone avec nRF Connect ou LightBlue pour lire la caractéristique.
Câblage
Aucun câblage. Remplacer la simulation par un capteur réel (I2C ou 0-3,3 V sur A0=broche 15) pour une température vraie.
Fonctionnement
BLE.begin allume la radio ; le service et la caractéristique sont déclarés avant advertise ; writeValue déclenche une notification vers les clients abonnés. BLE.poll fait tourner la pile.
Exécution
Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_VISION) sur le port USB-C ; bibliothèques Camera, PDM, Arduino_LSM6DSOX, WiFiNINA et ArduinoBLE fournies.
Variantes
Ajouter plusieurs caractéristiques (humidité, RSSI), activer le pairing, ou connecter le BLE et le Wi-Fi simultanément pour un passerelle capteur → cloud.
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);
}
}