- Комплект разработчика nRF52:
- Segger Embedded Studio
- 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 ГГц. Комплект разработчика поддерживает различные стандартные скандинавские Toolchains, такие как открытый исходный код, GCC и коммерческие интегрированные среды разработки, такие как Keil, IAR и Segger Embedded Studio и т. Д. Nordic также предоставляет полноценный комплект разработки программного обеспечения для nRF52, который включает полную поддержку nRF52DK.
nRF52DK питается от микроконтроллера nRF52832 ARM Cortex-M4F, в который встроено 512 Кбайт флэш-памяти и 64 Кбайт SRAM. nRF52DK имеет встроенный отладчик Segger J-Link On Board, который обеспечивает более простую и быструю отладку без внешних / дополнительных устройств отладки jtag. Он также включает в себя разъем, совместимый с Arduino Uno Rev3., который поддерживает сопряжение аналоговых и цифровых входов с микропроцессором, а также включает стандартные протоколы связи, такие как I2C (межинтегральная схема), SPI (последовательный периферийный интерфейс) и UART (универсальный асинхронный приемник и передатчик). Этот комплект разработчика разработан со встроенной антенной на печатной плате, которая обеспечивает беспроводную связь на малых расстояниях с использованием Bluetooth Low Energy для подключения к смартфонам, ноутбукам и планшетам.
Segger Embedded Studio
Для программирования платы разработки мы будем использовать Segger Embedded Studio с nRF52. Segger Embedded Studio - это мощная интегрированная среда разработки (IDE) C / C ++, специально предназначенная для разработки встроенных систем. Это обеспечивает полное комплексное решение, содержащее все необходимое для встроенного программирования на C, разработки и отладки. Это включает в себя полный рабочий процесс для программирования и разработки встроенных систем, включая управление проектами, редактор, отладчик, поддерживающий устройства ARM Cortex. Эта мощная и простая в использовании среда IDE полностью бесплатна для клиентов из стран Северной Европы с полной лицензией без каких-либо ограничений по размеру кода. IDE можно скачать по ссылке ниже,
Скачать Segger Embedded Studio
DHT11 с nRF52DK
DHT11 - это полнофункциональный датчик температуры и влажности с компонентом измерения влажности резистивного типа и компонентом измерения температуры типа NTC. Он предлагает отличное качество, более быстрый отклик и экономическую эффективность. По умолчанию все датчики DHT11 калибруются в лаборатории, что обеспечивает исключительную точность и надежность. Он обменивается данными с использованием системы однопроводного последовательного интерфейса, а другие характеристики приведены ниже.
Технические характеристики DHT11:
- Диапазон влажности: 20 - 90% относительной влажности
- Диапазон температур: 0-50 градусов Цельсия
- Точность влажности: ± 5 % RH
- Точность температуры: ± 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 и dev. комплект - это наш сервер 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 (Environment Sensing) |
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 Low Energy, сериализатором GATT и поддержкой драйверов для всех периферийных устройств на SoC серии nRF5. Этот SDK помогает разработчикам создавать полнофункциональные, надежные и безопасные приложения Bluetooth с низким энергопотреблением с микроконтроллерами серий nRF52 и nRF51. Полную программу можно скачать отсюда, объяснение кода выглядит следующим образом.
Настройте вывод DHT11 DATA как вход на nrf52 с включением подтягивания. Состояние вывода должно быть высоким, чтобы подтвердить, что nRF52 обеспечивает правильное PULLUP для вывода данных DHT11.
/ * устанавливается на ввод и проверяется, подтягивается ли сигнал * / Data_SetInput (); DelayUSec (50); если (Data_GetVal () == 0) {вернуть 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 мкс сигнала подтверждения от датчика * / cntr = 18; while (Data_GetVal () == 0) {/ * ждать, пока сигнал поднимется * / DelayUSec (5); если (--cntr == 0) {вернуть DHT11_NO_ACK_1; / * здесь должен быть сигнал для ACK * /}} / * ждать, пока он снова не отключится, конец последовательности подтверждений * / cntr = 18; while (Data_GetVal ()! = 0) {/ * ждать, пока сигнал не исчезнет * / DelayUSec (5); если (--cntr == 0) {вернуть DHT11_NO_ACK_0; / * здесь сигнал должен быть снова обнулен * /}}
Теперь прочтите 40 бит данных, которые содержат 2 байта температуры, 2 байта влажности и 1 байт контрольной суммы.
/ * теперь читаем 40-битные данные * / i = 0; данные = 0; loopBits = 40; сделать {cntr = 11; / * ждать максимум 55 мкс * / while (Data_GetVal () == 0) {DelayUSec (5); если (--cntr == 0) {вернуть DHT11_NO_DATA_0; }} cntr = 15; / * ждать макс 75 мкс * / while (Data_GetVal ()! = 0) {DelayUSec (5); если (--cntr == 0) {вернуть 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) buffer) * 100 + buffer; температура = ((int) buffer) * 100 + buffer;
Инициализируйте службу регистратора 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 должны работать в течение нескольких месяцев от батарейки типа «таблетка». Управление питанием играет жизненно важную роль в приложениях BLE. Модуль управления питанием nRF52 полностью справляется с тем же. Здесь мы инициализируем модуль управления питанием nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (код ошибки);
nRF52 SDK имеет встроенный шестнадцатеричный файл прошивки Nordic Soft Device, который включает в себя центральный и периферийный стек Bluetooth с низким энергопотреблением. Этот высококвалифицированный стек протоколов включает GATT, GAP, ATT, SM, L2CAP и Link Layer. Здесь мы следуем последовательности инициализации, которая инициализировала радиостек nRF5 BLE (Nordic Soft Device)
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (код ошибки); // Настраиваем стек BLE, используя настройки по умолчанию. // Получение начального адреса ОЗУ приложения. uint32_t ram_start = 0; err_code = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (код ошибки); // Включить стек BLE. err_code = 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); err_code = 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; err_code = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (код ошибки);
GATT отвечает за передачу данных между периферийными и центральными устройствами BLE. Модуль nRF52 GATT полезен для согласования и отслеживания максимального размера ATT_MTU. Здесь мы инициализируем модуль универсальных атрибутов SDK nRF52, 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; err_code = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (код ошибки); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = 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; err_code = 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; err_code = 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 = 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; err_code = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (код ошибки);
После завершения инициализации системы мы начинаем с объявления имени устройства BLE и информации о возможностях. Отсюда это периферийное устройство можно увидеть в списке сканирования Ble смартфона.
ret_code_terr_code; err_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 (); если (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, температура); } еще { ble_ess_update_temp (& m_ess, температура); } если (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 в приложении. Внутри атрибута Environmental sensing мы можем заметить, что значения температуры и влажности обновляются, как показано на рисунках ниже.
Харихаран Вираппан - независимый консультант с более чем 15-летним опытом разработки встроенных продуктов. Он предоставляет консультационные услуги по разработке встроенного ПО / Linux, а также проводит корпоративное и онлайн-обучение. Харихаран имеет степень бакалавра технических наук в области электроники и коммуникационной техники. В своих статьях и учебных пособиях он делится своим опытом и мыслями с читателями Circuit Digest.