ble-compteur.ino

ESP32 (original, clase ESP32-WROOM-32) · Archivo : ble-compteur.ino · Lenguaje : Arduino · Uso : Diffuser une valeur en Bluetooth Low Energy

La placa se vuelve un periférico BLE: un servicio personalizado expone un contador de pulsaciones que un teléfono (nRF Connect) lee y sigue por notificaciones. El escenario de radio más simple sin punto de acceso.

Hardware necesario

Una placa ESP32 clásica (módulo ESP32-WROOM-32, doble núcleo Xtensa a 240 MHz, Wi-Fi + Bluetooth) tipo DevKitC / DOIT V1, alimentada por micro-USB. Un teléfono con nRF Connect basta; botón en GPIO4.

Cableado

Botón GPIO4-GND. Nada más: la radio va integrada. Mantenga la antena despejada (sin carcasa metálica).

Funcionamiento

BLEDevice apila servidor, servicio y característica READ|NOTIFY con el descriptor BLE2902 que autoriza notificaciones en el cliente. setValue+notify envía el valor al suscrito. En el Arduino IDE, instale el paquete « esp32 » (Gestor de placas), elija « Dev Module », el puerto y Subir (mantenga BOOT si falla la detección). GPIO34-39 son solo entrada; evite GPIO6-11 y GPIO12.

Para ir más lejos

Añada el nivel de batería (analogReadToMv) a la característica, o pase al perfil estándar 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);
  }
}

← Volver a la ficha