ble_nus.c

nRF52840-MDK (id boards.json : nrf52840-mdk) · Fichier : ble_nus.c · Langage : C · Usage : Diffuser un service BLE et envoyer des mesures

Le BLE est la raison d'être du nRF52840 : ce programme diffuse un nom, expose le Nordic UART Service et envoie des trames texte à l'app nRF Connect. Le gabarit de départ de tout objet connecté basse consommation.

Matériel requis

Une carte nRF52840-MDK (Nordic nRF52840, Cortex-M4F @ 64 MHz, 1 Mo flash / 256 Ko RAM, BLE 5 + 802.15.4) avec son debugger intégré, programmée en C sous nRF5 SDK v17 et SoftDevice S140. nRF52840-MDK + un smartphone avec l'app gratuite nRF Connect (Android/iOS).

Câblage

Aucun câblage : la radio est embarquée sur la carte, antenne céramique intégrée à la MDK.

Fonctionnement

Le SoftDevice S140 gère la couche lien ; la pub contient le nom + données de service, NUS ajoute caractéristiques RX/TX, ble_nus_string_send notifie le client connecté.

Exécution

Ouvrir l'exemple correspondant du nRF5 SDK v17 (target custom_board), coller ce code dans main.c, compiler avec Segger Embedded Studio ou Makefile gcc, puis programmer via le debugger intégré (flash_nrf.py ou IDE).

Variantes

Passer en connectable + pairage, ajouter Battery Service (mesure SAADC), ou augmenter la portée avec le PHY Coded (BLE longue portée).

ble_nus.c

// nRF52840-MDK : peripheral BLE avec Nordic UART Service (NUS) sous SoftDevice S140.
// L'app "nRF Connect" voit "MDK-Capteur" et reçoit les notifications.
#include "nrf_sdh.h"
#include "nrf_sdh_ble.h"
#include "ble_advdata.h"
#include "nrf_ble_gatt.h"
#include "ble_nus.h"
#include "app_timer.h"

#define MANIFEST "MDK-Capteur"
NRF_BLE_GATT_DEF(m_gatt);
BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);
static uint8_t trame[] = "t=21.5C";

static void conn_handle(ble_evt_t const *p, void *ctx) {
  switch (p->header.evt_id) {
    case BLE_GAP_EVT_CONNECTED:  // un client est connecté
      break;
    case BLE_GAP_EVT_DISCONNECTED:
      (void)ble_advertising_start();      // reprendre la publicité
      break;
  }
}

int main(void) {
  nrf_sdh_enable_request();
  app_timer_init();
  uint32_t ram = nrf_sdh_ble_default_cfg_set(1, NULL);
  nrf_sdh_ble_enable(&ram);
  nrf_ble_gatt_init(&m_gatt, NULL);
  ble_nus_init(&m_nus, NULL);
  ble_radio_notification_init(3, 0, NULL, false);

  ble_advdata_t adv = { .name_type = BLE_ADV_DATA_NAME_COMPLETE,
                        .p_name = MANIFEST };
  ble_advdata_service_data_t sd = { .service_uuid = BLE_NUS_UUID,
                                    .data = { .p_data = trame,
                                              .size = sizeof(trame) - 1 } };
  adv.p_service_data = &sd; adv.service_count = 1;
  ble_advertising_start(BLE_ADV_MODE_FAST);

  for (;;) {
    app_sleep();                       // le SoftDevice gère les connexions
    ble_nus_string_send(&m_nus, trame, sizeof(trame) - 1);
  }
}

← Retour à la fiche