- nRF52 Udviklingssæt:
- Segger Embedded Studio
- DHT11 med nRF52DK
- Hvordan arbejder jeg med Bluetooth Low Energy (BLE)?
- BLE Service / Karakteristik Diagram
- nRF52 BLE Programforklaring
- Test af vores program ved hjælp af nRF Connect
Med fitnessbånd, smartwatches og andre bærbare enheder bliver stadig mere populære ved brug af Bluetooth 5 / Bluetooth Low Energykommunikationsstandarder vedtages bredt. BLE hjælper os med at udveksle data over en kort afstand med meget lidt strøm, hvilket er meget vigtigt for batteridrevne enheder som wearables. Det hjælper os også med at oprette trådløse BLE-netværk, denne funktion er praktisk til hjemmeautomationsenheder, hvor flere enheder skal kommunikere med hinanden i et lukket miljø. Vi har allerede brugt BLE med Raspberry Pi og BLE med ESP32 til at udføre nogle grundlæggende BLE-funktioner. Ingeniører eksperimenterer med BLE for at designe bærbare trådløse enheder, der kan køre i lang tid på små batterier, og der er flere udviklingssæt til rådighed til at arbejde med BLE. I vores nylige gennemgang af Arduino Nano 33 bemærkede vi også, at tavlen har nRF52840 med BLE-funktioner.
I denne vejledning vil vi udforske et andet spændende og populært udviklingskort kaldet nRF52 DK til måling af temperatur og fugtighed ved hjælp af BLE. Som standard understøtter BLE Environment Sensing Profiles en lang række miljøparametre, men denne tutorial er kun begrænset til temperatur- og fugtighedsværdier. Denne løsning forbinder med en Smartphone via Bluetooth med lav energi og giver en hyppig opdatering af miljøparametrene, dvs. temperatur, fugtighed. Vi bruger DHT1-sensoren, og temperaturmålingen foretages med en opløsning på 0,01 grader Celsius, og luftfugtighedsmåling foretages med en opløsning på 0,01 procent.
nRF52 Udviklingssæt:
nRF52DK er en komplet prototypeplatform til Bluetooth Low Energy og 2,4 GHz Wireless Internet of Things-applikation. Udviklingssættet understøtter forskellige standard nordiske værktøjskæder som open source, GCC og kommercielt integrerede udviklingsmiljøer som Keil, IAR og Segger Embedded Studio osv. Nordic leverer også et fuldt udviklet softwareudviklingssæt til nRF52, der inkluderer komplet support til nRF52DK.
nRF52DK drives af nRF52832 ARM Cortex-M4F Microcontroller, som er integreret 512 kbyte Flash Memor og 64 kbyte SRAM. nRF52DK har en integreret Segger J-Link On Board debugger, der giver en lettere og hurtigere debugging uden en ekstern / ekstra jtag debug-enheder. Det inkluderer også Arduino Uno Rev3-kompatibelt stik, som understøtter grænseflade mellem de analoge og digitale indgange med mikroprocessoren, og den inkluderer også standardkommunikationsprotokoller som I2C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface) og UART (Universal Asynchronous Receiver and Transmitter). Dette udviklingssæt er designet med en integreret indbygget PCB-antenne, der giver trådløs kommunikation med kort rækkevidde ved hjælp af Bluetooth Low Energy til tilslutning til smartphones, bærbare computere og tablets.
Segger Embedded Studio
For at programmere udviklingskortet bruger vi Segger Embedded Studio med nRF52. Segger Embedded Studio er et kraftfuldt C / C ++ integreret udviklingsmiljø (IDE) målrettet specifikt til integreret systemudvikling. Dette giver en komplet alt-i-en-løsning, der indeholder alt, hvad der er nødvendigt til indlejret C-programmering, udvikling og fejlretning. Dette inkluderer komplet workflow til indbygget systemprogrammering og -udvikling med projektledelse, editor, debugger, der understøtter ARM Cortex-enheder. Denne kraftfulde og brugervenlige IDE er helt gratis for nordiske kunder med fuld licens uden nogen kodestørrelsesbegrænsninger. IDE kan downloades fra nedenstående link,
Download Segger Embedded Studio
DHT11 med nRF52DK
DHT11 er en fuldt udstyret temperatur- og fugtighedsføler med en resistent type luftfugtighedsmålekomponent og en NTC-type temperaturmålekomponent. Det giver fremragende kvalitet, hurtigere respons og omkostningseffektivitet. Som standard er alle DHT11-sensorer kalibreret i laboratoriet, hvilket fører til ekstrem nøjagtighed og pålidelighed. Den kommunikerer ved hjælp af Single-Wire Serial Interface-system, og andre specifikationer er angivet nedenfor
Specifikationer for DHT11:
- Fugtighedsområde: 20 - 90% RF
- Temperaturområde: 0 - 50 grader celsius
- Fugtighedsnøjagtighed: ± 5 % RH
- Temperaturnøjagtighed: ± 2 ℃
Tidsplan for DHT11:
Læsning af data fra DHT11-sensoren er relativt enkel ved hjælp af tidsdiagrammet vist ovenfor. Proceduren ligner enhver controller, og vi har allerede brugt denne sensor med andre udviklingsplatforme som f.eks
- DHT11-sensor med Raspberry Pi
- DHT11-sensor med PIC16F877A
- DHT11-sensor med STM32F103C8
- DHT11-sensor med NodeMCU
Følg forbindelsesdiagrammet nedenfor for at interface DHT11 temperatur- og fugtighedssensoren med nRF52 Development Kit.
Jeg bruger et stikmodul til at forbinde sensoren til mit kort, så min endelige opsætning ser sådan ud
Flowdiagram til kommunikation med DHT11:
Nedenstående flowdiagram forklarer det programlogiske flow, som vi bruger til at kommunikere mellem nRF52DK og DHT11
Dataformat:
Hvordan arbejder jeg med Bluetooth Low Energy (BLE)?
For at forstå, hvordan man bruger BLE-funktionen, er vi nødt til at forstå et par grundlæggende terminologier, der er forklaret nedenfor. Du kan også læse ESP32 BLE-artiklen for at vide mere om BLE
Generisk adgangsprofil (GAP)
Generic Access Profile har det fulde ansvar for at etablere forbindelsen til kommunikation mellem BLE perifere og centrale enheder. GAP leverer også forskellige procedurer, herunder enhedsscanning / -opdagelse, oprettelse af forbindelseslagsforbindelse, linkafslutning, håndtryk af sikkerhedsfunktioner og fuldt udstyret konfiguration af enheden. GAP fungerer i følgende enhedstilstande
GAP-stater |
Beskrivelse |
Stå ved |
Enhedens oprindelige tilstand ved nulstilling |
Annoncør |
Enhedsreklame med data, der hjælper med initiatorscanning |
Scanner |
Modtager og sender scanningsanmodning til annoncøren |
Initiativtager |
Sender en forbindelsesanmodning for at oprette et link |
Slave / mester |
Ved forbindelse, enhed som en slave hvis annoncør, master hvis en initiator |
Generisk attributprofillag (GATT)
GATT står for Generic Attribute Profile Layer, det er ansvarlig for datakommunikation mellem to BLE-enheder (Peripheral & Central). Datakommunikation er karakteriseret i form af karakteristika, som kommunikerer og lagrer dataene. BLE-enhed spiller to forskellige roller for enhedskommunikation angivet nedenfor,
- GATT Server indeholder de karakteristiske oplysninger, der vil blive brugt til at læse og skrive. I vores vejledning er DHT11-sensoren og dev. sættet er vores GATT-server.
- GATT-klienten læser og skriver dataene fra / til GATT-serveren. Smartphonen er en GATT-klient, der læser og skriver dataene ind på vores sensorkort.
Bluetooth SIG
Bluetooth Special Interest Group (SIG) er standardorganisationen, der overvåger udviklingen af Bluetooth-standarder og licensering af Bluetooth-teknologier. SIG-gruppen producerer eller sælger ikke Bluetooth-produkter. Den definerer Bluetooth-specifikationen og standardiseringen. De definerer den unikke identifikator til Bluetooth-lavenergiprofil og respektive karakteristika. GATT-profilspecifikationerne kan findes på nedenstående link
GATT-profilspecifikationer
Baseret på GATT-specifikation angivet i ovenstående link har vi samlet de unikke identifikatorer, der kræves til vores projekt, som er angivet nedenfor.
Profil / egenskaber |
UUID |
GAP (generisk adgang) |
0x1800 |
GATT (generisk attribut) |
0x1801 |
ESS (miljøfølsomhed) |
0x181A |
Temperatur |
0x2A6E |
Fugtighed |
0x2A6F |
BLE Service / Karakteristik Diagram
BLE UUID'er
UUID |
16 bit værdi |
128 bit UUID |
ESS-service |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Temp Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Fugtighed Char |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Temperaturegenskaber
Ejendom |
Beskrivelse |
Enhed |
Grad Celsius med en opløsning på 0,01 grad |
Format |
sint16 |
UUID |
0x2A6E |
Decimaleksponent |
2 |
Læs |
Obligatorisk |
Fugtighedsegenskaber
Ejendom |
Beskrivelse |
Enhed |
Procentdel med en opløsning på 0,01 procent |
Format |
uint16 |
UUID |
0x2A6F |
Decimaleksponent |
2 |
Læs |
Obligatorisk |
nRF52 BLE Programforklaring
Vi bruger nRF5 SDK til at programmere vores nRF52 Development kit. nRF5 SDK er et komplet softwareudviklingssæt integreret med adskillige Bluetooth Low Energy-profiler, GATT Serializer og driverunderstøttelse til alle perifere enheder på SoR'er i nRF5-serien. Denne SDK hjælper udviklere med at opbygge komplette, pålidelige og sikre Bluetooth-lavenergiapplikationer med nRF52- og nRF51-serien af mikrocontrollere. Det komplette program kan downloades herfra, kodeforklaringen er som følger.
Konfigurer DHT11 DATA-pin som input ved nrf52 med pull up-aktivering. Pin-status skal være høj for at bekræfte, at nRF52 giver korrekt PULLUP til DHT11-datapinnen
/ * indstillet til input og kontroller, om signalet bliver trukket op * / Data_SetInput (); DelayUSec (50); hvis (Data_GetVal () == 0) {returnerer DHT11_NO_PULLUP; }
Generer START-signal fra nRF52 Microcontroller, og kontroller for bekræftelsessignal.
/ * send startsignal * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * hold signal lavt i mindst 18 ms * / Data_SetInput (); DelayUSec (50); / * tjek for kvitteringssignal * / hvis (Data_GetVal ()! = 0) {/ * signal skal trækkes lavt af sensoren * / return DHT11_NO_ACK_0; } / * vent maks. 100 os på ACK-signalet fra sensoren * / cntr = 18; mens (Data_GetVal () == 0) {/ * vent indtil signalet går op * / DelayUSec (5); hvis (--cntr == 0) {returner DHT11_NO_ACK_1; / * signalet skal være op for ACK her * /}} / * vent indtil det går ned igen, slutningen af ack sekvens * / cntr = 18; mens (Data_GetVal ()! = 0) {/ * vent indtil signalet går ned * / DelayUSec (5); hvis (--cntr == 0) {returner DHT11_NO_ACK_0; / * signalet skal være nede på nul igen her * /}}
Læs nu de 40 bits data, der indeholder 2 bytes temperatur, 2 bytes fugtighed og 1 byte i et kontrolsum.
/ * læs nu 40 bit data * / i = 0; data = 0; loopBits = 40; gør {cntr = 11; / * vent maks. 55 os * / mens (Data_GetVal () == 0) {DelayUSec (5); hvis (--cntr == 0) {returnerer DHT11_NO_DATA_0; }} cntr = 15; / * vent maks. 75 os * / mens (Data_GetVal ()! = 0) {DelayUSec (5); hvis (--cntr == 0) {returner DHT11_NO_DATA_1; }} data << = 1; / * næste databit * / if (cntr <10) {/ * datasignal høj> 30 us ==> databit 1 * / data - = 1; } hvis ((loopBits & 0x7) == 1) {/ * næste byte * / buffer = data; i ++; data = 0; }} mens (- loopBits! = 0);
Valider dataene ved hjælp af Checksum.
/ * test CRC * / hvis ((uint8_t) (buffer + buffer + buffer + buffer)! = buffer) {returner DHT11_BAD_CRC; }
Manipuler og opbevar temperatur og fugtighed
/ * gem dataværdier for opkald * / fugtighed = ((int) buffer) * 100 + buffer; temperatur = ((int) buffer) * 100 + buffer;
Initialiser nRF5 SDK Logger-tjenesten. nRF52 SDK er udstyret med en logningskontrolgrænseflade kaldet nrf_log og bruger standard backend til at logge informationen. Standardbackend er en seriel port. Her initialiserer vi både nrf_log- kontrolgrænsefladen og nrf_log- standardbackend.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (err_code); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK har applikationstimefunktionalitet. Applikationstimermodulet gør det muligt at oprette flere timerforekomster baseret på RTC1 perifer. Her initialiserer vi nRF5-applikationstimermodulet. I denne løsning anvendes to applikationstimere til og dataopdateringsinterval.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK har det fulde funktionsstyringsmodul , da BLE-enheder skal arbejde i flere måneder på et møntcellebatteri. Strømstyring spiller en vigtig rolle i BLE-applikationer. nRF52 strømstyringsmodul håndterer helt det samme. Her initialiserer vi strømstyringsmodulet til nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK har en indbygget Nordic Soft Device-firmware-hex-fil, som har Bluetooth-lavenergicentral og perifer stak. Denne højt kvalificerede protokolstak inkluderer GATT, GAP, ATT, SM, L2CAP og Link Layer. Her følger vi initialiseringssekvensen, den initialiserede nRF5 BLE Radio Stack (Nordic Soft Device)
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (err_code); // Konfigurer BLE-stakken ved hjælp af standardindstillingerne. // Hent startadressen til applikations-RAM. 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); // Aktivér BLE-stak. err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (err_code); // Registrer en handler til BLE-begivenheder. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP er ansvarlig for enhedsscanning / opdagelse, oprettelse af link, linkafslutning, initiering af sikkerhedsfunktioner og konfiguration. GAP har vist sig med nøgleforbindelsesparametre som forbindelsesinterval, slaveforsinkelse, overvågningstimeout osv. Herved initialiseres forbindelsesparametrene for Generic Access Profile
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 (& sek_tilstand); err_code = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (err_code); 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; err_code = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (err_code);
GATT er ansvarlig for datakommunikation mellem BLE perifere og centrale enheder. nRF52 GATT-modul er nyttigt til forhandling og styring af den maksimale ATT_MTU-størrelse. Her initialiserer vi nRF52 SDK Generic Attribute Module, ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (err_code);
GATT udfører datakommunikation i form af tjenester og egenskaber. Her initialiserer vi GATT-miljøsensortjenesterne, som inkluderer initialisering af egenskaber som temperatur og fugtighed.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Initialiser kømodul til kø. 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);
Annoncering spiller en vigtig rolle i BLE-applikationsmiljøet. pakker inkluderer oplysninger om adressetype, reklametype, reklamedata, enhedsproducent-specifikke data og scanningsdata. nRF52 SDK udstyret med et reklamemodul. Her initialiserer vi reklamemodulet med parametrene.
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // Byg og indstil reklamedata. memset (& advdata, 0, sizeof (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = sand; 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; 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; // Indstil reklameparametre. 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 = 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);
BLE-forbindelse håndteres og overvåges med forskellige forbindelsesparametre som forsinkelse af opdatering af forbindelsesparametre, næste forsinkelser i træk, antal opdateringer, forbindelsesbegivenhedshåndterings tilbagekaldsfunktion og forbindelsesfejl tilbagekaldshændelseshåndterer. Her foretager vi initialisering af BLE-forbindelsesetableringsparametre og en tilbagekaldshændelseshåndtering til forbindelseshændelser og fejlhændelser.
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, sizeof (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 = NÆSTE_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 = falsk; 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);
Efter afslutningen af initialiseringen af systemet starter vi her med at annoncere BLE-enhedsnavnet og kapacitetsoplysninger. Herfra kan denne perifere enhed ses over Smart Ble-listen.
ret_code_terr_code; err_code = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (err_code);
Hovedsløjfen løber over intervallet på 2 sekunder, læser temperatur og fugtighed og opdaterer til en tilsluttet smart enhed ved hjælp af enten læsning eller underretning
for (;;) { uint16_t temperatur, fugtighed; DHTxx_ErrorCode dhtErrCode; tomgangsstat_håndtag (); hvis (updtmrexp) { dhtErrCode = DHTxx_Read (& temperatur, & fugtighed); hvis (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Temperatur:% d Fugtighed:% d \ n", temperatur, fugtighed); hvis (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, temperature); } andet { ble_ess_update_temp (& m_ess, temperatur); } hvis (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, fuktighed); } andet { ble_ess_update_humid (& m_ess, fugtighed); } } updtmrexp = falsk; } }
Test af vores program ved hjælp af nRF Connect
nRF Connect er et kraftfuldt Bluetooth-lavenergiverktøj, der giver mulighed for at scanne og udforske de BLE-aktiverede perifere enheder. nRF Connect til mobil understøtter en lang række Bluetooth SIG-godkendte standardprofiler. Vi kan verificere vores program ved hjælp af dette. Efter installation af appen kan vi parre nRF52-kortet med vores telefon ved at scanne efter BLE-enheder i appen. Inde i attributten Miljøføling kan vi bemærke, at temperatur- og fugtighedsværdierne opdateres som vist på nedenstående billeder.
Hariharan Veerappan er en uafhængig konsulent med mere end 15 års erfaring inden for integreret produktudvikling. Han leverer konsulenttjenester inden for integreret firmware / Linux-udvikling, han giver også virksomheds- og online-træning. Hariharan har en bachelor i ingeniøruddannelse inden for fagområdet elektronik og kommunikationsteknologi, gennem sine artikler og vejledninger deler han sine erfaringer og tanker med læserne af Circuit Digest.