- Kit de desenvolupament nRF52:
- Segger Embedded Studio
- DHT11 amb nRF52DK
- Com es pot treballar amb Bluetooth Low Energy (BLE)?
- Servei BLE / Esquema de característiques
- Explicació del programa nRF52 BLE
- Provant el nostre programa mitjançant nRF Connect
Amb les bandes de fitness, els rellotges intel·ligents i altres dispositius portàtils cada cop més populars l’ús de Bluetooth 5 / Bluetooth Low Energys’estan adoptant àmpliament normes de comunicació. BLE ens ajuda a intercanviar dades a poca distància amb molt poca energia, cosa que és molt crucial per als dispositius que funcionen amb bateria, com ara els equips portables. També ens ajuda a configurar xarxes de malla BLE sense fils, aquesta funció és útil per a dispositius domòtics on diversos dispositius han de comunicar-se entre ells en un entorn tancat. Ja hem utilitzat BLE amb Raspberry Pi i BLE amb ESP32 per realitzar algunes funcions bàsiques de BLE. Els enginyers estan experimentant amb BLE per dissenyar dispositius sense fils portàtils que puguin funcionar durant molt de temps amb bateries petites i hi ha diversos kits de desenvolupament disponibles per treballar amb BLE. En la nostra revisió recent sobre Arduino Nano 33, també vam observar que la placa tenia nRF52840 amb funcions BLE.
En aquest tutorial, explorarem un altre popular i interessant tauler de desenvolupament anomenat nRF52 DK per mesurar la temperatura i la humitat mitjançant BLE. Per defecte, BLE Environment Sensing Profiles admet una àmplia gamma de paràmetres ambientals, però aquest tutorial només es limita als valors de temperatura i humitat. Aquesta solució es connecta amb un telèfon intel·ligent mitjançant Bluetooth de baixa energia i proporciona una actualització freqüent dels paràmetres ambientals, és a dir, temperatura, humitat. Utilitzarem el sensor DHT1 i la mesura de la temperatura es farà amb una resolució de 0,01 graus centígrads i la mesura de la humitat es farà amb una resolució del 0,01 per cent.
Kit de desenvolupament nRF52:
nRF52DK és una completa plataforma de prototipat per a l’aplicació Internet sense fils Bluetooth de baix consum i 2,4 GHz. El kit de desenvolupament admet diverses cadenes d’eines nòrdiques estàndard, com ara codi obert, GCC i entorns de desenvolupament integrats comercials com Keil, IAR i Segger Embedded Studio, etc.

nRF52DK s’alimenta amb el microcontrolador ARM Cortex-M4F nRF52832, que està integrat a 512 Kbytes de memòria Flash i 64 Kbytes de SRAM. nRF52DK té un depurador integrat Segger J-Link On Board, que proporciona una depuració més fàcil i ràpida sense dispositius de depuració jtag externs / addicionals. També inclou el connector compatible Arduino Uno Rev3, que admet la interfície d’entrades analògiques i digitals amb el microprocessador i també inclou protocols de comunicació estàndard com, I2C (Circuit inter-integrat), SPI (Interfície perifèrica en sèrie) i UART (receptor i transmissor asíncron universals). Aquest kit de desenvolupament està dissenyat amb una antena integrada de PCB integrada que proporciona comunicació sense fils de curt abast mitjançant Bluetooth Low Energy per connectar-se amb telèfons intel·ligents, portàtils i tauletes.
Segger Embedded Studio
Per programar la placa de desenvolupament, utilitzarem el Segger Embedded Studio amb nRF52. Segger Embedded Studio és un potent entorn de desenvolupament integrat (IDE) C / C ++ dirigit específicament al desenvolupament de sistemes incrustats. Això proporciona una solució completa tot en un que conté tot el necessari per a la programació, desenvolupament i depuració de C incrustats. Això inclou un flux de treball complet per a la programació i desenvolupament de sistemes incrustats, inclòs amb la gestió de projectes, l'editor i el depurador que admeten dispositius ARM Cortex. Aquest IDE potent i fàcil d'utilitzar és completament gratuït per a clients nòrdics amb llicència completa sense restriccions de mida de codi. L'IDE es pot descarregar des de l'enllaç que es mostra a continuació,
Descarregueu Segger Embedded Studio
DHT11 amb nRF52DK
DHT11 és un sensor de temperatura i humitat amb totes les funcions amb un component de mesura d’humitat de tipus resistiu i un component de mesura de temperatura de tipus NTC. Ofereix una qualitat excel·lent, resposta més ràpida i rendibilitat. Per defecte, tots els sensors DHT11 es calibren al laboratori, cosa que comporta una precisió i fiabilitat extremes. Es comunica mitjançant un sistema d'interfície sèrie d'un cable i es detallen a continuació altres especificacions

