Bluetooth Low Energy (BLE) – это версия технологии Bluetooth, причем значительно более оптимизированная чем классический Bluetooth. Ее часто называют "умной" Bluetooth (Smart Bluetooth). Первоначально технология BLE разрабатывалась для обеспечения минимально возможного энергопотребления при низкой стоимости, маленькой ширины полосы частот и низкой сложности оборудования. Некоторые современные микроконтроллеры, например, ESP32, имеют встроенную технологию BLE, а в других микроконтроллерах, в том числе и в Arduino, для использования технологии BLE можно применить модуль nRF24L01. Этот радиочастотный модуль можно также использовать для передачи данных другим устройствам, поддерживающим технологию Bluetooth, например, смартфонам, ноутбукам и т.д.
В данной статье мы рассмотрим процесс передачи данных по технологии BLE с помощью радиочастотных модулей nRF24L01. Мы будем считывать значения температуры с датчика DHT11 и передавать их на смартфон с помощью платы Arduino и модуля nRF24L01, используя технологию BLE.
Почему технология Bluetooth Low Energy (BLE) стала популярной?
Возрастающая с каждым годом популярность технологии BLE обусловлена, в первую очередь, ее крайне низким энергопотреблением, что позволяет устройствам на ее основе работать длительное время от обычной батарейки. Также ее феноменальный успех в последние годы объясняется легкостью ее интегрирования (встраивания) в смартфоны, планшеты в другие мобильные устройства.
Возможности BLE в модуле NRF24L01
Технология BLE работает в диапазоне ISM (2,4 ГГц), который во многих странах разрешен для безлицензионного использования (то есть не нужно получать никаких разрешений в радиочастотных органах) в промышленности, науке и медицине. ISM диапазон занимает полосу частот от 2400 МГц до 2483.5 МГц и разделен на 40 каналов. Три из этих 40 каналов имеют статус "информационных", они используются устройствами для передачи специальных приветственных пакетов с информацией о своем состоянии – это позволяет другим устройствам BLE устанавливать с ними связь.
В этой статье мы рассмотрим как использовать модуль NRF24L01 в качестве BLE трансивера (приёмопередатчика). BLE функциональность данного модуля будет продемонстрирована на примере передачи данных температуры в смартфон. Данные температуры будут считываться с датчика DHT11, а управлять всем процессом передачи данных будет плата Arduino. На смартфоне для приема этих данных можно использовать, например, приложение для android под названием Nordic BLE.
Необходимые компоненты
Аппаратное обеспечение
- Плата Arduino Uno (купить на AliExpress).
- nRF24L01 BLE Module (BLE модуль nRF24L01)(купить на AliExpress).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Программное обеспечение
- Arduino IDE .
- Nordic BLE Android Application (nRF Temp 2.0 for BLE или nRF Connect for Mobile).
Принципы работы модуля nRF24L01
Модули nRF24L01 являются приемопередающими модулями, то есть каждый модуль может как передавать, так и принимать информацию. Но они могут работать только в режиме полудуплекса – то есть в конкретный момент времени модуль может либо передавать, либо принимать информацию. Основой модуля является универсальная микросхема nRF24L01 от компании Nordic semi-conductors, которая осуществляет прием и передачу данных в модуле. Эта микросхема взаимодействует с другими устройствами по интерфейсу SPI, поэтому ее легко подключить к большинству современных микроконтроллеров, в том числе и к плате Arduino, для которой разработаны специальные библиотеки для работы с подобными модулями. Ранее мы использовали модули nRF24L01 для создания приватной комнаты чата на основе плат Arduino.
Назначение контактов (распиновка) модуля nRF24L01 приведена на следующем рисунке.
Модуль может работать с напряжениями от 1.9V до 3.6V (обычно используется 3.3V) и потребляет во время своей работы сравнительно небольшой ток – всего 12mA, что позволяет его использовать в устройствах с низким потреблением энергии, работающих от маленьких батареек типа "таблетка" (coin cells). Несмотря на то, что стандартное рабочее напряжение модуля составляет 3.3V, большинство его контактов устойчивы и к напряжению 5V, что позволяет непосредственно его подключать к контактам платы Arduino.
Другим достоинством модуля nRF24L01 является наличие у него возможности работать по 6 каналам связи. Это значит, что он может взаимодействовать с другими 6 подобными модулями и передавать им или принимать от них информацию. Данная особенность модуля позволяет строить на его основе сети связи с топологией типа "звезда" или Mesh сети (самоорганизующиеся сети связи, в которых каждое устройство может выполнять роль ретранслятора/маршрутизатора), поэтому данные модули очень удобны для реализации различных проектов в сфере интернета вещей (IoT – Internet of Things). Также модули nRF24L01 поддерживают до 125 уникальных идентификаторов (ID), то есть в ограниченной области мы можем использовать до 125 таких модулей чтобы они не мешали при работе друг другу.
Схема проекта
Схема подключения модуля nRF24L01 к плате Arduino для передачи данных с помощью технологии BLE представлена на следующем рисунке.
Внешний вид конструкции проекта в сборе показан на следующем рисунке.
Объяснение программы Arduino для использования технологии BLE
Полный код программы и видео с демонстрацией работы проекта приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода. В видео также объяснено и использование Android приложения (App of Nordic ) для работы по BLE.
Первым делом в программе подключим используемые библиотеки: RF24 – для использования команд модуля nRF24L01, DHT11 – для работы с датчиком DHT11, BTLE library – для использования функций технологии BLE.
1 2 3 4 |
#include <SPI.h> #include <RF24.h> #include <BTLE.h> #include <DHT.h> |
Далее в программе определим и инициализируем используемые контакты и объекты. DHT – объект для работы с датчиком DHT11, подключенным к контакту 4 платы Arduino. Контакты радиочастотного модуля CE и CSN подключены к контактам 9 и 10 платы Arduino.
1 2 3 4 5 6 |
#define DHTPIN #define DHTTYPE DHT11 DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 radio(9, 10); BTLE btle(&radio); |
Затем инициализируем последовательную связь со скоростью 9600 бод и связь с датчиком DHT11. Также инициализируем связь по технологии BLE (btle.begin), локальное имя Bluetooth соединения при этом может содержать максимум 8 символов.
1 2 3 |
Serial.begin(9600); dht.begin(); btle.begin("CD Temp"); |
Затем мы будем считывать показания температуры с датчика DHT11 и сохранять их в переменной temp. Также мы добавили команду для выдачи сообщения об ошибке если с модуля DHT11 не удалось считать данные температуры.
1 2 3 4 5 |
float temp = dht.readTemperature(); //read temperature data if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; } |
Затем мы сохраняем значение температуры в буфер и передаем его в BLE модуль, который передает эти данные в радиоэфир. Затем мы эти данные принимаем в приложении на android.
1 2 3 4 5 6 7 |
nrf_service_data buf; buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID; buf.value = BTLE::to_nRF_Float(temp); if (!btle.advertise(0x16, &buf, sizeof(buf))) { Serial.println("BTLE advertisement failed..!"); } |
Когда это будет сделано, переключаемся (hop) на следующий канал.
1 |
btle.hopChannel(); |
Поскольку в документации на датчик DHT11 указано, что после считывания значений необходимо сделать задержку на 2 секунды, сделаем эту задержку в программе:
1 |
delay(2000); |
После сборки аппаратной части схемы и загрузки программы в плату Arduino можно законнектить смартфон с нашим радиочастотным модулем, запустить приложение nRF Temp 2.0 for BLE, после чего вы на экране смартфона сможете наблюдать примерно следующую картину.
Более подробно все эти процессы вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* Sending Sensor Data to Nordic BLE android app by CircuitDigest(http://www.circuitdigest.com/) works with nRF24L01. and the works for Nordic's It reads temperature from a DHT11 and sends it via BTLE. Works with Nordic Semiconductor apps such as "nRF Connect for Mobile" and "nRF Temp 2.0 for BLE" Pin Mapping: GND -> GND on the Arduino VCC -> 3.3v on the Arduino CE -> PIN 9 on the Arduino CSN -> PIN 10 on the Arduino SCK -> PIN 13 on the Arduino Uno MOSI -> PIN 11 on the Arduino Uno MISO -> PIN 12 on the Arduino Uno IRQ -> not used */ #include <SPI.h> #include <RF24.h> #include <BTLE.h> #include <DHT.h> // dht11 temperature and humidity sensor library #define DHTPIN 4 // контакт, к которому подключен датчик dht11 #define DHTTYPE DHT11 // select dht type as DHT 11 or DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 radio(9, 10); // CE, CSN BTLE btle(&radio); void setup() { Serial.begin(9600); delay(1000); Serial.print("BLE and DHT Starting... "); Serial.println("Send Temperature Data over BTLE"); dht.begin(); // initialise DHT11 sensor btle.begin("CD Temp"); // 8 chars max (максимум 8 символов) Serial.println("Successfully Started"); } void loop() { float temp = dht.readTemperature(); //считываем данные температуры if (isnan(h) || isnan(t)) { // Check if any reads failed and exit early (to try again). Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print(" Temperature: "); Serial.print(t); Serial.println("°C "); nrf_service_data buf; buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID; buf.value = BTLE::to_nRF_Float(temp); if (!btle.advertise(0x16, &buf, sizeof(buf))) { Serial.println("BTLE advertisement failed..!"); } btle.hopChannel(); delay(2000); } |
скажите пожалуйста а что такое h
у меня понять не может проблема
И для чего меняется канал после каждой передачи? Приёмник по всем каналам слушает, или передатчик так "ищетч приёмник?
Для чего он меняется здесь я точно не знаю, но во многих протоколах и системах связи используется периодическая смена рабочей частоты по заданному закону - это улучшает определенные характеристики системы связи (например, системы связи с ППРЧ). Приемник при каждом скачке частоты знает на какой канал (частоту) перескочит передатчик, поэтому он его не ищет по всему диапазону
Ble имеет три широковещательных канала, называются они - Advertising,
а приемник их слушает
Поэтому он переключается каждый раз на новый канал
Да, спасибо за пояснение. Видимо, вы достаточно плотно работали с технологией Ble
Интересно, а то сейчас приходится с уличных датчиков на nrf24 передавать на гейт, который принимает и передаёт mqtt в home assistant. Тогда как xiaomi mijia термометры напрямую транслируют ble и прекрасно видятся в home asdistant. Вот бы Вашу реализацию приспособить. Правда пока не понятно, что там в HA будет, и как рамшифровывать.
Ну, к сожалению, в такие тонкости я не вникал. Не могу подсказать что то конкретного в данном случае
Очень странно, на rf-nano работает, а на связке ардуино и nrf24 не работает. Хотя nrf24 работает по своему прямому назначению, управлению через библиотеку RF24. Ума не приложу, в чем дело. Кондер электролит 10mf припаян, два модуля nfr24 друг друга видят, управляются релюшки, но имитацией BLE как у вас они не хотят быть
Ну у вас в монитор последовательного порта какие-нибудь сообщения выдаются? По ним же косвенно можно отследить на каком этапе работы программы что то начинает работать неправильно
Возможно разные чипы nrf24l01, есть с подсмотреть а есть без, мне попадались и те и другие
Одна из них не умеет работать на скорости 250 кбит/с
А ble вроде использует эту скорость
С плюсом и без
В сообщении выше у меня ошибка
Да, среди чипов nrf24l01 есть отличающиеся, тут нужно смотреть повнимательнее