- Комплект розробки nRF52:
- Вбудована студія Segger
- DHT11 з nRF52DK
- Як працювати з Bluetooth Low Energy (BLE)?
- Діаграма обслуговування / характеристики BLE
- Пояснення програми nRF52 BLE
- Тестування нашої програми за допомогою nRF Connect
Завдяки фітнес-стрічкам, розумним годинникам та іншим пристроям, що носяться, стає все більш популярним використання Bluetooth 5 / Bluetooth Low Energyшироко застосовуються стандарти зв'язку. BLE допомагає нам обмінюватися даними на невеликій відстані з дуже малою потужністю, що є дуже важливим для таких акумуляторних пристроїв, як носимі пристрої. Це також допомагає нам налаштувати бездротові мережі BLE mesh, ця функція стане в нагоді для пристроїв домашньої автоматизації, де декілька пристроїв повинні взаємодіяти між собою в закритому середовищі. Ми вже використовували 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 ГГц бездротового Інтернету речей. Набір розробників підтримує різні стандартні Nordic Toolchains, такі як відкритий код, GCC та комерційні інтегровані середовища розробки, такі як Keil, IAR та Segger Embedded Studio тощо. Nordic також пропонує повноцінний набір для розробки програмного забезпечення для nRF52, який включає повну підтримку nRF52DK.
nRF52DK живиться від мікроконтролера nRF52832 ARM Cortex-M4F, який інтегрований 512 Кбайт Flash Memor і 64 Кбайт SRAM. nRF52DK має вбудований налагоджувач Segger J-Link On Board, який забезпечує простішу та швидшу налагодження без зовнішніх / додаткових пристроїв налагодження jtag. Він також включає роз'єм, сумісний з Arduino Uno Rev3, який підтримує взаємодію аналогових та цифрових входів з мікропроцесором, а також включає стандартні протоколи зв'язку, такі як I2C (Інтегральна схема), SPI (послідовний периферійний інтерфейс) та UART (універсальний асинхронний приймач і передавач) Цей комплект розробки розроблений з вбудованою вбудованою антеною друкованої плати, яка забезпечує бездротовий зв’язок короткого діапазону за допомогою Bluetooth Low Energy для підключення до смартфонів, ноутбуків та планшетів.
Вбудована студія Segger
Для програмування плати розробки ми будемо використовувати Segger Embedded Studio з nRF52. Segger Embedded Studio - це потужне інтегроване середовище розробки C / C ++ (IDE), орієнтоване спеціально на розробку вбудованих систем. Це забезпечує повне комплексне рішення, що містить все необхідне для вбудованого програмування, розробки та налагодження на C. Сюди входить повний робочий процес для програмування та розробки вбудованих систем, що включає управління проектами, редактор, налагоджувач, що підтримують пристрої ARM Cortex. Ця потужна і проста у використанні IDE є абсолютно безкоштовною для скандинавських клієнтів із повною ліцензією без будь-яких обмежень на розмір коду. IDE можна завантажити за посиланням нижче,
Завантажте вбудовану студію Segger
DHT11 з nRF52DK
DHT11 - це повнофункціональний датчик температури та вологості з компонентом вимірювання вологості резистивного типу та компонентом вимірювання температури типу NTC. Він пропонує чудову якість, швидшу реакцію та економічну ефективність. За замовчуванням усі датчики DHT11 відкалібровані в лабораторії, що забезпечує надзвичайну точність та надійність. Він взаємодіє за допомогою однопровідної системи послідовного інтерфейсу, а інші технічні характеристики наведені нижче
Технічні характеристики DHT11:
- Діапазон вологості: 20 - 90% вологості
- Діапазон температур: 0 - 50 градусів Цельсія
- Точність вологості: ± 5 % вологості
- Точність температури: ± 2 ℃
Часова діаграма DHT11:
Зчитування даних з датчика DHT11 порівняно просто за допомогою часової діаграми, показаної вище. Процедура подібна до будь-якого контролера, і ми вже використовували цей датчик з іншими платформами розробки, наприклад
- Датчик DHT11 з Raspberry Pi
- Датчик DHT11 з PIC16F877A
- Датчик DHT11 із STM32F103C8
- Датчик DHT11 з NodeMCU
Щоб підключити датчик температури та вологості DHT11 до набору розробників nRF52, дотримуйтесь схеми підключення, наведеної нижче.
Я використовую модуль роз’єму для підключення датчика до моєї плати, тому моя остаточна настройка виглядає так
Блок-схема для спілкування з DHT11:
Нижченаведена блок-схема пояснює логічний потік програми, який ми будемо використовувати для зв'язку між nRF52DK та DHT11
Формат даних:
Як працювати з Bluetooth Low Energy (BLE)?
Для того, щоб зрозуміти, як використовувати функцію BLE, ми повинні зрозуміти декілька основних термінологій, які описані нижче, ви також можете прочитати статтю ESP32 BLE, щоб дізнатися більше про BLE
Загальний профіль доступу (GAP)
Загальний профіль доступу несе повну відповідальність за встановлення з'єднання для зв'язку між периферійними пристроями BLE та центральними пристроями. GAP також надає різні процедури, включаючи сканування / виявлення пристроїв, встановлення з'єднання на рівні зв'язку, припинення зв'язку, рукостискання функцій безпеки та повноцінну конфігурацію пристрою. GAP працює в наступних станах пристрою
Держави GAP |
Опис |
В режимі очікування |
Початковий стан пристрою при скиданні |
Рекламодавець |
Реклама пристрою з даними, що допомагає сканувати ініціатори |
Сканер |
Отримує та надсилає запит на сканування рекламодавцю |
Ініціатор |
Надсилає запит на підключення для встановлення зв'язку |
Раб / Господар |
При підключенні пристрій як ведений, якщо рекламодавець, головний, якщо ініціатор |
Загальний рівень профілю атрибутів (GATT)
GATT скорочується від Generic Attribute Profile Layer, він відповідає за передачу даних між двома пристроями BLE (периферійним та центральним). Передача даних характеризується у вигляді характеристик, які передають і зберігають дані. Пристрій BLE виконує дві різні ролі для зв'язку пристрою, наведені нижче,
- Сервер GATT містить інформацію про характеристики, яка буде використовуватися для читання та запису. У нашому уроці датчик DHT11 та розробник. комплект - це наш сервер GATT.
- Клієнт GATT зчитує та записує дані з / на сервер GATT. Смартфон - це клієнт GATT, який зчитує та записує дані на нашу плату датчика.
Bluetooth SIG
Група спеціальних інтересів Bluetooth (SIG) - це організація, яка контролює розробку стандартів Bluetooth та ліцензування технологій Bluetooth. Група SIG не виробляє та не продає жодну продукцію Bluetooth. Він визначає специфікацію та стандартизацію Bluetooth. Вони визначають унікальний ідентифікатор профілю низького енергоспоживання Bluetooth та відповідних характеристик. Специфікації профілю GATT можна знайти за посиланням нижче
Технічні характеристики профілю GATT
На основі специфікації GATT, наведеної у наведеному вище посиланні, ми зібрали унікальні ідентифікатори, необхідні для нашого проекту, який наведено нижче.
Профіль / характеристики |
UUID |
GAP (загальний доступ) |
0x1800 |
GATT (загальний атрибут) |
0x1801 |
ESS (Sensing Environment) |
0x181A |
Температура |
0x2A6E |
Вологість |
0x2A6F |
Діаграма обслуговування / характеристики BLE
BLE UUID
UUID |
16-бітове значення |
128-бітний UUID |
Служба ESS |
0x181A |
0000181A-0000-0000-0000-00000000000 |
Темп Char |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
Вологість Чар |
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 Low Energy, серіалізатором GATT та підтримкою драйверів для всіх периферійних пристроїв на SoC серії nRF5. Цей SDK допомагає розробникам створювати повнофункціональні, надійні та безпечні програми з низьким енергоспоживанням Bluetooth за допомогою мікроконтролерів серії nRF52 та nRF51. Повну програму можна завантажити звідси, пояснення коду таке.
Налаштуйте DHT11 DATA-штифт як вхід на nrf52 з активацією витягування. Статус виводу повинен бути високим, щоб підтвердити, що nRF52 забезпечує належний ПУЛЬУП для виводу даних DHT11
/ * встановити для введення та перевірити, чи сигнал не підтягується * / Data_SetInput (); DelayUSec (50); if (Data_GetVal () == 0) {return DHT11_NO_PULLUP; }
Сформуйте сигнал START від мікроконтролера nRF52 і перевірте сигнал підтвердження.
/ * відправити сигнал запуску * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * підтримувати низький рівень сигналу принаймні 18 мс * / Data_SetInput (); DelayUSec (50); / * перевірити наявність сигналу підтвердження * / if (Data_GetVal ()! = 0) {/ * сигнал повинен бути низьким датчиком * / return DHT11_NO_ACK_0; } / * зачекайте максимум 100 us для сигналу ack від датчика * / cntr = 18; while (Data_GetVal () == 0) {/ * зачекайте, поки сигнал піде вгору * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_1; / * тут повинен бути сигнал ACK * /}} / * зачекати, поки він знову не знизиться, кінець послідовності ack * / cntr = 18; while (Data_GetVal ()! = 0) {/ * зачекайте, поки сигнал не знизиться * / DelayUSec (5); if (--cntr == 0) {return DHT11_NO_ACK_0; / * тут сигнал знову повинен бути нульовим * /}}
Тепер прочитайте 40 біт даних, які містять 2 байти температури, 2 байти вологості та 1 байт контрольної суми.
/ * тепер читаємо 40-бітові дані * / i = 0; дані = 0; loopBits = 40; do {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) {/ * наступний байт * / buffer = data; i ++; дані = 0; }} while (- loopBits! = 0);
Перевірте дані за допомогою контрольної суми.
/ * тест CRC * / if ((uint8_t) (буфер + буфер + буфер + буфер)! = буфер) {return DHT11_BAD_CRC; }
Маніпулюйте та зберігайте температуру та вологість
/ * зберігати значення даних для абонента * / вологість = ((int) буфер) * 100 + буфер; температура = ((int) буфер) * 100 + буфер;
Ініціалізуйте службу реєстратора SDK nRF5. 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 та рівень посилань. Тут ми дотримуємося послідовності ініціалізації, яка ініціювала радіо стек nRF5 BLE (Nordic Soft Device)
ret_code_t код помилки; код помилки = nrf_sdh_enable_request (); APP_ERROR_CHECK (код помилки); // Налаштуйте стек BLE, використовуючи налаштування за замовчуванням. // Отримати стартову адресу оперативної пам'яті програми. 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 = РОБА_ЛАТЕНЦІЯ; 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, 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 = 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; код помилки = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (код помилки); код помилки = 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 = НУЛЬ; 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 буде оброблятися та контролюватися за допомогою різних параметрів підключення, таких як затримка оновлення параметрів першого підключення, наступні послідовні затримки, кількість оновлень, функція зворотного виклику обробника події підключення та обробник події зворотного виклику підключення. Тут ми виконуємо ініціалізацію параметрів встановлення підключення BLE та обробник подій зворотного виклику для подій підключення та подій помилок.
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, sizeof (cp_init)); cp_init.p_conn_params = НУЛЬ; 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 секунд, зчитування температури та вологості та оновлення підключеного смарт-пристрою за допомогою зчитування або сповіщення
for (;;) { uint16_t температура, вологість; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); if (updtmrexp) { dhtErrCode = DHTxx_Read (& температура, & вологість); if (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("Температура:% d Вологість:% d \ n", температура, вологість); if (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, температура); } ще { ble_ess_update_temp (& m_ess, температура); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, вологість); } ще { ble_ess_update_humid (& m_ess, вологість); } } updtmrexp = false; } }
Тестування нашої програми за допомогою nRF Connect
nRF Connect - це потужний інструмент з низьким енергоспоживанням Bluetooth, який дозволяє сканувати та досліджувати периферійні пристрої з підтримкою BLE. nRF Connect для мобільних пристроїв підтримує широкий спектр стандартних профілів Bluetooth SIG. Ми можемо перевірити нашу програму, використовуючи це, після встановлення програми ми можемо з'єднати плату nRF52 із нашим телефоном, скануючи BLE-пристрої в додатку. Усередині атрибута екологічного зондування ми можемо помітити, що значення температури та вологості оновлюються, як показано на малюнках нижче.
Hariharan Veerappan - незалежний консультант, який має більш ніж 15-річний досвід у розробці вбудованих продуктів. Він надає консультаційні послуги з розробки вбудованого програмного забезпечення / Linux, а також проводить корпоративні та онлайн-тренінги. Харіхаран має ступінь бакалавра інженерних наук за дисципліною Електроніка та комунікаційне машинобудування, через свої статті та навчальні посібники він ділиться своїм досвідом та думками з читачами Circuit Digest.