Especificacions de DHT11:
- Rang d'humitat: 20 - 90% HR
- Rang de temperatura: 0 - 50 graus centígrads
- Precisió de la humitat: ± 5 % HR
- Precisió de temperatura: ± 2 ℃
Diagrama de temps de DHT11:

Llegir les dades del sensor DHT11 és relativament senzill utilitzant el diagrama de temps que es mostra més amunt. El procediment és similar a qualsevol controlador i ja hem utilitzat aquest sensor amb altres plataformes de desenvolupament com
- Sensor DHT11 amb Raspberry Pi
- Sensor DHT11 amb PIC16F877A
- Sensor DHT11 amb STM32F103C8
- Sensor DHT11 amb NodeMCU
Per connectar el sensor de temperatura i humitat DHT11 amb el kit de desenvolupament nRF52, seguiu el diagrama de connexió que es mostra a continuació.

Estic fent servir un mòdul de connector per connectar el sensor a la meva placa, de manera que la configuració final té aquest aspecte

Diagrama de flux per comunicar-se amb DHT11:
El següent diagrama de flux explica el flux lògic del programa que utilitzarem per comunicar-nos entre nRF52DK i DHT11

Format de dades:

Com es pot treballar amb Bluetooth Low Energy (BLE)?
Per entendre com utilitzar la funció BLE, hem d’entendre algunes terminologies bàsiques que s’expliquen a continuació. També podeu llegir l’article ESP32 BLE per obtenir més informació sobre BLE.
Perfil d'accés genèric (GAP)
El perfil d’accés genèric té la responsabilitat total d’establir la connexió per a la comunicació entre els perifèrics BLE i els dispositius centrals. GAP també proporciona diversos procediments, inclosos l'escaneig / descobriment de dispositius, l'establiment de connexions de capa d'enllaç, la terminació d'enllaços, l'aplicació de mans de les funcions de seguretat i la configuració completa del dispositiu. GAP funciona en els estats de dispositiu següents
|
Estats GAP |
Descripció |
|
En espera |
Estat inicial del dispositiu en restablir-se |
|
Anunciant |
Publicitat de dispositius amb dades que ajuden a escanejar l'iniciador |
|
Escàner |
Rep la sol·licitud d’anàlisi i l’envia a l’anunciant |
|
Iniciador |
Envia una sol·licitud de connexió per establir un enllaç |
|
Esclau / Mestre |
En connexió, el dispositiu com a esclau si és anunciant, el mestre si és iniciador |
Capa de perfil d'atribut genèric (GATT)
GATT és l'abreviació de Generic Attribute Profile Layer, és responsable de la comunicació de dades entre dos dispositius BLE (perifèric i central). La comunicació de dades es caracteritza en forma de característiques, que comuniquen i emmagatzemen les dades. El dispositiu BLE té dos rols diferents per a la comunicació del dispositiu que es mostra a continuació,
- El servidor GATT conté la informació de característiques que s’utilitzarà per llegir i escriure. Al nostre tutorial, el sensor DHT11 i el programari. el kit és el nostre servidor GATT.
- El client GATT llegeix i escriu les dades des del / al servidor GATT. El telèfon intel·ligent és un client GATT que llegeix i escriu les dades a la nostra placa de sensors.
Bluetooth SIG
Bluetooth Special Interest Group (SIG) és l'organització estàndard que controla el desenvolupament d'estàndards Bluetooth i la concessió de llicències per a les tecnologies Bluetooth. El grup SIG no produeix ni ven cap producte Bluetooth. Defineix l'especificació i l'estandardització de Bluetooth. Defineixen l’ identificador únic per al perfil de baixa energia de Bluetooth i les característiques respectives. Les especificacions del perfil GATT es poden trobar a l’enllaç següent
Especificacions del perfil GATT
Basat en l’especificació del GATT que es proporciona a l’enllaç anterior, hem recopilat els identificadors únics necessaris per al nostre projecte, que es mostra a continuació.
|
Perfil / Característiques |
UUID |
|
GAP (accés genèric) |
0x1800 |
|
GATT (atribut genèric) |
0x1801 |
|
ESS (Environment Sensing) |
0x181A |
|
Temperatura |
0x2A6E |
|
Humitat |
0x2A6F |
Servei BLE / Esquema de característiques

