ble_bouton.c
La carte devient périphérique BLE : un service 0xFFF0 expose une caractéristique notify dont la valeur suit le bouton sw0. Un smartphone (app nRF Connect) voit l’appui en temps réel. Base de toute télécommande ou capteur sans fil.
Matériel requis
Une carte nRF52833-DK (Nordic, SoC nRF52833 Cortex-M4F, BLE 5) alimentée par USB : 4 LEDs sur P0.13-P0.16 (actives au niveau bas) et 4 boutons sur P0.11, P0.12, P0.24, P0.25 (actifs bas, pull-up interne à activer). La carte seule côté matériel ; un smartphone avec nRF Connect ou LightBlue côté client.
Câblage
Aucun câblage, l’antenne est embarquée (le MDK a son antenne céramique ; le DK a l’antenne du module).
Fonctionnement
BT_GATT_SERVICE_DEFINE déclare le GATT statiquement ; bt_le_adv_start diffuse le nom ; bt_gatt_notify pousse la valeur aux clients abonnés via le CCC. Kconfig BT=y requis.
Exécution
Projet Zephyr : west build -b nrf52833dk/nrf52833 puis west flash (J-Link embarqué) ; console série 115200 sur le connecteur USB UART.
Variantes
Ajouter la pairing/bonding (CONFIG_BT_SMP), envoyer des mesures de capteur périodiques, ou passer au service standard NUS pour un terminal BLE série.
ble_bouton.c
/* Périphérique BLE : service custom avec caractéristique notify.
* Kconfig : CONFIG_BT=y, CONFIG_BT_PERIPHERAL=y (nRF Connect SDK). */
#include <zephyr/kernel.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/uuid.h>
#include <zephyr/drivers/gpio.h>
static const struct gpio_dt_spec btn =
GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios);
static uint8_t etat_btn;
/* Service 0xFFF0, caractéristique notify 0xFFF1 (UUID 16 bits maison) */
BT_GATT_SERVICE_DEFINE(svc_bouton,
BT_GATT_PRIMARY_SERVICE(BT_UUID16_DECLARE(0xFFF0)),
BT_GATT_CHARACTERISTIC(BT_UUID16_DECLARE(0xFFF1),
BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_READ,
NULL, NULL, &etat_btn),
BT_GATT_CCC(NULL, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),
);
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME,
sizeof(CONFIG_BT_DEVICE_NAME) - 1),
};
int main(void)
{
gpio_pin_configure_dt(&btn, GPIO_PULL_UP);
bt_enable(NULL);
bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad), NULL, 0);
int dernier = -1;
while (1) {
int e = gpio_pin_get_dt(&btn);
if (e != dernier) {
dernier = e;
etat_btn = e;
bt_gatt_notify(NULL, &svc_bouton.attrs[1],
&etat_btn, sizeof(etat_btn));
}
k_msleep(50);
}
return 0;
}