- Kit de desarrollo nRF52:
- Estudio integrado de Segger
- DHT11 con nRF52DK
- ¿Cómo trabajar con Bluetooth Low Energy (BLE)?
- Diagrama de características / servicio BLE
- Explicación del programa nRF52 BLE
- Probando nuestro programa usando nRF Connect
Con las bandas de fitness, los relojes inteligentes y otros dispositivos portátiles cada vez más populares, el uso de Bluetooth 5 / Bluetooth Low Energylas normas de comunicación se están adoptando ampliamente. BLE nos ayuda a intercambiar datos a corta distancia con muy poca energía, lo cual es muy importante para los dispositivos que funcionan con baterías, como los wearables. También nos ayuda a configurar redes de malla BLE inalámbricas, esta función es útil para los dispositivos de automatización del hogar donde varios dispositivos tienen que comunicarse entre sí en un entorno cerrado. Ya hemos utilizado BLE con Raspberry Pi y BLE con ESP32 para realizar algunas funciones básicas de BLE. Los ingenieros están experimentando con BLE para diseñar dispositivos inalámbricos portátiles que puedan funcionar durante mucho tiempo con baterías pequeñas y hay varios kits de desarrollo disponibles para trabajar con BLE. En nuestra revisión reciente de Arduino Nano 33, también notamos que la placa tiene nRF52840 con capacidades BLE.
En este tutorial, exploraremos otra placa de desarrollo popular y emocionante llamada nRF52 DK para medir la temperatura y la humedad mediante BLE. De forma predeterminada, BLE Environment Sensing Profiles admite una amplia gama de parámetros ambientales, pero este tutorial se limita solo a los valores de temperatura y humedad. Esta solución se conecta con un teléfono inteligente a través de Bluetooth de baja energía y proporciona una actualización frecuente sobre los parámetros ambientales, es decir, temperatura, humedad. Usaremos el sensor DHT1 y la medición de temperatura se realizará con una resolución de 0.01 grados Celsius y la medición de humedad se realizará con una resolución de 0.01 por ciento.
Kit de desarrollo nRF52:
nRF52DK es una plataforma de creación de prototipos completa para la aplicación de Internet de las cosas inalámbrica de 2,4 GHz y Bluetooth de baja energía. El kit de desarrollo admite varias cadenas de herramientas estándar de Nordic, como entornos de desarrollo integrados comerciales, GCC y de código abierto como Keil, IAR y Segger Embedded Studio, etc. Nordic también proporciona un completo kit de desarrollo de software para nRF52, que incluye soporte completo para nRF52DK.
nRF52DK se alimenta con el microcontrolador nRF52832 ARM Cortex-M4F, que está integrado con 512 Kbytes de Flash Memor y 64 Kbytes de SRAM. nRF52DK tiene un depurador integrado Segger J-Link On Board, que proporciona una depuración más fácil y rápida sin dispositivos de depuración jtag externos / adicionales. También incluye el conector compatible con Arduino Uno Rev3, que admite la interfaz de las entradas analógicas y digitales con el microprocesador y también incluye protocolos de comunicación estándar como I2C (Circuito interintegrado), SPI (Interfaz periférica en serie) y UART (Receptor y transmisor asíncrono universal). Este kit de desarrollo está diseñado con una antena de PCB integrada que proporciona comunicación inalámbrica de corto alcance utilizando Bluetooth Low Energy para conectarse con teléfonos inteligentes, computadoras portátiles y tabletas.
Estudio integrado de Segger
Para programar la placa de desarrollo, usaremos Segger Embedded Studio con nRF52. Segger Embedded Studio es un potente entorno de desarrollo integrado (IDE) C / C ++ dirigido específicamente al desarrollo de sistemas integrados. Esto proporciona una solución todo en uno completa que contiene todo lo necesario para la programación, el desarrollo y la depuración de C integrados. Esto incluye un flujo de trabajo completo para la programación y el desarrollo de sistemas integrados, con gestión de proyectos, editor y depurador compatible con dispositivos ARM Cortex. Este IDE potente y fácil de usar es completamente gratuito para los clientes nórdicos con licencia completa sin restricciones de tamaño de código. El IDE se puede descargar desde el enlace que figura a continuación,
Descarga Segger Embedded Studio
DHT11 con nRF52DK
El DHT11 es un sensor de temperatura y humedad con todas las funciones con un componente de medición de humedad de tipo resistivo y un componente de medición de temperatura de tipo NTC. Ofrece una excelente calidad, una respuesta más rápida y una rentabilidad. De forma predeterminada, todos los sensores DHT11 se calibran en el laboratorio, lo que conduce a una precisión y fiabilidad extremas. Se comunica mediante el sistema de interfaz serie de un solo cable y a continuación se dan otras especificaciones
Especificaciones de DHT11:
- Rango de humedad: 20 - 90% RH
- Rango de temperatura: 0 - 50 grados centígrados
- Precisión de humedad: ± 5 % RH
- Precisión de temperatura: ± 2 ℃
Diagrama de tiempo de DHT11:
Leer los datos del sensor DHT11 es relativamente sencillo usando el diagrama de tiempo que se muestra arriba. El procedimiento es similar a cualquier controlador y ya hemos usado este sensor con otras plataformas de desarrollo como
- Sensor DHT11 con Raspberry Pi
- Sensor DHT11 con PIC16F877A
- Sensor DHT11 con STM32F103C8
- Sensor DHT11 con NodeMCU
Para conectar el sensor de temperatura y humedad DHT11 con el kit de desarrollo nRF52, siga el diagrama de conexión que se muestra a continuación.
Estoy usando un módulo conector para conectar el sensor a mi placa, por lo que mi configuración final se ve así
Diagrama de flujo para comunicarse con DHT11:
El siguiente diagrama de flujo explica el flujo lógico del programa que usaremos para comunicarnos entre nRF52DK y DHT11
Formato de datos:
¿Cómo trabajar con Bluetooth Low Energy (BLE)?
Para comprender cómo usar la función BLE, debemos comprender algunas terminologías básicas que se explican a continuación, también puede leer el artículo ESP32 BLE para saber más sobre BLE
Perfil de acceso genérico (GAP)
Generic Access Profile tiene la responsabilidad total de establecer la conexión para la comunicación entre el periférico BLE y los dispositivos centrales. GAP también proporciona varios procedimientos que incluyen escaneo / descubrimiento de dispositivos, establecimiento de conexión de capa de enlace, terminación de enlace, establecimiento de comunicación de características de seguridad y configuración de dispositivo completa. GAP funciona en los siguientes estados de dispositivo
Estados GAP |
Descripción |
Colocarse |
Estado inicial del dispositivo al reiniciar |
Anunciante |
Publicidad de dispositivos con datos que ayudan al escaneo del iniciador |
Escáner |
Recibe la solicitud de escaneo y la envía al anunciante |
Iniciador |
Envía una solicitud de conexión para establecer un enlace |
Maestro esclavo |
Al conectarse, dispositivo como esclavo si es anunciante, maestro si es iniciador |
Capa de perfil de atributo genérico (GATT)
GATT es la abreviatura de Generic Attribute Profile Layer, es responsable de la comunicación de datos entre dos dispositivos BLE (Peripheral y Central). La comunicación de datos se caracteriza en forma de características, que comunican y almacenan los datos. El dispositivo BLE desempeña dos funciones diferentes para la comunicación del dispositivo que se indican a continuación,
- El servidor GATT contiene la información de características que se utilizará para leer y escribir. En nuestro tutorial, el sensor DHT11 y dev. el kit es nuestro servidor GATT.
- El cliente GATT lee y escribe los datos desde / hacia el servidor GATT. El teléfono inteligente es un cliente GATT que lee y escribe los datos en nuestra placa de sensores.
Bluetooth SIG
El Grupo de Interés Especial de Bluetooth (SIG) es la organización de estándares que monitorea el desarrollo de los estándares de Bluetooth y la licencia de las tecnologías de Bluetooth. El grupo SIG no produce ni vende ningún producto Bluetooth. Define la especificación y estandarización de Bluetooth. Definen el identificador único para el perfil de baja energía de Bluetooth y sus respectivas características. Las especificaciones del perfil GATT se pueden encontrar en el enlace siguiente
Especificaciones del perfil GATT
Según la especificación del GATT que se proporciona en el enlace anterior, hemos recopilado los identificadores únicos necesarios para nuestro proyecto que se enumeran a continuación.
Perfil / Características |
UUID |
GAP (acceso genérico) |
0x1800 |
GATT (atributo genérico) |
0x1801 |
ESS (detección ambiental) |
0x181A |
Temperatura |
0x2A6E |
Humedad |
0x2A6F |
Diagrama de características / servicio BLE
UUID BLE
UUID |
Valor de 16 bits |
UUID de 128 bits |
Servicio ESS |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Temp Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Char de humedad |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Caracteristicas de temperatura
Propiedad |
Descripción |
Unidad |
Grado Celsius con una resolución de 0,01 grados |
Formato |
sint16 |
UUID |
0x2A6E |
Exponente decimal |
2 |
Leer |
Obligatorio |
Características de humedad
Propiedad |
Descripción |
Unidad |
Porcentaje con una resolución del 0,01 por ciento |
Formato |
uint16 |
UUID |
0x2A6F |
Exponente decimal |
2 |
Leer |
Obligatorio |
Explicación del programa nRF52 BLE
Usaremos el SDK nRF5 para programar nuestro kit de desarrollo nRF52. nRF5 SDK es un completo kit de desarrollo de software integrado con numerosos perfiles de Bluetooth de baja energía, serializador GATT y compatibilidad con controladores para todos los periféricos de los SoC de la serie nRF5. Este SDK ayuda a los desarrolladores a crear aplicaciones Bluetooth de baja energía con todas las funciones, confiables y seguras con las series de microcontroladores nRF52 y nRF51. El programa completo se puede descargar desde aquí, la explicación del código es la siguiente.
Configure el pin DHT11 DATA como entrada en nrf52 con pull up enable. El estado del pin debe ser alto para confirmar que nRF52 proporciona el PULLUP adecuado para el pin de datos DHT11
/ * establecer como entrada y comprobar si la señal se eleva * / Data_SetInput (); DelayUSec (50); if (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
Genere la señal de INICIO desde el microcontrolador nRF52 y verifique la señal de reconocimiento.
/ * enviar señal de inicio * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * mantener la señal baja durante al menos 18 ms * / Data_SetInput (); DelayUSec (50); / * comprobar la señal de reconocimiento * / if (Data_GetVal ()! = 0) {/ * la señal debe ser bajada por el sensor * / return DHT11_NO_ACK_0; } / * espere un máximo de 100 us por la señal de confirmación del sensor * / cntr = 18; while (Data_GetVal () == 0) {/ * esperar hasta que la señal suba * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_1; / * la señal debería estar activa para el ACK aquí * /}} / * esperar hasta que vuelva a bajar, fin de la secuencia de ack * / cntr = 18; while (Data_GetVal ()! = 0) {/ * esperar hasta que la señal baje * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_0; / * la señal debería bajar a cero nuevamente aquí * /}}
Ahora lea los 40 bits de datos que contienen 2 bytes de temperatura, 2 bytes de humedad y 1 byte de suma de comprobación.
/ * ahora lee los datos de 40 bits * / i = 0; datos = 0; loopBits = 40; hacer {cntr = 11; / * esperar un máximo de 55 us * / while (Data_GetVal () == 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_0; }} cntr = 15; / * esperar un máximo de 75 us * / while (Data_GetVal ()! = 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_1; }} datos << = 1; / * siguiente bit de datos * / if (cntr <10) {/ * señal de datos alta> 30 us ==> bit de datos 1 * / datos - = 1; } if ((loopBits & 0x7) == 1) {/ * siguiente byte * / buffer = data; i ++; datos = 0; }} while (- loopBits! = 0);
Valide los datos con la ayuda de Checksum.
/ * prueba CRC * / if ((uint8_t) (búfer + búfer + búfer + búfer)! = búfer) {return DHT11_BAD_CRC; }
Manipular y almacenar la temperatura y la humedad.
/ * almacenar valores de datos para la persona que llama * / humedad = ((int) buffer) * 100 + buffer; temperatura = ((int) tampón) * 100 + tampón;
Inicialice el servicio nRF5 SDK Logger. nRF52 SDK se presenta con una interfaz de control de registro llamada nrf_log y utiliza el backend predeterminado para registrar la información. El backend predeterminado será un puerto serie. Aquí inicializamos tanto nrf_log interfaz de control y nrf_log backends por defecto también.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (err_code); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK tiene funcionalidad de temporizador de aplicación. El módulo de temporizador de aplicación permite crear múltiples instancias de temporizador basadas en el periférico RTC1. Aquí inicializamos el módulo temporizador de aplicación nRF5. En esta solución, se utilizan dos temporizadores de aplicaciones para un intervalo de actualización de datos.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK tiene el módulo de administración de energía con todas las funciones , ya que los dispositivos BLE deben funcionar durante varios meses con una batería de celda de moneda. La administración de energía juega un papel vital en las aplicaciones BLE. El módulo de administración de energía nRF52 maneja completamente lo mismo. Aquí inicializamos el módulo de administración de energía de nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK tiene un archivo hexadecimal de firmware de Nordic Soft Device incorporado, que cuenta con una pila central y periférica de baja energía Bluetooth. Esta pila de protocolos altamente calificada incluye GATT, GAP, ATT, SM, L2CAP y Link Layer. Aquí seguimos la secuencia de inicialización, que inicializó la pila de radio nRF5 BLE (dispositivo suave nórdico)
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (err_code); // Configure la pila BLE usando la configuración predeterminada. // Obtener la dirección de inicio de la RAM de la aplicación. uint32_t ram_start = 0; err_code = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (err_code); // Habilita la pila BLE. err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (err_code); // Registra un controlador para eventos BLE. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP es responsable del escaneo / descubrimiento de dispositivos, el establecimiento de enlaces, la terminación de enlaces, el inicio de las funciones de seguridad y la configuración. GAP se ha presentado con parámetros de conexión clave como intervalo de conexión, latencia del esclavo, tiempo de espera de supervisión, etc. Inicializando los parámetros de conexión del perfil de acceso genérico
ret_code_terr_code; ble_gap_conn_params_tgap_conn_params; ble_gap_conn_sec_mode_t sec_mode; BLE_GAP_CONN_SEC_MODE_SET_OPEN (& sec_mode); err_code = sd_ble_gap_device_name_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (err_code); memset (& gap_conn_params, 0, tamaño de (gap_conn_params)); gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; gap_conn_params.slave_latency = SLAVE_LATENCY; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; err_code = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (err_code);
GATT es responsable de la comunicación de datos entre los dispositivos centrales y periféricos BLE. El módulo nRF52 GATT es útil para negociar y realizar un seguimiento del tamaño máximo de ATT_MTU. Aquí inicializamos el módulo de atributos genéricos nRF52 SDK, ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (err_code);
GATT realiza la comunicación de datos en forma de servicios y características. Aquí inicializamos los servicios de detección ambiental del GATT, que incluyen la inicialización de características como temperatura y humedad.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Inicializar el módulo de escritura en cola. qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (err_code); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = ble_ess_init (& m_ess); APP_ERROR_CHECK (err_code);
La publicidad juega un papel vital en el entorno de aplicaciones BLE. Los paquetes incluyen la información del tipo de dirección, tipo de publicidad, datos de publicidad, datos específicos del fabricante del dispositivo y datos de respuesta de escaneo. nRF52 SDK presentado con un módulo de publicidad. Aquí realizamos la inicialización del módulo publicitario con los parámetros.
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // Generar y configurar datos publicitarios. memset (& advdata, 0, tamaño de (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = true; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; memset (& srdata, 0, tamaño de (srdata)); srdata.uuids_complete.uuid_cnt = tamaño de (adv_uuids) / tamaño de (adv_uuids); srdata.uuids_complete.p_uuids = adv_uuids; err_code = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (err_code); err_code = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (err_code); ble_gap_adv_params_t adv_params; // Establecer parámetros publicitarios. memset (& adv_params, 0, tamaño de (adv_params)); adv_params.primary_phy = BLE_GAP_PHY_1MBPS; adv_params.duration = APP_ADV_DURATION; adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.interval = APP_ADV_INTERVAL; err_code = sd_ble_gap_adv_set_configure (& m_adv_handle, & m_adv_data, & adv_params); APP_ERROR_CHECK (err_code);
La conexión BLE se manejará y monitoreará con varios parámetros de conexión, como el retraso de actualización de los parámetros de la primera conexión, los siguientes retrasos consecutivos, el recuento de actualizaciones, la función de devolución de llamada del controlador de eventos de conexión y el controlador de eventos de devolución de llamada de error de conexión. Aquí realizamos los parámetros de establecimiento de conexión BLE de inicialización y un controlador de eventos de devolución de llamada para eventos de conexión y eventos de error.
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, tamaño de (cp_init)); cp_init.p_conn_params = NULL; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; t_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; cp_init.disconnect_on_fail = falso; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; err_code = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (err_code);
Después de completar la inicialización del sistema, aquí comenzamos con la publicidad del nombre del dispositivo BLE y la información de capacidad. Desde aquí, este periférico se puede ver en la lista de escaneo Ble del teléfono inteligente.
ret_code_terr_code; err_code = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (err_code);
El bucle principal se ejecuta en un intervalo de 2 segundos, lee la temperatura y la humedad y se actualiza a un dispositivo inteligente conectado mediante lectura o notificación
para (;;) { uint16_t temperatura, humedad; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); if (updtmrexp) { dhtErrCode = DHTxx_Read (& temperatura, & humedad); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Temperatura:% d Humedad:% d \ n", temperatura, humedad); if (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, temperatura); } else { ble_ess_update_temp (& m_ess, temperatura); } if (notif_humedad_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, humedad); } else { ble_ess_update_humid (& m_ess, humedad); } } updtmrexp = falso; } }
Probando nuestro programa usando nRF Connect
nRF Connect es una potente herramienta Bluetooth de baja energía que permite escanear y explorar los periféricos habilitados para BLE. nRF Connect para dispositivos móviles admite una amplia gama de perfiles estándar adoptados por Bluetooth SIG. Podemos verificar nuestro programa usando esto, después de instalar la aplicación podemos emparejar la placa nRF52 con nuestro teléfono buscando dispositivos BLE en la aplicación. Dentro del atributo de detección ambiental, podemos notar que los valores de temperatura y humedad se actualizan como se muestra en las imágenes a continuación.
Hariharan Veerappan es un consultor independiente con más de 15 años de experiencia en el desarrollo de productos integrados. Brinda servicios de consultoría en desarrollo de firmware integrado / Linux, también brinda capacitación corporativa y en línea. Hariharan tiene una licenciatura en ingeniería en la disciplina de Ingeniería Electrónica y de la Comunicación, a través de sus artículos y tutoriales comparte su experiencia y pensamientos con los lectores de Circuit Digest.