UUID BLE
|
UUID |
Valor de 16 bits |
UUID de 128 bits |
|
Servei ESS |
0x181A |
0000181A-0000-0000-0000-00000000000 |
|
Caràcter temporal |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
|
Humitat Char |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Característiques de la temperatura
|
Propietat |
Descripció |
|
Unitat |
Grau centígrad amb una resolució de 0,01 graus |
|
Format |
sint16 |
|
UUID |
0x2A6E |
|
Exponent decimal |
2 |
|
Llegiu |
Obligatori |
Característiques de la humitat
|
Propietat |
Descripció |
|
Unitat |
Percentatge amb una resolució del 0,01 per cent |
|
Format |
uint16 |
|
UUID |
0x2A6F |
|
Exponent decimal |
2 |
|
Llegiu |
Obligatori |
Explicació del programa nRF52 BLE
Utilitzarem l’ SDK nRF5 per programar el nostre kit de desenvolupament nRF52. nRF5 SDK és un complet kit de desenvolupament de programari integrat amb nombrosos perfils Bluetooth Low Energy, serialitzador GATT i compatibilitat amb controladors per a tots els perifèrics dels SoC de la sèrie nRF5. Aquest SDK ajuda els desenvolupadors a crear aplicacions Bluetooth de baix consum amb totes les funcions, fiables i segures amb la sèrie de microcontroladors nRF52 i nRF51. El programa complet es pot descarregar des d’aquí; l’explicació del codi és la següent.
Configureu el pin de dades DHT11 com a entrada a nrf52 amb activació de pull up. L'estat del pin ha de ser alt per confirmar que nRF52 proporciona PULLUP adequat per al pin de dades DHT11
/ * Estableix com a entrada i comprova si el senyal es dispara * / Data_SetInput (); DelayUSec (50); if (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
Genereu senyal d’INICI des del microcontrolador nRF52 i comproveu si hi ha senyal de confirmació.
/ * enviar senyal d'inici * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * mantingueu el senyal baix durant almenys 18 ms * / Data_SetInput (); DelayUSec (50); / * comproveu si hi ha senyal de confirmació * / si (Data_GetVal ()! = 0) {/ * el sensor ha de baixar el sensor * / retorna DHT11_NO_ACK_0; } / * espereu un màxim de 100 us per obtenir el senyal ACK del sensor * / cntr = 18; while (Data_GetVal () == 0) {/ * espereu fins que el senyal pugi * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_1; / * el senyal hauria d'estar activat per a l'ACK aquí * /}} / * espereu fins que baixi de nou, final de la seqüència d'ACK * / cntr = 18; while (Data_GetVal ()! = 0) {/ * espereu fins que el senyal caigui * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_0; / * el senyal hauria de tornar a estar a zero aquí * /}}
Ara llegiu els 40 bits de dades que contenen 2 bytes de temperatura, 2 bytes d’humitat i 1 byte d’una suma de control.
/ * ara llegeix les dades de 40 bits * / i = 0; dades = 0; loopBits = 40; fer {cntr = 11; / * wait max 55 us * / while (Data_GetVal () == 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_0; }} cntr = 15; / * wait max 75 us * / while (Data_GetVal ()! = 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_1; }} dades << = 1; / * bit de dades següent * / if (cntr <10) {/ * senyal de dades alt> 30 us ==> bit de dades 1 * / data - = 1; } if ((loopBits & 0x7) == 1) {/ * next byte * / buffer = data; i ++; dades = 0; }} while (- loopBits! = 0);
Valideu les dades amb l'ajut de Checksum.
/ * test CRC * / if ((uint8_t) (buffer + buffer + buffer + buffer)! = buffer) {return DHT11_BAD_CRC; }
Manipular i emmagatzemar la temperatura i la humitat
/ * emmagatzema valors de dades per a la persona que truca * / humitat = ((int) buffer) * 100 + buffer; temperature = ((int) buffer) * 100 + buffer;
Inicialitzeu el servei de registre SDK nRF5. nRF52 SDK es presenta amb una interfície de control de registre anomenada nrf_log i utilitza el dorsal per defecte per registrar la informació. El dorsal per defecte serà un port sèrie. Aquí inicialitzem tant nrf_log interfície de control i nrf_log backends per defecte també.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (error_codi); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK té la funcionalitat del temporitzador d'aplicacions. El mòdul de temporitzador d'aplicacions permet crear diverses instàncies de temporitzador basades en el perifèric RTC1. Aquí inicialitzem el mòdul de temporitzador d’aplicacions nRF5. En aquesta solució, s’utilitzen dos temporitzadors d’aplicacions i un interval d’actualització de dades.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (error_codi);
nRF52 SDK té el mòdul de gestió d'energia complet, ja que els dispositius BLE han de funcionar durant diversos mesos amb una bateria de cèl·lules de moneda. La gestió de l’energia té un paper vital en les aplicacions BLE. El mòdul de gestió d'energia nRF52 gestiona completament el mateix. Aquí inicialitzem el mòdul de gestió d'energia de l'SDK nRF5
ret_code_t error_codi; error_codi = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (error_codi);
nRF52 SDK té un fitxer hexadecimal de microprogramari de dispositiu suau nòrdic integrat, que inclou una pila perifèrica central Bluetooth de baixa energia. Aquesta pila de protocols altament qualificats inclou GATT, GAP, ATT, SM, L2CAP i Link Layer. Aquí seguim la seqüència d'inicialització, que va inicialitzar nRF5 BLE Radio Stack (Nordic Soft Device)
ret_code_t error_codi; error_codi = nrf_sdh_enable_request (); APP_ERROR_CHECK (error_codi); // Configureu la pila BLE mitjançant la configuració predeterminada. // Obteniu l'adreça inicial de la memòria RAM de l'aplicació. uint32_t ram_start = 0; error_codi = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (error_codi); // Activa la pila BLE. error_codi = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (error_codi); // Registre d'un controlador per a esdeveniments BLE. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP és responsable de l'escaneig / descobriment de dispositius, l'establiment d'enllaços, la finalització d'enllaços, l'inici de les funcions de seguretat i la configuració. GAP ha aparegut amb paràmetres de connexió clau com l'interval de connexió, la latència de l'esclau, el temps d'espera de supervisió, etc. Amb aquesta inicialització dels paràmetres de connexió del perfil d'accés genèric
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); error_codi = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (error_codi); memset (& gap_conn_params, 0, sizeof (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; error_codi = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (error_codi);
GATT és responsable de la comunicació de dades entre els perifèrics BLE i els dispositius centrals. El mòdul GATT nRF52 és útil per negociar i fer un seguiment de la mida màxima ATT_MTU. Aquí inicialitzem el mòdul d’atribut genèric SDK nRF52, ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (error_codi);
GATT realitza comunicacions de dades en forma de serveis i característiques. Aquí inicialitzem els serveis de detecció de l’entorn GATT, que inclouen la inicialització de característiques com la temperatura i la humitat.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Inicialitzar el mòdul d’escriptura en cua. qwr_init.error_handler = nrf_qwr_error_handler; error_codi = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (error_codi); m_ess.notif_write_handler = ble_ess_notif_write_handler; error_codi = ble_ess_init (& m_ess); APP_ERROR_CHECK (error_codi);
La publicitat té un paper vital a l’entorn de l’aplicació BLE. els paquets inclouen la informació del tipus d’adreça, el tipus de publicitat, les dades publicitàries, les dades específiques del fabricant del dispositiu i les dades de resposta d’escaneig. nRF52 SDK inclòs amb un mòdul publicitari. Aquí fem la inicialització del mòdul publicitari amb els paràmetres.
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // Creeu i configureu dades publicitàries. memset (& advdata, 0, sizeof (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = cert; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; memset (& srdata, 0, sizeof (srdata)); srdata.uuids_complete.uuid_cnt = sizeof (adv_uuids) / sizeof (adv_uuids); srdata.uuids_complete.p_uuids = adv_uuids; error_codi = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (error_codi); error_codi = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (error_codi); ble_gap_adv_params_t adv_params; // Estableix paràmetres publicitaris. memset (& adv_params, 0, sizeof (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 = NUL; adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.interval = APP_ADV_INTERVAL; error_codi = sd_ble_gap_adv_set_configure (& m_adv_handle, & m_adv_data, & adv_params); APP_ERROR_CHECK (error_codi);
La connexió BLE es gestionarà i es controlarà amb diversos paràmetres de connexió, com ara el primer retard d’actualització de paràmetres de connexió, els següents retards consecutius, el recompte d’actualitzacions, la funció de devolució de trucades del gestor d’esdeveniments de connexió i el gestor d’esdeveniments de devolució de trucades d’error de connexió. Aquí fem la inicialització dels paràmetres d’establiment de la connexió BLE i un gestor d’esdeveniments de devolució de trucada per a esdeveniments de connexió i esdeveniments d’error.
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, sizeof (cp_init)); cp_init.p_conn_params = NUL; 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 = fals; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; error_codi = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (error_codi);
Després de completar la inicialització del sistema, aquí comencem amb la publicitat del nom del dispositiu BLE i de la informació de capacitat. A partir d’aquí, aquest perifèric es pot veure a la llista d’escaneig Ble del telèfon intel·ligent.
ret_code_terr_code; error_codi = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (error_codi);
El bucle principal s’executa durant l’interval de 2 segons, llegeix la temperatura i la humitat i s’actualitza a un dispositiu intel·ligent connectat mitjançant lectura o notificació
per (;;) { uint16_t temperatura, humitat; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); if (updtmrexp) { dhtErrCode = DHTxx_Read (& temperatura i humitat); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Temperatura:% d Humitat:% d \ n", temperatura, humitat); if (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, temperatura); } else { ble_ess_update_temp (& m_ess, temperatura); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, humitat); } else { ble_ess_update_humid (& m_ess, humitat); } } updtmrexp = false; } }
Provant el nostre programa mitjançant nRF Connect
nRF Connect és una potent eina Bluetooth de baix consum que permet escanejar i explorar els perifèrics habilitats per BLE. nRF Connect per a mòbils admet una àmplia gamma de perfils estàndard adoptats per Bluetooth SIG. Podem verificar el nostre programa mitjançant aquest ús; després d’instal·lar l’aplicació, podem emparellar la placa nRF52 amb el nostre telèfon cercant dispositius BLE a l’aplicació. Dins de l’atribut de detecció ambiental, podem observar que els valors de temperatura i humitat s’actualitzen tal com es mostra a les imatges següents.
Hariharan Veerappan és un consultor independent amb més de 15 anys d’experiència en el desenvolupament de productes incrustats. Proporciona serveis de consultoria en el desenvolupament de firmware / Linux incrustat, també ofereix formació corporativa i en línia. Hariharan és llicenciat en Enginyeria en la disciplina d'Enginyeria Electrònica i de Comunicacions, a través dels seus articles i tutorials, comparteix la seva experiència i pensaments amb els lectors de Circuit Digest.
