- nRF52 Utvecklingssats:
- Segger Embedded Studio
- DHT11 med nRF52DK
- Hur arbetar jag med Bluetooth Low Energy (BLE)?
- BLE Service / Egenskaper Diagram
- nRF52 BLE Programförklaring
- Testa vårt program med nRF Connect
Med Fitness Bands, Smartwatches och andra bärbara enheter blir allt populärare att använda Bluetooth 5 / Bluetooth Low Energykommunikationsstandarder antas allmänt. BLE hjälper oss att utbyta data över ett kort avstånd med mycket lite ström, vilket är mycket viktigt för batteridrivna enheter som bärbara datorer. Det hjälper oss också att skapa trådlösa BLE-nätverk, den här funktionen är till nytta för hemautomationsenheter där flera enheter måste kommunicera med varandra i en sluten miljö. Vi har redan använt BLE med Raspberry Pi och BLE med ESP32 för att utföra några grundläggande BLE-funktioner. Ingenjörer experimenterar med BLE för att designa bärbara trådlösa enheter som kan köras länge på små batterier och det finns flera utvecklingssatser tillgängliga för att arbeta med BLE. I vår senaste recension på Arduino Nano 33 märkte vi också att styrelsen har nRF52840 med BLE-funktioner.
I denna handledning kommer vi att utforska en annan spännande och populär utvecklingskort som heter nRF52 DK för att mäta temperatur och luftfuktighet med hjälp av BLE. Som standard stöder BLE miljöavkännande profiler ett stort antal miljöparametrar men den här självstudien är endast begränsad till temperatur- och fuktighetsvärden. Denna lösning ansluts till en smartphone via Bluetooth med låg energi och ger en frekvent uppdatering av miljöparametrarna, dvs temperatur, luftfuktighet. Vi använder DHT1-sensorn och temperaturmätningen kommer att göras med en upplösning på 0,01 grader Celsius och luftfuktighetsmätningen kommer att göras med en upplösning på 0,01 procent.
nRF52 Utvecklingssats:
nRF52DK är en komplett prototypplattform för Bluetooth Low Energy och 2,4 GHz Wireless Internet of Things-applikationen. Utvecklingssatsen stöder olika nordiska standardverktygskedjor som öppen källkod, GCC och kommersiellt integrerade utvecklingsmiljöer som Keil, IAR och Segger Embedded Studio, etc. Nordic tillhandahåller också en fullfjädrad programvaruutvecklingssats för nRF52, som inkluderar komplett support för nRF52DK.
nRF52DK drivs med nRF52832 ARM Cortex-M4F Microcontroller, som är integrerad 512 kbyte Flash Memor och 64 kbyte SRAM. nRF52DK har en integrerad Segger J-Link On Board-felsökare, som ger en enklare och snabbare felsökning utan externa / ytterligare jtag-felsökningsenheter. Den innehåller också Arduino Uno Rev3-kompatibel kontakt, som stöder gränssnitt mellan analoga och digitala ingångar med mikroprocessorn och det inkluderar också standardkommunikationsprotokoll som I2C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface) och UART (Universal Asynchronous Receiver and Transmitter). Detta utvecklingssats är utformat med en inbyggd inbyggd PCB-antenn som ger trådlös kommunikation med kort räckvidd med Bluetooth Low Energy för anslutning till smarttelefon, bärbara datorer och surfplattor.
Segger Embedded Studio
För att programmera utvecklingskortet använder vi Segger Embedded Studio med nRF52. Segger Embedded Studio är en kraftfull C / C ++ integrerad utvecklingsmiljö (IDE) riktad specifikt för inbyggd systemutveckling. Detta ger en komplett allt-i-ett-lösning som innehåller allt som behövs för inbäddad C-programmering, utveckling och felsökning. Detta inkluderar ett komplett arbetsflöde för inbyggd systemprogrammering och utveckling, med projektledning, redaktör, felsökningsstöd för ARM Cortex-enheter. Denna kraftfulla och lättanvända IDE är helt gratis för nordiska kunder med full licens utan några kodstorleksbegränsningar. IDE kan laddas ner från länken nedan,
Ladda ner Segger Embedded Studio
DHT11 med nRF52DK
DHT11 är en fullfjädrad temperatur- och luftfuktighetssensor med en resistent typ av fuktmätningskomponent och en temperaturmätkomponent av NTC-typ. Det erbjuder utmärkt kvalitet, snabbare respons och kostnadseffektivitet. Som standard är alla DHT11-sensorer kalibrerade i laboratoriet vilket leder till extrem noggrannhet och tillförlitlighet. Den kommunicerar med hjälp av Single-Wire Serial Interface-system och andra specifikationer ges nedan
Specifikationer för DHT11:
- Luftfuktighet: 20 - 90% RH
- Temperaturområde: 0 - 50 grader celsius
- Luftfuktighetsnoggrannhet: ± 5 % RH
- Temperaturnoggrannhet: ± 2 ℃
Tidsdiagram för DHT11:
Att läsa data från DHT11-sensorn är relativt enkelt med hjälp av tidsdiagrammet som visas ovan. Förfarandet liknar alla styrenheter och vi har redan använt den här sensorn med andra utvecklingsplattformar som
- DHT11-sensor med Raspberry Pi
- DHT11-sensor med PIC16F877A
- DHT11-sensor med STM32F103C8
- DHT11-sensor med NodeMCU
Följ anslutningsdiagrammet nedan för att ansluta DHT11 temperatur- och luftfuktighetssensorn med nRF52-utvecklingssatsen.
Jag använder en anslutningsmodul för att ansluta sensorn till mitt kort, så min slutliga installation ser ut så här
Flödesschema för kommunikation med DHT11:
Nedanstående flödesschema förklarar det programlogiska flödet som vi kommer att använda för att kommunicera mellan nRF52DK och DHT11
Dataformat:
Hur arbetar jag med Bluetooth Low Energy (BLE)?
För att förstå hur man använder BLE-funktionen måste vi förstå några grundläggande terminologier som förklaras nedan, du kan också läsa artikeln ESP32 BLE för att lära dig mer om BLE
Generisk åtkomstprofil (GAP)
Generic Access Profile har det fullständiga ansvaret för att upprätta anslutningen för kommunikation mellan BLE-kringutrustning och centrala enheter. GAP tillhandahåller också olika procedurer inklusive enhetsskanning / upptäckt, länklageranslutning, länkavslutning, handskakning av säkerhetsfunktioner och fullfjädrad enhetskonfiguration. GAP fungerar i följande enhetstillstånd
GAP-stater |
Beskrivning |
Står fast vid |
Enhetens ursprungliga tillstånd vid återställning |
Annonsör |
Enhetsannonsering med data som hjälper till att skanna initiativtagare |
Scanner |
Tar emot och skickar skanningsbegäran till annonsören |
Initiator |
Skickar en anslutningsförfrågan för att skapa en länk |
Slav mästare |
Vid anslutning, enhet som en slav om annonsör, master om en initiator |
Generiskt attributprofillager (GATT)
GATT står för Generic Attribute Profile Layer, det ansvarar för datakommunikation mellan två BLE-enheter (Peripheral & Central). Datakommunikation karaktäriseras i form av egenskaper som kommunicerar och lagrar data. BLE-enheten spelar två olika roller för enhetskommunikation som anges nedan,
- GATT Server innehåller information om egenskaper som kommer att användas för att läsa och skriva. I vår handledning, DHT11-sensorn och utvecklaren. satsen är vår GATT-server.
- GATT-klienten läser och skriver data från / till GATT-servern. Smarttelefonen är en GATT-klient som läser och skriver in data på vårt sensorkort.
Bluetooth SIG
Bluetooth Special Interest Group (SIG) är standardorganisationen som övervakar utvecklingen av Bluetooth-standarder och licensiering av Bluetooth-teknik. SIG-gruppen producerar eller säljer inga Bluetooth-produkter. Den definierar Bluetooth-specifikationen och standardiseringen. De definierar Unique Identifier för Bluetooth-energiprofil och respektive egenskaper. GATT-profilspecifikationerna finns på länken nedan
GATT-profilspecifikationer
Baserat på GATT-specifikationen i länken ovan har vi samlat in de unika identifierare som krävs för vårt projekt, som tabelleras nedan.
Profil / egenskaper |
UUID |
GAP (generisk åtkomst) |
0x1800 |
GATT (generiskt attribut) |
0x1801 |
ESS (miljöavkänning) |
0x181A |
Temperatur |
0x2A6E |
Fuktighet |
0x2A6F |
BLE Service / Egenskaper Diagram
BLE UUID
UUID |
16 bitars värde |
128 bitars UUID |
ESS-tjänst |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Temp Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Luftfuktighet Char |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Temperaturegenskaper
Fast egendom |
Beskrivning |
Enhet |
Grad Celsius med en upplösning på 0,01 grad |
Formatera |
sint16 |
UUID |
0x2A6E |
Decimal Exponent |
2 |
Läsa |
Obligatorisk |
Fuktighetsegenskaper
Fast egendom |
Beskrivning |
Enhet |
Procentandel med en upplösning på 0,01 procent |
Formatera |
uint16 |
UUID |
0x2A6F |
Decimal Exponent |
2 |
Läsa |
Obligatorisk |
nRF52 BLE Programförklaring
Vi kommer att använda nRF5 SDK för att programmera vårt nRF52 Development kit. nRF5 SDK är ett komplett programvaruutvecklingssats integrerat med många Bluetooth Low Energy-profiler, GATT Serializer och drivrutinssupport för alla kringutrustning på nRF5-serien SoC. Denna SDK hjälper utvecklare att bygga kompletta, tillförlitliga och säkra Bluetooth-lågenergiapplikationer med nRF52- och nRF51-serien av mikrokontroller. Hela programmet kan laddas ner härifrån, kodförklaringen är som följer.
Konfigurera DHT11 DATA-stiftet som ingång vid nrf52 med pull up-aktivering. Pin-status ska vara hög för att bekräfta att nRF52 ger rätt PULLUP för DHT11-datapinnen
/ * inställd på ingång och kontrollera om signalen dras upp * / Data_SetInput (); DelayUSec (50); om (Data_GetVal () == 0) {returnera DHT11_NO_PULLUP; }
Generera START-signal från nRF52 Microcontroller och kontrollera om kvitteringssignal finns.
/ * skicka startsignal * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * håll signalen låg i minst 18 ms * / Data_SetInput (); FördröjningUSec (50); / * kontrollera om kvitteringssignal * / om (Data_GetVal ()! = 0) {/ * signal måste dras lågt av sensorn * / return DHT11_NO_ACK_0; } / * vänta max 100 us för ack-signalen från sensorn * / cntr = 18; medan (Data_GetVal () == 0) {/ * vänta tills signalen går upp * / DelayUSec (5); om (--cntr == 0) {return DHT11_NO_ACK_1; / * -signalen ska vara uppe för ACK här * /}} / * vänta tills den går ner igen, slutet av ack-sekvensen * / cntr = 18; medan (Data_GetVal ()! = 0) {/ * vänta tills signalen går ner * / DelayUSec (5); om (--cntr == 0) {return DHT11_NO_ACK_0; / * -signalen ska vara noll igen här * /}}
Läs nu de 40 bitarna med data som innehåller 2 byte temperatur, 2 byte fuktighet och 1 byte i en kontrollsumma.
/ * läs nu 40-bitarsdata * / i = 0; data = 0; loopBits = 40; gör {cntr = 11; / * vänta max 55 oss * / medan (Data_GetVal () == 0) {DelayUSec (5); om (--cntr == 0) {returnera DHT11_NO_DATA_0; }} cntr = 15; / * vänta max 75 oss * / medan (Data_GetVal ()! = 0) {DelayUSec (5); om (--cntr == 0) {returnera DHT11_NO_DATA_1; }} data << = 1; / * nästa databit * / if (cntr <10) {/ * datasignal hög> 30 us ==> databit 1 * / data - = 1; } om ((loopBits & 0x7) == 1) {/ * nästa byte * / buffert = data; i ++; data = 0; }} medan (- loopBits! = 0);
Validera data med hjälp av Checksum.
/ * testa CRC * / if ((uint8_t) (buffert + buffert + buffert + buffert)! = buffert) {return DHT11_BAD_CRC; }
Manipulera och förvara temperatur och luftfuktighet
/ * lagra datavärden för den som ringer * / fuktighet = ((int) buffert) * 100 + buffert; temperatur = ((int) buffert) * 100 + buffert;
Initiera nRF5 SDK Logger-tjänsten. nRF52 SDK har ett loggningskontrollgränssnitt som heter nrf_log och använder standardbackend för att logga informationen. Standardbackend är en seriell port. Här initialiserar vi både nrf_log- kontrollgränssnittet och nrf_logs standardbackend också.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (felkod); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK har applikationstimerfunktionalitet. Med applikationstimermodulen kan du skapa flera timerinstanser baserade på RTC1-kringutrustning. Här initialiserar vi nRF5-applikationstimermodulen. I den här lösningen används två applikationstimrar för och uppdateringsintervall för data.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (felkod);
nRF52 SDK har den kompletta strömhanteringsmodulen eftersom BLE-enheter behöver arbeta i flera månader på ett myntcellsbatteri. Energihantering spelar en viktig roll i BLE-applikationer. nRF52-strömhanteringsmodulen hanterar detsamma helt. Här initialiserar vi Power Management-modulen för nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (felkod);
nRF52 SDK har en inbyggd Nordic Soft Device-firmware-hex-fil, som har Bluetooth-lågenergi-central och perifer stack. Denna högkvalificerade protokollstack inkluderar GATT, GAP, ATT, SM, L2CAP och Link Layer. Här följer vi initieringssekvensen, den initialiserade nRF5 BLE Radio Stack (Nordic Soft Device)
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (felkod); // Konfigurera BLE-stacken med standardinställningarna. // Hämta start-adressen till 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 (felkod); // Aktivera BLE-stack. err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (felkod); // Registrera en hanterare för BLE-händelser. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP ansvarar för skanning / upptäckt av enheter, länkupprättande, länkavslutning, initiering av säkerhetsfunktioner och konfiguration. GAP har visat sig med viktiga anslutningsparametrar som anslutningsintervall, slavfördröjning, övervakningstimeout, etc. Härefter initierar du anslutningsparametrarna för 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_läge); err_code = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (felkod); 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 (felkod);
GATT ansvarar för datakommunikation mellan BLE-kringutrustning och centrala enheter. nRF52 GATT-modulen är till hjälp för att förhandla och hålla reda på den maximala ATT_MTU-storleken. Här initialiserar vi nRF52 SDK Generic Attribute Module, ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (felkod);
GATT gör datakommunikation i form av tjänster och egenskaper. Här initialiserar vi GATT-miljöavkänningstjänsterna, som inkluderar initialisering av egenskaper som temperatur och fuktighet.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Initiera kö-skrivmodul. qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (felkod); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = ble_ess_init (& m_ess); APP_ERROR_CHECK (felkod);
Annonsering spelar en viktig roll i BLE-applikationsmiljön. paket inkluderar information om adresstyp, reklamtyp, reklamdata, enhetstillverkarspecifik data och skanningsdata. nRF52 SDK med en reklammodul. Här initialiserar vi reklammodulen med parametrarna.
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 och ställ in reklamdata. 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 (felkod); err_code = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (felkod); ble_gap_adv_params_t adv_params; // Ställ in reklamparametrar. 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 (felkod);
BLE-anslutning hanteras och övervakas med olika anslutningsparametrar som fördröjning av första anslutningsparam-uppdateringar, nästa förseningar i följd, uppdateringsantal, återkopplingsfunktion för anslutningshändelseshanterare och återkopplingshändelsehanterare för anslutningsfel. Här initialiserar vi BLE-anslutningsparametrar och en återuppringningshändelsehanterare för anslutningshändelser och felhä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 = 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 = falskt; 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 (felkod);
Efter att initialiseringen av systemet har slutförts börjar vi här med att annonsera BLE-enhetsnamnet och information om kapacitet. Härifrån kan denna kringutrustning ses över Ble-listan för smartphone Ble.
ret_code_terr_code; err_code = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (felkod);
Huvudslingan går över intervallet 2 sekunder, läser temperatur och fuktighet och uppdaterar till en ansluten smart enhet med antingen läs eller meddelande
för (;;) { uint16_t temperatur, fuktighet; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); om (updtmrexp) { dhtErrCode = DHTxx_Read (& temperatur, & fuktighet); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Temperatur:% d Luftfuktighet:% d \ n", temperatur, fuktighet); om (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, temperature); } annat { ble_ess_update_temp (& m_ess, temperatur); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, fuktighet); } annat { ble_ess_update_humid (& m_ess, fuktighet); } } updtmrexp = falskt; } }
Testa vårt program med nRF Connect
nRF Connect är ett kraftfullt Bluetooth-lågenergiverktyg som gör det möjligt att skanna och utforska BLE-aktiverade kringutrustning. nRF Connect för mobil stöder ett brett utbud av Bluetooth SIG-antagna standardprofiler. Vi kan verifiera vårt program genom att använda detta, efter installation av appen kan vi para ihop nRF52-kortet med vår telefon genom att söka efter BLE-enheter i appen. Inne i attributet Miljöavkänning kan vi märka att temperatur- och luftfuktighetsvärdena uppdateras som visas på bilderna nedan.
Hariharan Veerappan är en oberoende konsult med mer än 15 års erfarenhet av inbyggd produktutveckling. Han tillhandahåller konsulttjänster inom inbyggd firmware / Linux-utveckling, han tillhandahåller också företagsutbildning och online-utbildning. Hariharan har en kandidatexamen i teknik inom ämnet elektronik och kommunikationsteknik, genom sina artiklar och handledning delar han sina erfarenheter och tankar med läsarna av Circuit Digest.