ble_nus.c
El BLE es la razón de ser del nRF52840: este programa difunde un nombre, expone el Nordic UART Service y envía tramas de texto a la app nRF Connect. La plantilla de arranque de cualquier objeto conectado de bajo consumo.
Hardware
Una placa nRF52840-MDK (Nordic nRF52840, Cortex-M4F @ 64 MHz, 1 MB flash / 256 KB RAM, BLE 5 + 802.15.4) con depurador integrado, programada en C con nRF5 SDK v17 y SoftDevice S140. nRF52840-MDK + un móvil con la app gratuita nRF Connect (Android/iOS).
Cableado
Sin cableado: la radio va integrada en la placa, la MDK lleva antena de cerámica.
Funcionamiento
El SoftDevice S140 gestiona la capa de enlace; la publicidad incluye nombre + datos de servicio, NUS añade características RX/TX y ble_nus_string_send notifica al cliente conectado.
Ejecución
Abre el ejemplo equivalente del nRF5 SDK v17 (objetivo custom_board), pega este código en main.c, compila con Segger Embedded Studio o el Makefile de gcc y programa por el depurador integrado.
Variantes
Pasar a conectable + emparejamiento, añadir Battery Service (medida SAADC), o ampliar el alcance con el PHY Coded (BLE de largo alcance).
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);
}
}