СОДЕРЖАНИЕ ►
Подключение модуля nRF24L01 к Arduino позволит сделать беспроводную связь между микроконтроллерами на расстоянии до 30 метров. Рассмотрим, как наладить связь между двумя Ардуино по радиоканалу, чтобы передать данные с аналогового датчика утечки воды и цифрового датчика температуры и влажности DHT11. В первом случае будет передаваться один тип данных, во втором случае два сразу показателя.
Характеристики nRF24L01, nRF24L01+PA+LNA Arduino
nRF24L01 один из самых популярных беспроводных модулей для интернета вещей (IoT). Модули стоят недорого, но на их основе можно организовать многоканальную защищенную связь между контроллерами Ардуино и устройствами. Один модуль способен поддерживать связь сразу с шестью приемниками или передатчиками, т.е. можно объединить сразу семь устройств в общую радиосеть на частоте 2,4 ГГц.
Дальность действия модуля сравнима с блютуз модулем HC-05/06, но с помощью nRF24L01 можно создать многоканальную связь. Т.е. можно объединить в общую сеть до 7 устройств, которые могут одновременно принимать и отправлять сигнал. Для начала мы будем передавать данные с датчика воды, но можно использовать и любой другой аналоговый датчик, например датчик температуры на основе LM35.
Распиновка радио модуля nRF24L01+

На плате nRF24L01 встроен демодулятор, синтезатор частот и усилитель сигнала. Дальность действия модуля Arduino nRF24L01+ до 30 метров, а в версии с усилителем и антенной до 1000 метров в прямой видимости. Модуль может использовать 127 каналов связи, отличающихся частотой сигнала — от 2,4 ГГц до 2,483 ГГц. Скорость беспроводного соединения можно настраивать: 250kbps, 1Mbps или 2Mbps.
Кроме сложной схемы подключения nrf24l01 к Arduino NANO и MEGA2560, плата требовательна к питанию (так утверждается на многих форумах и сайтах). Поэтому необходимо припаять к портам питания модуля (GND и VCC) конденсатор до 10мкФ — это снизит помехи. Если вы несколько раз проверили подключение и загрузили скетч с этой страницы, но модуль отказывается работать — то все дело в питании.

Как подключить nRF24L01 к Ардуино Uno
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- 2 модуля nrf24l01, nrf24l01+pa+lna;
- датчик уровня воды;
- цифровой датчик DHT11;
- провода «папа-мама», «папа-папа».

Выполнить передачу данных между Arduino по радиоканалу будет намного проще, если у вас плата подключена к отдельному компьютеру или ноутбуку. Тогда сделать отладку скетча будет намного проще и быстрее. До передачи данных по радиоканалу через nRF24L01+, лучше всего проверить каждый модуль скетчем для сканирования — тогда вы будете уверены в правильности подключения и работоспособности модулей.
Скетч для сканирования частот nRF24L01
#include "SPI.h" // библиотека для обмена данными по протоколу SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); const uint8_t num_channels = 128; uint8_t values[num_channels]; int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); } void setup(void) { Serial.begin(9600); printf_begin(); radio.begin(); radio.setAutoAck(false); radio.startListening(); // включаем прием сигнала radio.printDetails(); // если правильно соединили, то увидите настройки модуля delay(10000); // задержка на 10 секунд radio.stopListening(); // выключаем прием сигнала int i = 0; // вывод заголовков всех 127 каналов while ( i < num_channels ) { printf("%x",i>>4); ++i; } printf("\n\r"); i = 0; while ( i < num_channels ) { printf("%x",i&0xf); ++i; } printf("\n\r"); } const int num_reps = 100; void loop(void) { memset(values, 0, sizeof(values)); int rep_counter = num_reps; while (rep_counter--) { int i = num_channels; while (i--) { radio.setChannel(i); radio.startListening(); // включаем прием сигнала delayMicroseconds(128); radio.stopListening(); // выключаем прием сигнала if ( radio.testCarrier() ) ++values[i]; } } int i = 0; while ( i < num_channels ) { printf("%x", min(0xf, values[i] & 0xf)); ++i; } printf("\n\r"); }
Пояснения к коду:
- программа выводит на последовательный порт информацию о модуле nRF24L01+ или радиомодуле nRF24L01+pa+lna Arduino;
- далее выводится информация о всех частотах на которых работает модуль и информацию об их загруженности, выбирайте частоту для работы без помех;
Если скетч успешно загрузился, но вы не видите похожую информацию на мониторе порта, то еще раз проверьте соединение платы с микроконтроллером. Через 10 секунд после получения информации о характеристиках nRF24L01+ (тка24д01) вы получите информацию о помехах на всех 127 каналах связи. Первые две строчки — это имена каналов, состоящие из двух символов на первой и второй строке.

Скетч. nRF24L01 передача данных с датчика воды

