- nRF52 utviklingssett:
- Segger Embedded Studio
- DHT11 med nRF52DK
- Hvordan arbeide med Bluetooth Low Energy (BLE)?
- BLE Service / egenskaper Diagram
- nRF52 BLE Programforklaring
- Testing av programmet vårt ved hjelp av nRF Connect
Med treningsbånd, smartklokker og andre bærbare enheter blir det stadig mer populært å bruke Bluetooth 5 / Bluetooth Low Energykommunikasjonsstandarder blir mye vedtatt. BLE hjelper oss med å utveksle data over kort avstand med veldig lite strøm, noe som er veldig viktig for batteridrevne enheter som bærbare enheter. Det hjelper oss også med å sette opp trådløse BLE-nettverk, denne funksjonen er nyttig for hjemmeautomatiseringsenheter der flere enheter må kommunisere med hverandre i et lukket miljø. Vi har allerede brukt BLE med Raspberry Pi og BLE med ESP32 for å utføre noen grunnleggende BLE-funksjoner. Ingeniører eksperimenterer med BLE for å designe bærbare trådløse enheter som kan kjøre lenge på små batterier, og det er flere utviklingssett tilgjengelig for å jobbe med BLE. I vår siste gjennomgang på Arduino Nano 33 la vi også merke til at styret har nRF52840 med BLE-funksjoner.
I denne opplæringen vil vi utforske et annet spennende og populært utviklingskort kalt nRF52 DK for å måle temperatur og fuktighet ved hjelp av BLE. Som standard støtter BLE Environment Sensing Profiles et bredt spekter av miljøparametere, men denne opplæringen er bare begrenset til temperatur- og fuktighetsverdier. Denne løsningen kobles til en smarttelefon via Bluetooth med lav energi og gir en hyppig oppdatering av miljøparametrene, dvs. temperatur, fuktighet. Vi bruker DHT1-sensoren, og temperaturmålingen vil gjøres med en oppløsning på 0,01 grader Celsius, og fuktighetsmåling vil bli gjort med en oppløsning på 0,01 prosent.
nRF52 utviklingssett:
nRF52DK er en komplett prototypeplattform for Bluetooth Low Energy og 2,4 GHz Wireless Internet of Things-applikasjonen. Utviklingssettet støtter forskjellige standard nordiske verktøykjeder som åpen kildekode, GCC og kommersielle integrerte utviklingsmiljøer som Keil, IAR og Segger Embedded Studio, etc. Nordic tilbyr også et fullverdig programvareutviklingssett for nRF52, som inkluderer komplett støtte for nRF52DK.
nRF52DK drives av nRF52832 ARM Cortex-M4F Microcontroller, som er integrert 512 kbyte Flash Memor og 64 kbyte SRAM. nRF52DK har en integrert Segger J-Link On Board debugger, som gir en enklere og raskere feilsøking uten eksterne / ekstra jtag feilsøkingsenheter. Den inkluderer også den Arduino Uno Rev3-kompatible kontakten, som støtter grensesnitt mellom analoge og digitale innganger med mikroprosessoren, og den inkluderer også standard kommunikasjonsprotokoller som I2C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface) og UART (Universal Asynchronous Receiver and Transmitter). Dette utviklingssettet er designet med en integrert innebygd PCB-antenne som gir trådløs kommunikasjon med kort rekkevidde ved hjelp av Bluetooth Low Energy for tilkobling til smarttelefon, bærbare datamaskiner og nettbrett.
Segger Embedded Studio
For å programmere utviklingskortet vil vi bruke Segger Embedded Studio med nRF52. Segger Embedded Studio er et kraftig C / C ++ integrert utviklingsmiljø (IDE) målrettet spesielt for innebygd systemutvikling. Dette gir en komplett alt-i-ett-løsning som inneholder alt som trengs for innebygd C-programmering, utvikling og feilsøking. Dette inkluderer fullstendig arbeidsflyt for innebygd systemprogrammering og utvikling, utstyrt med prosjektledelse, redaktør, feilsøking som støtter ARM Cortex-enheter. Denne kraftige og brukervennlige IDE er helt gratis for nordiske kunder med full lisens uten kodestørrelsesbegrensninger. IDE kan lastes ned fra lenken nedenfor.
Last ned Segger Embedded Studio
DHT11 med nRF52DK
DHT11 er en fullverdig temperatur- og fuktighetssensor med en resistent type fuktighetskomponent og en NTC-temperaturkomponent. Det gir utmerket kvalitet, raskere respons og kostnadseffektivitet. Som standard er alle DHT11-sensorer kalibrert i laboratoriet, noe som fører til ekstrem nøyaktighet og pålitelighet. Den kommuniserer ved hjelp av Single-Wire Serial Interface system og andre spesifikasjoner er gitt nedenfor
Spesifikasjoner for DHT11:
- Fuktighetsområde: 20 - 90% RF
- Temperaturområde: 0 - 50 grader celsius
- Fuktighetsnøyaktighet: ± 5 % RH
- Temperaturnøyaktighet: ± 2 ℃
Tidsskjema for DHT11:
Det er relativt enkelt å lese dataene fra DHT11-sensoren ved hjelp av tidsskjemaet vist ovenfor. Prosedyren ligner på hvilken som helst kontroller, og vi har allerede brukt denne sensoren med andre utviklingsplattformer som
- DHT11-sensor med Raspberry Pi
- DHT11-sensor med PIC16F877A
- DHT11-sensor med STM32F103C8
- DHT11-sensor med NodeMCU
For å koble DHT11 temperatur- og fuktighetssensoren med nRF52 utviklingssett, følg koblingsskjemaet nedenfor.
Jeg bruker en kontaktmodul for å koble sensoren til kortet mitt, så den endelige konfigurasjonen min ser slik ut
Flytskjema for kommunikasjon med DHT11:
Flytskjemaet nedenfor forklarer programmets logiske flyt som vi skal bruke til å kommunisere mellom nRF52DK og DHT11
Dataformat:
Hvordan arbeide med Bluetooth Low Energy (BLE)?
For å forstå hvordan du bruker BLE-funksjonen, må vi forstå noen få grunnleggende terminologier som er forklart nedenfor. Du kan også lese ESP32 BLE-artikkelen for å vite mer om BLE
Generisk tilgangsprofil (GAP)
Generic Access Profile har det totale ansvaret for å opprette forbindelse for kommunikasjon mellom BLE perifere og sentrale enheter. GAP tilbyr også forskjellige prosedyrer, inkludert skanning / oppdagelse av enheter, tilkobling av koblingslag, koblingsterminering, håndtrykk av sikkerhetsfunksjoner og fullverdig enhetskonfigurasjon. GAP fungerer i følgende enhetstilstander
GAP-stater |
Beskrivelse |
Vent litt |
Enhetens opprinnelige tilstand ved tilbakestilling |
Annonsør |
Enhetsannonsering med data som hjelper til skanning av initiator |
Skanner |
Mottar og sender skanningsforespørsel til annonsøren |
Initiativtaker |
Sender en tilkoblingsforespørsel for å opprette en lenke |
Slave / Master |
Ved tilkobling, enhet som en slave hvis annonsør, master hvis en initiativtaker |
Generisk attributtprofillag (GATT)
GATT står for Generic Attribute Profile Layer, det er ansvarlig for datakommunikasjon mellom to BLE-enheter (Peripheral & Central). Datakommunikasjon er karakterisert i form av egenskaper, som kommuniserer og lagrer dataene. BLE-enheten spiller to forskjellige roller for enhetskommunikasjon gitt nedenfor,
- GATT Server inneholder informasjon om egenskaper som skal brukes til å lese og skrive. I vår opplæring, DHT11-sensoren og dev. settet er vår GATT-server.
- GATT Client leser og skriver dataene fra / til GATT Server. Smarttelefonen er en GATT-klient som leser og skriver dataene inn på sensorkortet vårt.
Bluetooth SIG
Bluetooth Special Interest Group (SIG) er standardorganisasjonen som overvåker utviklingen av Bluetooth-standarder og lisensiering av Bluetooth-teknologiene. SIG-gruppen produserer eller selger ikke Bluetooth-produkter. Den definerer Bluetooth-spesifikasjonen og standardiseringen. De definerer den unike identifikatoren for Bluetooth-lavenergiprofil og respektive egenskaper. GATT-profilens spesifikasjoner finner du på lenken nedenfor
GATT-profilspesifikasjoner
Basert på GATT-spesifikasjonen gitt i lenken ovenfor, har vi samlet de unike identifikatorene som kreves for prosjektet vårt, som er tabellert nedenfor.
Profil / egenskaper |
UUID |
GAP (generisk tilgang) |
0x1800 |
GATT (generisk attributt) |
0x1801 |
ESS (miljøsensing) |
0x181A |
Temperatur |
0x2A6E |
Luftfuktighet |
0x2A6F |
BLE Service / egenskaper Diagram
BLE UUIDer
UUID |
16 bit verdi |
128 bit UUID |
ESS-tjeneste |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Temp Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Fuktighet Char |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Temperaturegenskaper
Eiendom |
Beskrivelse |
Enhet |
Grad Celsius med en oppløsning på 0,01 grad |
Format |
sint16 |
UUID |
0x2A6E |
Desimaleksponent |
2 |
Lese |
Påbudt, bindende |
Fuktighetsegenskaper
Eiendom |
Beskrivelse |
Enhet |
Prosentandel med en oppløsning på 0,01 prosent |
Format |
uint16 |
UUID |
0x2A6F |
Desimaleksponent |
2 |
Lese |
Påbudt, bindende |
nRF52 BLE Programforklaring
Vi bruker nRF5 SDK for å programmere nRF52 Development kit. nRF5 SDK er et komplett programvareutviklingssett integrert med mange Bluetooth Low Energy-profiler, GATT Serializer og driverstøtte for alle eksterne enheter på SoRs i nRF5-serien. Denne SDK hjelper utviklere med å bygge komplette, pålitelige og sikre Bluetooth-lavenergiprogrammer med nRF52- og nRF51-serien med mikrokontrollere. Hele programmet kan lastes ned herfra, forklaringen på koden er som følger.
Konfigurer DHT11 DATA-pinnen som inngang på nrf52 med pull up-aktivering. Pin-status skal være høy for å bekrefte at nRF52 gir riktig PULLUP for DHT11-datapinnen
/ * satt til inngang og sjekk om signalet blir trukket opp * / Data_SetInput (); DelayUSec (50); hvis (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
Generer START-signal fra nRF52 Microcontroller og sjekk for bekreftelsessignal.
/ * send startsignal * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * hold signalet lavt i minst 18 ms * / Data_SetInput (); DelayUSec (50); / * sjekk for kvitteringssignal * / hvis (Data_GetVal ()! = 0) {/ * signalet må trekkes lavt av sensoren * / return DHT11_NO_ACK_0; } / * vent maks 100 us for ack signalet fra sensoren * / cntr = 18; mens (Data_GetVal () == 0) {/ * vent til signalet går opp * / DelayUSec (5); hvis (--cntr == 0) {return DHT11_NO_ACK_1; / * signalet skal være oppe for ACK her * /}} / * vent til det går ned igjen, slutten av ack-sekvensen * / cntr = 18; mens (Data_GetVal ()! = 0) {/ * vent til signalet går ned * / DelayUSec (5); hvis (--cntr == 0) {return DHT11_NO_ACK_0; / * signalet skal være nede på null igjen her * /}}
Les nå de 40 bitene med data som inneholder 2 byte temperatur, 2 byte fuktighet og 1 byte i en kontrollsum.
/ * les nå 40-biters data * / i = 0; data = 0; loopBits = 40; gjør {cntr = 11; / * vent maks 55 oss * / mens (Data_GetVal () == 0) {DelayUSec (5); hvis (--cntr == 0) {return DHT11_NO_DATA_0; }} cntr = 15; / * vent maks 75 oss * / mens (Data_GetVal ()! = 0) {DelayUSec (5); hvis (--cntr == 0) {return DHT11_NO_DATA_1; }} data << = 1; / * neste databit * / if (cntr <10) {/ * datasignal høyt> 30 us ==> databit 1 * / data - = 1; } hvis ((loopBits & 0x7) == 1) {/ * neste byte * / buffer = data; i ++; data = 0; }} mens (- loopBits! = 0);
Valider dataene ved hjelp av Checksum.
/ * test CRC * / if ((uint8_t) (buffer + buffer + buffer + buffer)! = buffer) {return DHT11_BAD_CRC; }
Manipuler og lagre temperatur og fuktighet
/ * lagre dataverdier for innringer * / fuktighet = ((int) buffer) * 100 + buffer; temperatur = ((int) buffer) * 100 + buffer;
Initier nRF5 SDK Logger-tjenesten. nRF52 SDK er utstyrt med et loggkontrollgrensesnitt kalt nrf_log og bruker standard backend for å logge informasjonen. Standard backend vil være en seriell port. Her initialiserer vi både nrf_log kontrollgrensesnitt og nrf_log standard backends også.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (err_code); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK har applikasjonstimerfunksjonalitet. Programtidsmodulen gjør det mulig å lage flere timerforekomster basert på RTC1-periferiutstyr. Her initialiserer vi nRF5-tidtakermodulen. I denne løsningen brukes to applikasjonstimere til og dataoppdateringsintervall.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK har den fullstendige strømstyringsmodulen siden BLE-enheter trenger å jobbe i flere måneder på et myntcellebatteri. Strømstyring spiller en viktig rolle i BLE-applikasjoner. nRF52 strømstyringsmodul håndterer helt det samme. Her initialiserer vi strømstyringsmodulen til nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK har en innebygd Nordic Soft Device-firmware-hex-fil, som har Bluetooth lavenergisentral og perifer bunke. Denne høyt kvalifiserte protokollstakken inkluderer GATT, GAP, ATT, SM, L2CAP og Link Layer. Her følger vi initialiseringssekvensen, den initialiserte 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 hjelp av standardinnstillingene. // Hent startadressen til applikasjons-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); // Aktiver BLE stack. err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (err_code); // Registrer en handler for BLE-hendelser. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP er ansvarlig for skanning / oppdagelse av enheter, etablering av koblinger, koblingsterminering, igangsetting av sikkerhetsfunksjoner og konfigurasjon. GAP har kjennetegnet viktige tilkoblingsparametere som tilkoblingsintervall, slaveforsinkelse, tidsavbrudd for tilsyn osv.
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 datakommunikasjon mellom BLE perifere og sentrale enheter. nRF52 GATT-modulen er nyttig for å forhandle og holde oversikt over maksimal 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 driver datakommunikasjon i form av tjenester og egenskaper. Her initialiserer vi GATT-miljøsensortjenestene, som inkluderer initialisering av egenskaper som temperatur og fuktighet.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Initialiser kømodul for 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);
Annonsering spiller en viktig rolle i BLE-applikasjonsmiljøet. pakker inkluderer informasjon om adressetype, reklametype, annonseringsdata, produsent-spesifikke data for enheten og skanneresponsdata. nRF52 SDK med en reklamemodul. Her initialiserer vi reklamemodulen 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}}; // Bygg og sett annonseringsdata. memset (& advdata, 0, sizeof (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, 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; // Sett reklameparametere. 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-tilkobling vil bli håndtert og overvåket med forskjellige tilkoblingsparametere, for eksempel oppdateringsforsinkelse for første tilkoblingsparameter, neste påfølgende forsinkelser, oppdateringstall, tilkoblingshendelsesbehandler tilbakeringingsfunksjon og tilkoblingsfeil tilbakeringing hendelsesbehandler. Her initialiserer vi BLE Connection etableringsparametere og en tilbakeringing hendelsesbehandler for tilkoblingshendelser og feilhendelser.
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 = NESTE_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 = false; 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);
Etter at initialiseringen av systemet er fullført, begynner vi her med å annonsere BLE-enhetsnavnet og funksjonsinformasjonen. Herfra kan denne perifere ses over Ble-listen over smarttelefoner.
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øyfen går over intervallet på 2 sekunder, les temperatur og fuktighet og oppdaterer til en tilkoblet smartenhet ved hjelp av lese eller varsling
for (;;) { uint16_t temperatur, fuktighet; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); hvis (updtmrexp) { dhtErrCode = DHTxx_Read (& temperatur, & fuktighet); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Temperatur:% d Fuktighet:% d \ n", temperatur, fuktighet); hvis (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, temperature); } annet { ble_ess_update_temp (& m_ess, temperatur); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, fuktighet); } annet { ble_ess_update_humid (& m_ess, fuktighet); } } updtmrexp = false; } }
Testing av programmet vårt ved hjelp av nRF Connect
nRF Connect er et kraftig Bluetooth-lavenergiverktøy som gjør det mulig å skanne og utforske BLE-aktiverte eksterne enheter. nRF Connect for mobil støtter et bredt utvalg av Bluetooth SIG-adopterte standardprofiler. Vi kan verifisere programmet vårt ved å bruke dette, etter at vi har installert appen, kan vi parre nRF52-kortet med telefonen vår ved å skanne etter BLE-enheter på appen. Inne i attributtet for miljøsensing kan vi legge merke til at temperatur- og fuktighetsverdiene blir oppdatert som vist på bildene nedenfor.
Hariharan Veerappan er en uavhengig konsulent med mer enn 15 års erfaring innen innebygd produktutvikling. Han tilbyr konsulenttjenester innen innebygd firmware / Linux-utvikling, han gir også bedrifts- og onlineopplæring. Hariharan har en bachelorgrad i ingeniørfag innen fagområdet elektronikk og kommunikasjonsteknikk, gjennom sine artikler og veiledninger deler han sine erfaringer og tanker med leserne av Circuit Digest.