ble-compteur.ino

ESP32 (original, classe ESP32-WROOM-32) · Fichier : ble-compteur.ino · Langage : Arduino · Usage : Diffuser une valeur en Bluetooth Low Energy

La carte devient un périphérique BLE : un service personnalisé expose un compteur d'appuis qu'un téléphone (nRF Connect) lit et suit par notifications. Le plus simple des scénarios radio sans point d'accès.

Matériel requis

Une carte ESP32 classique (module ESP32-WROOM-32, double cœur Xtensa 240 MHz, Wi-Fi + Bluetooth) type DevKitC / DOIT V1, alimentée par micro-USB. Un téléphone avec nRF Connect suffit ; bouton sur GPIO4.

Branchement

Bouton GPIO4-GND. Rien d'autre : la radio est embarquée. Gardez l'antenne dégagée (pas de boîtier métallique).

Fonctionnement

BLEDevice empile serveur, service et caractéristique READ|NOTIFY avec le descripteur BLE2902 qui autorise les notifications côté client. setValue+notify pousse la valeur vers l'abonné. Dans l'Arduino IDE, installez le paquet « esp32 » (Gestionnaire de cartes), choisissez « Dev Module », le port, puis Téléverser (maintenez BOOT si la détection échoue). GPIO34-39 sont entrées seules ; évitez GPIO6-11 et GPIO12.

Pour aller plus loin

Ajouter le niveau de batterie (analogReadToMv) dans la caractéristique, ou passer au profil standard Battery Service.

ble-compteur.ino

// BLE : un service « compteur » notifie l'appui sur GPIO4.
// Appairer avec nRF Connect (Android/iOS), service 12AB, caract. 3400.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#define SERVICE_UUID  "12AB56DA-7B42-11E5-99AC-625662870701"
#define CHAR_UUID     "12AB56DB-7B42-11E5-99AC-625662870701"

BLECharacteristic *pChar;
bool diffuse = false;
int compteur = 0;

void setup() {
  Serial.begin(115200);
  pinMode(4, INPUT_PULLUP);
  BLEDevice::init("compteur-ble");
  BLEServer *serveur = BLEDevice::createServer();
  BLEService *service = serveur->createService(SERVICE_UUID);
  pChar = service->createCharacteristic(
      CHAR_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY);
  pChar->addDescriptor(new BLE2902());
  service->start();
  BLEDevice::getAdvertising()->start();
  Serial.println("Broadcast — attend un client");
}

void loop() {
  if (digitalRead(4) == LOW && millis() % 1000 < 20) {
    compteur++;
    if (diffuse) {
      String v = String(compteur);
      pChar->setValue(v.c_str());
      pChar->notify();
      Serial.printf("notif %d\n", compteur);
    }
    delay(250);
  }
}

← Retour à la fiche