- nRF52 комплект за разработка:
- Вградено студио Segger
- DHT11 с nRF52DK
- Как да работя с Bluetooth Low Energy (BLE)?
- Диаграма за обслужване / характеристики на BLE
- nRF52 BLE Обяснение на програмата
- Тестване на нашата програма с помощта на nRF Connect
С фитнес ленти, интелигентни часовници и други носими устройства стават все по-популярни използването на Bluetooth 5 / Bluetooth Low Energyкомуникационните стандарти се възприемат широко. BLE ни помага да обменяме данни на кратко разстояние с много малко мощност, което е много важно за батерийни устройства като носими устройства. Също така ни помага да създадем безжични BLE мрежови мрежи, тази функция е полезна за устройства за домашна автоматизация, където множество устройства трябва да комуникират помежду си в затворена среда. Вече използвахме BLE с Raspberry Pi и BLE с ESP32, за да изпълняваме някои основни BLE функции. Инженерите експериментират с BLE, за да проектират преносими безжични устройства, които могат да работят дълго време с малки батерии, а за работа с BLE има множество комплекти за разработка. В нашия неотдавнашен преглед на Arduino Nano 33 забелязахме също, че платката има nRF52840 с BLE възможности.
В този урок ще изследваме друга вълнуваща и популярна разработка, наречена nRF52 DK, за да измерваме температурата и влажността с помощта на BLE. По подразбиране BLE Environment Sensing Profiles поддържа широк спектър от параметри на околната среда, но този урок е ограничен само до стойности на температура и влажност. Това решение се свързва със смартфон чрез Bluetooth с ниска енергия и осигурява честа актуализация по отношение на параметрите на околната среда, т.е. температура, влажност. Ще използваме сензора DHT1 и измерването на температурата ще се извършва с резолюция 0,01 градуса по Целзий, а измерването на влажността ще се извършва с резолюция 0,01 процента.
nRF52 комплект за разработка:
nRF52DK е цялостна прототипираща платформа за приложението Bluetooth Low Energy и 2,4 GHz Wireless Internet of Things. Комплектът за разработка поддържа различни стандартни Nordic Toolchains като отворен код, GCC и интегрирани търговски среди за разработка като Keil, IAR и Segger Embedded Studio и др. Nordic предлага и пълноправен комплект за разработка на софтуер за nRF52, който включва пълна поддръжка за nRF52DK.
nRF52DK се захранва с nRF52832 ARM Cortex-M4F микроконтролер, който е интегриран 512Kbytes Flash Memor и 64 Kbytes SRAM. nRF52DK има вграден дебъгер Segger J-Link On Board, който осигурява по-лесно и бързо отстраняване на грешки без външни / допълнителни jtag устройства за отстраняване на грешки. Той също така включва Arduino Uno Rev3 съвместим конектор, който поддържа свързване на аналоговите и цифровите входове с микропроцесора и включва също стандартни комуникационни протоколи като I2C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface) и UART (Universal Asynchronous Receiver and Transmitter). Този комплект за разработка е проектиран с вградена вградена PCB антена, която осигурява безжична комуникация на къси разстояния, използвайки Bluetooth Low Energy за свързване със смарт телефон, лаптопи и таблети.
Вградено студио Segger
За да програмираме борда за разработка, ще използваме Segger Embedded Studio с nRF52. Segger Embedded Studio е мощна C / C ++ интегрирана среда за разработка (IDE), насочена специално за разработване на вградени системи. Това осигурява цялостно решение "всичко в едно", съдържащо всичко необходимо за вградено програмиране на C, разработка и отстраняване на грешки. Това включва пълен работен процес за програмиране и разработка на вградени системи, включващ управление на проекти, редактор, дебъгер, поддържащ ARM Cortex устройства. Тази мощна и лесна за използване IDE е напълно безплатна за скандинавските клиенти с пълен лиценз без ограничения за размера на кода. IDE може да бъде изтеглен от връзката, дадена по-долу,
Изтеглете Segger Embedded Studio
DHT11 с nRF52DK
DHT11 е пълнофункционален датчик за температура и влажност с компонент за измерване на влажност на резистивен тип и компонент за измерване на температурата от тип NTC. Той предлага отлично качество, по-бърза реакция и икономическа ефективност. По подразбиране всички DHT11 сензори са калибрирани в лабораторията, което води до изключителна точност и надеждност. Той комуникира с помощта на едножилна система за сериен интерфейс и други спецификации са дадени по-долу
Спецификации на DHT11:
- Диапазон на влажност: 20 - 90% RH
- Температурен диапазон: 0 - 50 градуса по Целзий
- Точност на влажност: ± 5 % RH
- Точност на температурата: ± 2 ℃
Диаграма на времето на DHT11:
Четенето на данните от сензора DHT11 е относително лесно, като се използва времевата диаграма, показана по-горе. Процедурата е подобна на всеки контролер и ние вече използвахме този сензор с други платформи за разработка като
- DHT11 сензор с Raspberry Pi
- DHT11 сензор с PIC16F877A
- DHT11 сензор със STM32F103C8
- DHT11 сензор с NodeMCU
За да свържете DHT11 сензора за температура и влажност с nRF52 Development Kit, следвайте схемата за свързване, дадена по-долу.
Използвам съединителен модул, за да свържа сензора към платката, така че окончателната ми настройка изглежда така
Блок-схема за комуникация с DHT11:
Диаграмата по-долу обяснява програмния логически поток, който ще използваме за комуникация между nRF52DK и DHT11
Формат на данните:
Как да работя с Bluetooth Low Energy (BLE)?
За да разберем как да използваме функцията BLE, трябва да разберем няколко основни терминологии, които са обяснени по-долу, можете също да прочетете статията за ESP32 BLE, за да научите повече за BLE
Общ профил за достъп (GAP)
Generic Access Profile носи пълната отговорност за установяване на връзката за комуникация между периферните и централните устройства на BLE. GAP също така предоставя различни процедури, включително сканиране / откриване на устройство, установяване на връзка на ниво връзка, прекратяване на връзката, ръкостискане на защитни функции и пълноценна конфигурация на устройството. GAP работи в следните състояния на устройството
GAP държави |
Описание |
в готовност |
Първоначално състояние на устройството при нулиране |
Рекламодател |
Реклама на устройство с данни, която помага за сканиране на инициатора |
Скенер |
Получава и изпраща заявка за сканиране до рекламодателя |
Инициатор |
Изпраща заявка за връзка за установяване на връзка |
Роб / Господар |
При свързване устройството като роб, ако е рекламодател, мастер ако е инициатор |
Общ слой на профила на атрибута (GATT)
GATT е съкращение от Generic Attribute Profile Layer, той е отговорен за комуникацията на данни между две BLE устройства (периферни и централни). Комуникацията на данни се характеризира под формата на характеристики, които комуникират и съхраняват данните. BLE устройството играе две различни роли за комуникация на устройства, дадени по-долу,
- GATT сървърът съдържа информация за характеристиките, която ще се използва за четене и писане. В нашия урок сензорът DHT11 и разработчикът комплектът е нашият GATT сървър.
- Клиентът на GATT чете и записва данните от / към GATT сървъра. Смартфонът е клиент на GATT, който чете и записва данните в нашата сензорна платка.
Bluetooth SIG
Bluetooth Special Interest Group (SIG) е организацията по стандартизация, която следи развитието на стандартите за Bluetooth и лицензирането на Bluetooth технологиите. Групата SIG не произвежда и не продава никакви Bluetooth продукти. Той определя спецификацията и стандартизацията на Bluetooth. Те определят уникалния идентификатор за ниско енергиен профил на Bluetooth и съответните характеристики. Спецификациите на профила GATT могат да бъдат намерени на линка по-долу
Спецификации на профила на GATT
Въз основа на спецификацията на GATT, дадена в горната връзка, ние събрахме уникалните идентификатори, необходими за нашия проект, който е даден в таблица по-долу.
Профил / характеристики |
UUID |
GAP (общ достъп) |
0x1800 |
GATT (родов атрибут) |
0x1801 |
ESS (околна среда) |
0x181A |
Температура |
0x2A6E |
Влажност |
0x2A6F |
Диаграма за обслужване / характеристики на BLE
BLE UUID
UUID |
16 битова стойност |
128 битов UUID |
ESS услуга |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Temp Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Char влажност |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
Температурни характеристики
Имот |
Описание |
Мерна единица |
Градус по Целзий с резолюция 0,01 градуса |
Формат |
sint16 |
UUID |
0x2A6E |
Десетична степен |
2 |
Прочети |
Задължителен |
Характеристики на влажност
Имот |
Описание |
Мерна единица |
Процент с резолюция 0,01 процента |
Формат |
uint16 |
UUID |
0x2A6F |
Десетична степен |
2 |
Прочети |
Задължителен |
nRF52 BLE Обяснение на програмата
Ще използваме nRF5 SDK, за да програмираме нашия nRF52 комплект за разработка. nRF5 SDK е пълен комплект за разработка на софтуер, интегриран с множество Bluetooth нискоенергийни профили, GATT сериализатор и поддръжка на драйвери за всички периферни устройства на серията SoCs от серията nRF5. Този SDK помага на разработчиците да изграждат пълнофункционални, надеждни и сигурни Bluetooth нискоенергийни приложения с микроконтролери от серия nRF52 и nRF51. Цялата програма може да бъде изтеглена от тук, обяснението на кода е както следва.
Конфигурирайте DHT11 DATA пина като вход на nrf52 с активиране на изтегляне. Състоянието на щифта трябва да е високо, за да се потвърди, че nRF52 осигурява подходящ PULLUP за пина за данни DHT11
/ * задайте за вход и проверете дали сигналът се изтегля * / Data_SetInput (); DelayUSec (50); if (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
Генерирайте сигнал START от микроконтролера nRF52 и проверете за сигнал за потвърждение.
/ * изпращане на стартов сигнал * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * поддържайте ниския сигнал най-малко 18 ms * / Data_SetInput (); DelayUSec (50); / * проверка за сигнал за потвърждение * / if (Data_GetVal ()! = 0) {/ * сигналът трябва да бъде изтеглен ниско от сензора * / return DHT11_NO_ACK_0; } / * изчакайте максимум 100 us за сигнала за атака от сензора * / cntr = 18; докато (Data_GetVal () == 0) {/ * изчакайте, докато сигналът се покачи * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_1; / * сигналът трябва да е нагоре за ACK тук * /}} / * изчакайте, докато отново се понижи, край на ack последователност * / cntr = 18; докато (Data_GetVal ()! = 0) {/ * изчакайте, докато сигналът намалее * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_0; / * тук сигналът трябва отново да е нула * /}}
Сега прочетете 40-те бита данни, които съдържат 2 байта температура, 2 байта влажност и 1 байт контролна сума.
/ * сега чете 40-битовите данни * / i = 0; данни = 0; loopBits = 40; направете {cntr = 11; / * изчакайте максимум 55 us * / while (Data_GetVal () == 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_0; }} cntr = 15; / * изчакайте максимум 75 us * / while (Data_GetVal ()! = 0) {DelayUSec (5); if (--cntr == 0) {return DHT11_NO_DATA_1; }} данни << = 1; / * следващ бит за данни * / if (cntr <10) {/ * сигнал за данни висок> 30 us ==> бит за данни 1 * / data - = 1; } if ((loopBits & 0x7) == 1) {/ * следващ байт * / буфер = данни; i ++; данни = 0; }} while (- loopBits! = 0);
Проверете данните с помощта на контролна сума.
/ * тест CRC * / if ((uint8_t) (буфер + буфер + буфер + буфер)! = буфер) {return DHT11_BAD_CRC; }
Манипулирайте и съхранявайте температурата и влажността
/ * съхранява стойности на данните за повикващия * / влажност = ((int) буфер) * 100 + буфер; температура = ((int) буфер) * 100 + буфер;
Инициализирайте услугата nRF5 SDK Logger. nRF52 SDK е снабден с контролен интерфейс за регистриране, наречен nrf_log, и използва стандартната бекенда за регистриране на информацията. По подразбиране бекендът ще бъде сериен порт. Тук ние се инициализира както nrf_log за контрол на интерфейса и nrf_log Неуспех по подразбиране, както добре.
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (код на грешка); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK има функционалност на таймера на приложението. Модулът на таймера на приложението позволява да се създават множество екземпляри на таймера въз основа на периферна RTC1. Тук ние инициализираме таймерния модул на приложението nRF5. В това решение се използват два таймера за приложение и интервал за актуализиране на данните.
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (код на грешка);
nRF52 SDK има пълнофункционален модул за управление на захранването, тъй като BLE устройствата трябва да работят няколко месеца на Coin клетъчна батерия. Управлението на захранването играе жизненоважна роля в BLE приложенията. Модулът за управление на захранването nRF52 напълно се справя със същото. Тук инициализираме модула за управление на захранването на nRF5 SDK
ret_code_t грешка_код; код на грешка = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (код на грешка);
nRF52 SDK има вграден шестнадесетичен файл на фърмуера Nordic Soft Device, който разполага с централен и периферен стек с ниска енергия на Bluetooth. Този висококвалифициран стек протоколи включва GATT, GAP, ATT, SM, L2CAP и Link Layer. Тук следваме последователността за инициализация, която инициализира nRF5 BLE Radio Stack (Nordic Soft Device)
ret_code_t грешка_код; код на грешка = nrf_sdh_enable_request (); APP_ERROR_CHECK (код на грешка); // Конфигурирайте BLE стека, като използвате настройките по подразбиране. // Извличам началния адрес на RAM на приложението. uint32_t ram_start = 0; код на грешка = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (код на грешка); // Активиране на BLE стека. код на грешка = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (код на грешка); // Регистрирайте манипулатор за BLE събития. NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP е отговорен за сканиране / откриване на устройство, установяване на връзка, прекратяване на връзката, иницииране на защитни функции и конфигурация. GAP разполага с ключови параметри на свързване като интервал на връзката, латентност на подчиненото устройство, изчакване на надзора и др.
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); код на грешка = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (код на грешка); 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; код на грешка = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (код на грешка);
GATT е отговорен за комуникацията на данни между BLE периферни и централни устройства. Модулът nRF52 GATT е полезен за договаряне и проследяване на максималния размер на ATT_MTU. Тук инициализираме nRF52 SDK Generic Attribute Module, ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (код на грешка);
GATT извършва комуникация на данни под формата на услуги и характеристики. Тук ние инициализираме услугите за наблюдение на околната среда на GATT, което включва инициализиране на характеристики като температура и влажност.
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // Инициализиране на модул за писане на опашка. qwr_init.error_handler = nrf_qwr_error_handler; код на грешка = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (код на грешка); m_ess.notif_write_handler = ble_ess_notif_write_handler; код на грешка = ble_ess_init (& m_ess); APP_ERROR_CHECK (код на грешка);
Рекламата играе жизненоважна роля в средата на приложението BLE. пакетите включват информация за тип адрес, тип реклама, данни за реклама, данни, специфични за производителя на устройството, и данни за отговор на сканиране. nRF52 SDK с рекламен модул. Тук правим инициализация на рекламния модул с параметрите.
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // Изграждане и задаване на рекламни данни. memset (& advdata, 0, sizeof (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = вярно; 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; код на грешка = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (код на грешка); err_code = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (код на грешка); ble_gap_adv_params_t adv_params; // Задаване на рекламни параметри. 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; код на грешка = sd_ble_gap_adv_set_configure (& m_adv_handle, & m_adv_data, & adv_params); APP_ERROR_CHECK (код на грешка);
BLE Connection ще се обработва и наблюдава с различни параметри на връзката, като първо забавяне на актуализацията на параметрите на връзката, следващи последователни закъснения, брой актуализации, функция за обратно извикване на манипулатора на събитие за връзка и манипулатор на събитие за обратно извикване на грешка. Тук правим параметри за установяване на BLE Connection и манипулатор на събития за обратно извикване за събития за връзка и събития за грешки.
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 = false; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; код на грешка = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (код на грешка);
След приключване на инициализацията на системата, тук започваме с рекламирането на името и информацията за способността на BLE устройството. Оттук тази периферия може да се види в списъка за сканиране на Ble за смартфон.
ret_code_terr_code; код на грешка = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (код на грешка);
Основният контур работи през интервала от 2 секунди, отчита температурата и влажността и се актуализира на свързано интелигентно устройство, като използва или четене, или известие
за (;;) { uint16_t температура, влажност; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); ако (updtmrexp) { dhtErrCode = DHTxx_Read (& температура, & влажност); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Температура:% d Влажност:% d \ n", температура, влажност); ако (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, температура); } else { ble_ess_update_temp (& m_ess, температура); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, влажност); } else { ble_ess_update_humid (& m_ess, влажност); } } updtmrexp = невярно; } }
Тестване на нашата програма с помощта на nRF Connect
nRF Connect е мощен Bluetooth инструмент с ниска енергия, който ви позволява да сканирате и изследвате BLE периферните устройства. nRF Connect за мобилни устройства поддържа широка гама от приети стандартни профили за Bluetooth SIG. Можем да проверим нашата програма, като използваме това, след като инсталираме приложението, можем да сдвоим платката nRF52 с телефона си, като сканираме за BLE устройства в приложението. Вътре в атрибута Sensing на околната среда можем да забележим актуализиране на стойностите на температурата и влажността, както е показано на снимките по-долу.
Hariharan Veerappan е независим консултант с повече от 15 години опит в разработването на вградени продукти. Той предоставя консултантски услуги при разработване на вграден фърмуер / Linux, а също така осигурява корпоративно и онлайн обучение. Харихаран има бакалавърска степен по инженерство в дисциплината Електроника и комуникационно инженерство, чрез своите статии и уроци споделя своя опит и мисли с читателите на Circuit Digest.