Модуль работает по интерфейсу SPI, соответственно подключать модуль nRF24L01 следует к определенным портам микроконтроллера (не забывайте, что у Arduino Mega интерфейс SPI находится на других портах). Одну плату нужно настроить, как приемник сигнала (receiver), а второй микроконтроллер, как передатчик (transmitter). После подключения беспроводных модулей к микроконтроллеру, загрузите скетч.
Скетч для передатчика.
#include "SPI.h" // библиотека для протокола SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); void setup() { pinMode(A0,INPUT); // порт для датчика воды Serial.begin(9600); // запускаем последовательный порт radio.begin(); // включаем радио модуль radio.setChannel(0); // выбираем канал (от 0 до 127) // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS radio.setDataRate(RF24_1MBPS); // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу radio.stopListening(); } void loop() { int data = analogRead(A0); // читаем значение с датчика radio.write(&data, sizeof(data)); // отправляем данные и указываем байты Serial.print("data: "); Serial.println(data); // выводим данные на монитор порта delay(1000); }
Скетч для приемника.
#include "SPI.h" // библиотека для протокола SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); void setup() { Serial.begin(9600); // запускаем последовательный порт radio.begin(); // включаем радио модуль radio.setChannel(0); // выбираем канал (от 0 до 127) // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS radio.setDataRate(RF24_1MBPS); // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1, pipe); // открываем первую трубу radio.startListening(); // начинаем слушать трубу } void loop() { int data; if (radio.available()) // проверяем буфер обмена { radio.read(&data, sizeof(data)); // читаем данные Serial.print("data: "); Serial.println(data); // выводим данные на монитор порта } }
Пояснения к коду:
- порты 9 и 10 для подключения nRF24L01 можно поменять, как и канал связи;
- данные с аналогового порта A0 отправляются на аппаратный последовательный порт и от передатчика по радио каналу 1 раз в секунду;
- если данные с приемника не выводятся на мониторе порта, то первым делом проверьте правильность подключения передатчика.
Скетч. nRF24L01 передача данных с цифрового датчика

Скетч для передатчика.
#include "SPI.h" // библиотека для протокола SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля #include "DHT.h" // библиотека для датчика DHT11 const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); DHT dht(2, DHT11); // сообщаем на каком порту будет датчик void setup() { dht.begin(); // включаем датчик DHT11 Serial.begin(9600); // включаем последовательный порт radio.begin(); // включаем радио модуль radio.setChannel(0); // выбираем канал (от 0 до 127) delay(2); radio.setChannel(0); // устанавливаем канал (0-127) radio.setDataRate(RF24_1MBPS); // скорость передачи данных radio.setPALevel(RF24_PA_HIGH); // мощность передатчика radio.openWritingPipe(pipe); // открываем трубу на передачу radio.stopListening(); // останавливаем прослушку } void loop() { float data[2]; data[0] = dht.readHumidity(); // заполняем массив data[1] = dht.readTemperature(); // заполняем массив radio.write(&data, sizeof(data)); // отправляем данные по радиосигналу Serial.print("Humidity: "); Serial.println(data[0]); // выводим данные влажности Serial.print("Temperat: "); Serial.println(data[1]); // выводим данные температуры Serial.println("-"); delay(1000); }
Скетч для приемника.
#include "SPI.h" // библиотека для протокола SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); void setup() { Serial.begin(9600); // включаем последовательный порт radio.begin(); // включаем радио модуль radio.setChannel(0); // выбираем канал (от 0 до 127) delay(2); radio.setChannel(0); // устанавливаем канал (0-127) radio.setDataRate(RF24_1MBPS); // скорость передачи данных radio.setPALevel(RF24_PA_HIGH); // мощность передатчика radio.openReadingPipe(1, pipe); // открываем первую трубу radio.startListening(); // начинаем слушать трубу } void loop() { float data[2]; if (radio.available()) // проверяем буфер обмена { radio.read(&data, sizeof(data)); // читаем данные Serial.print("Humidity: "); Serial.println(data[0]); // выводим данные влажности Serial.print("Temperat: "); Serial.println(data[1]); // выводим данные температуры Serial.println("-"); delay(500); } }
Пояснения к коду:
- порты 9 и 10 для подключения nRF24L01 можно поменять, как и канал связи;
- данные с датчика температуры и влажности DHT11 отправляются на аппаратный последовательный порт и по радио каналу 1 раз в секунду;
- если данные с приемника не выводятся на мониторе порта, то первым делом проверьте правильность подключения передатчика тка24д01.










Код не рабочий, автор функции openWritingPipe указал и в приемнике и в передатчике. Верно указать в приемнике openReadingPipe и не stopListening, а startListening. Передатчик вроде работает верно. Брал пример для аналогового датчика
Спасибо. Исправили скетч
В скетче почему-то num_channels указано 128 — это 129 получается, если первый канал 0. У вас индусы код пишут что-ли? Если каналов 127, надо писать 127, а в цикле ставить не i<num_channels, а i<=num_channels. Такой код понятнее и более очевидны нюансы
Условия i < 128 и i <= 127 работают одинаково, душнила
Добрый день, собрал, как указано на схеме, передатчик тка24д01 работает, данные в Монитор порта загружаются, однако в приемник данные не поступают, Подскажите, пожалуйста, в чем может быть дело
Причин может быть очень много. Конденсаторы к радио модулям припаяны? Питание Ардуино идет от ПК или от аккумулятора?
Конденсаторы не припаяны, питание от ПК, на приемнике вообще никакая информация не выводится, даже текстовая.
Совместимость микроконтроллеров приемника и передатчика должны быть одинаковыми например AT mega 328p и ниже строчка PU или TH тип микроконтроллера. Проверь этот вариант .
Где взять идентификатор?
Здравствуйте. Идентификатор радио канала, вы задаете сами в скетче.
подскажите пожалуйста! как подключить двигатели, через джойстик?
В одном комментарии это не объяснить, надо отдельную страницу делать с проектом. Попробую в ближайшее время заняться этим проектом.
Подскажите пожалуйста. Как я понял Ардуино считывает все данные, которые пришли по радиосигналу командой radio.read(&data, sizeof(data)); Не будет ли путаницы при обработке данных? Спасибо.
а если разные названия то может не работать ?