ble-capteur.ino

Arduino Nano ESP32 · Fichier : ble-capteur.ino · Langage : Arduino · Usage : Publier une mesure en BLE avec ArduinoBLE

Le BLE du S3 avec ArduinoBLE : la carte annonce un service 181A avec une caractéristique de mesure que tout smartphone peut lire ou écouter (notify). Le niveau analogique est poussé chaque seconde vers le central connecté, sans polling côté application.

Matériel requis

Un Arduino Nano ESP32 (ESP32-S3 double cœur, Wi-Fi 2,4 GHz + Bluetooth Low Energy, brochage physique compatible Nano, USB natif, broches 3,3 V uniquement). Nano ESP32, smartphone avec nRF Connect (ou autre scanner BLE), capteur sur A0.

Câblage

Rien à câbler pour tester avec une broche flottante ; capteur 0-3,3 V sur A0 en usage réel.

Fonctionnement

BLE.advertise diffuse le nom et le service ; central.connected() garde la session ouverte. writeValue sur une caractéristique BLENotify envoie une notification ATT vers le smartphone.

Exécution

Installez le package Arduino ESP32 Boards (ou le guide Nano ESP32 officiel), sélectionnez Arduino Nano ESP32, téléversez. Les broches sont en 3,3 V : n'envoyez jamais 5 V sur une entrée. Le moniteur série utilise l'USB natif.

Variantes

Ajoutez la pairing/bonding pour chiffrer la liaison, ou émulez le profil standard Battery (0x180F) pour être visible des OS sans app dédiée.

ble-capteur.ino

// Service BLE personnalise sur le Nano ESP32 (ArduinoBLE).
// Une caracteristique "mesure" notifie le niveau analogique.
#include <ArduinoBLE.h>

BLEService service("181A"); // service capteur environnemental
BLEUnsignedCharCharacteristic mesure("2A6E", BLERead | BLENotify);

void setup() {
  Serial.begin(115200);
  if (!BLE.begin()) {
    Serial.println(F("BLE KO"));
    while (true);
  }
  BLE.setLocalName("NanoESP32-Capteur");
  BLE.setAdvertisedService(service);
  service.addCharacteristic(mesure);
  BLE.addService(service);
  mesure.writeValue(0);
  BLE.advertise();
  Serial.println(F("BLE pret, en attente de connexion"));
}

void loop() {
  BLEDevice central = BLE.central();
  if (central) {
    Serial.print(F("Connecte : "));
    Serial.println(central.address());
    while (central.connected()) {
      int brut = analogRead(A0);
      uint8_t niveau = map(brut, 0, 4095, 0, 255); // ADC 12 bits
      mesure.writeValue(niveau); // BLENotify : pousse vers le central
      delay(1000);
    }
    Serial.println(F("Central deconnecte"));
  }
}

← Retour à la fiche