В данной статье рассмотрим реализацию отправки и получения данных на радио-модулях NRF24l01+ .
Для этой реализации нам понадобится:
nrf24l01+: http://got.by/1mwmlt
Переходники для подключения nrf24l01: http://ali.pub/1mwmq3
arduino uno: http://ali.ski/BHUqd
arduino nano: http://ali.ski/uM_GQ
Контактные провода: http://ali.ski/EEUA3T
Необязательно:
sensor shield : http://ali.ski/dJuhpz
nano shield: http://ali.ski/o97eP
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Существует целая серия радио модулей 2.4 ГГц, которые созданы на базе чипа Nordic Semiconductor nRF24L01+ (более детальная информация на английском языке) Nordic nRF24L01+ включает в себя 2.4 ГГц RF трансивер, логику, которая поддерживает высокоскоростной SPI интерфейс для подключения и обмена данными. Маломощный, с небольшой дальностью действия (200 футов или около того) передатчик для Arduino со встроенной антенной можно приобрести на алиэкспресе
Проблемы с питанием NRF24L01
У многих возникают проблемы при запуске модуля nRF24L01. В основном это связано с тем, что в модуле питания 3.3 В не предусмотрена необходимая сила тока. Решение проблемы следующее:
- Подключите конденсатор на 3.3 или 10 мкФ (микрофарад) напрямую к модулю – от 3.3 В (+) к GND (-). Некоторые рекомендуют использовать 10 мкФ или больше.
- Отдельный источник питания на 3.3 В.
- Использовать совместимый с Arduino YourDuinoRobo1, на котором добавлен регулятор 3.3 В (в этом случае, возможно, стоит добавить конденсатор на 1 мкФ на радиомодуль).
- Старайтесь максимально избегать дополнительных проводов при подключении модуля радиопередатчика.
- Разработать отдельную плату, на которую устанавливается модуль nRF24L01 и добавляются конденсаторы на 1 и 10 мкФ неподалеку от контактов 3.3 В и GND.
Проблемы с питанием возникают при использовании таких микроконтроллеров как, например, Arduino Uno, Nano, Mega, в которых на пины подается всего 50 мА. На некоторых новых модификациях плат делают пины с силой тока до 350 мА. Ну или вы можете отдельно приобрести шилды для увеличения мощности.
Для решения данной проблемы можно воспользоваться переходником.
Подключение nrf24l01:
Из данной схемы видно какой пин nrf24l01 за что отвечает:
Ниже приведена табличка с пинами ардуино к которым подключается nrf24l01:
Сигнал | Контакт на модуле RF | Цвет кабеля | Пин на модуле | Контакт на Arduino (библиотека TMRh20,RF24) | Контакт на Arduino (библиотека RF24) | Контакт на Arduino (библиотека Mirf) | Контакт MEGA2560 (библиотека RF24) | Контакт Arduino (библиотека RH_NRF24 RadioHead) | Контакт MEGA2560 (библиотека RH_NRF24 RadioHead) |
---|---|---|---|---|---|---|---|---|---|
GND | 1 | Коричневый | GND | GND | GND | GND | GND | GND | GND |
VCC | 2 | Красный | VCC | 3.3 V | 3.3V | 3.3V | 3.3V | 3.3V | 3.3V |
CE | 3 | Оранжевый | CE | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg |
CSN | 4 | Желтый | CSN | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg | выбираем в FLProg |
SCK | 5 | Зеленый | SCK | 13 | 13 | 13 | 52 | 13 | 52 |
MOSI | 6 | Синий | MO | 11 | 11 | 11 | 51 | 11 | 51 |
MISO | 7 | Фиолетовый | MI | 12 | 12 | 12 | 50 | 12 | 50 |
IRQ | 8 | Серый | IRQ | – | 2 | Зависит от библиотеки | N/C | N/C |
FLProg:
Для работы в программе нам потребуется скачать блоки: https://yadi.sk/d/k8jx9aVR3KqPLH
В данном примере показана работа с блоками NRF24 Новый v1,0b
Отправка:
Первым делом добавляем блок NRF24_Главный
Описание к данному блоку:
SCK (Serial ClocK) — тактирование (синхронизация). ( Arduino UNO D13 | Arduino Mega D52)
MOSI / MI (Master Out Slave In) — вход данных. ( Arduino UNO D11 | Arduino Mega D51)
MISO / MO (Master In Slave Out) — выход данных. ( Arduino UNO D12 | Arduino Mega D50)
CE/SS – Выбор ведомого на шине SPI из нескольких устройств.
SCN – выбор режима приема/передача , фактически тот же CE.
IRQ – выход прерывания, чаще всего не используется. Необходим для немедленной реакции микроконтроллера при приеме нового пакета данных.
GND – земля, масса, минусовая шина.
Vcc -питание модуля 3.3в. Для надежной работы параллельно питанию как можно ближе к радио модулю рекомендуется подключить электролитический конденсатор не менее 100мкф , а так же керамический на 0.1 мкф.
Блок служит для настройки работы системы передачи данных
!!! Блок должен быть расположен раньше всех остальных из этой серии. Т.е желательно вверху первой платы.
Параметры
Адреса Устройства – Адреса самого трубы (устройства) в сети. Может быть пустым, если устройство не будет передавать данные.
Длинна должна быть равна 5 символам (цифры и буквы латинского алфавита). Вводить в кавычках. Адресов может быть несколько, водить надо через запятую, например: “1Node” , “2Node”
Номер по порядку нужно будет подставлять на вход “address”, блоков отвечающих за передачу данных.
Нумерация адресов начинается с ноля, т.е. запись 4Node” , “6Node” , “7Node” , “9Node” означает: №0 – 4Node” ,№1 – “6Node” ,№3 – “7Node” , №4 -“9Node”
Адреса Прослушки – Адреса других труб (устройств) в сети, сообщения с которых будут приниматься текущем устройствам. Может быть пустым, если устройство не будет принимать данные.
Длинна одного должна быть равна 5 символам (цифры и буквы латинского алфавита). Вводить в кавычках. Адресов может быть от 1 до 5, водить надо через запятую, например: “1Node” , “2Node”
Адреса для прослушки должны иметь один и тот же адрес, кроме первого байта (символа), например: “1Node” , “2Node” , “3Node” , “4Node”
Повторы – Количество повторный отправок до отказа.
Входы
ChanneNRF24 – Номер канала:0-125 Нулевой канал начинается с 2400мгц и далее с шагом 1 мгц, например 70 канал находится соответственно на 2470мгц. При установке скорости 2мгц занимается ширина двух каналов. Не подключенный вход означает 0 канал.
LevelNRF24 – Мощность передатчика: 0- RF24_PA_MIN, 1-RF24_PA_LOW, 2-RF24_PA_HIGH, 3- RF24_PA_MAX соответственно NRF24L01: -18dBm, -12dBm, -6dBM и 0dBm SI24R1: -6dBm, 0dBm, 3dBM и 7dBm. Не подключенный вход означает минимальную мощность.
Входы ChanneNRF24 и LevelNRF24 обрабатываются только один раз при старте программы. Подразумевается использование их совместно с EEPROM или блоком меню. То есть, изменил значение в памяти, перезапустил контроллер и вступают в силу новые настройки.
PauseNRF24 – пауза между отправками данных, в мс. Используется для задержки отправки следующего пакета данных.
Не подключенный вход означает 10мс.
Выхода
NRF24_dataObtained – Поступили новые данные. Добавил выход для возможности отключения плат на которых идет обработка новых данных.
rxFifoFull – Переполнение приемного буфера nRF24L01+. Означает, что высока вероятность потери части данных.
!!! Необходимо принять меры. !!!
Возможно, требуется оптимизировать программу текущего контроллера. Или можно увеличить интервалы отправки на передающих.
Если на передающем больше одного блока передачи данных, то надо увеличит значение входа PauseNRF24 блока NRF24_Главный на передающем устройстве.
Далее, так как мы будем брать значение с датчика температуры, данные будут приходить с плавающей запятой, тоесть FLOAT. Поэтому нужно будет добавить блок NRF24_FLOAT
Описание к данному блоку:
Работает только совместно с блоками NRF24_Главный
В проекте должен быть один и только если используется хотя бы один NRF24_Отправка_FLOAT и/или NRF24_Прием_FLOAT
Был сделан для оптимизации расхода ОЗУ контроллера
Далее добавляем блок NRF24_отправка_FLOAT также добавляем Генератор и блок температуры BME280
Описание для блока NRF24_отправка_FLOAT:
Работает только совместно с блоками NRF24_Главный и NRF24_FLOAT (по одному)
Блок служит для отправки строки от одной nRF24L01+ к другой.
В проект может быть использовано несколько таких блоков, но для корректной работы message_ID должен быть уникальным в рамках всей сети
!!! Для корректной работы необходимо в настройках блок NRF24_Главный в параметре “Адрес Устройства” должен быть хотя бы один адрес.
Входы
Send – Послать данные. По переднему фронту отсылает данные по каналу связи.
IN_1-IN_7- числа отправляемые.
message_ID -(0-255) – идентификатор пакета данных, для правильной работы должен совпадать с message_ID блока NRF24_Прием_FLOAT на принимающей стороне.
И быть уникальным в рамках всей сети.
address – адрес под которым будет передан данные набор данных. Необходимо водить номер по порядку в параметре “Адрес Устройства” блока NRF24_Главный
Не подключенные вход – означает №0. Подробнее про адресацию в описании главного блока.
Выходы
received – подтверждение получения пакета данных адресатом. Одиночный импульс. Если в сети больше одной трубки с одинаковыми адресами, сигнал становится не достоверным.
Сигнал говорит только о том, принимающий модуль nRF24L01+, получил этот пакет данных, но не означает, что контроллер его считал и обработал. Если на стороне приемника на выходе rxFifoFull блока NRF24_Главный появляется 1 или тем более постоянно там есть, то высока вероятность потери данных.
В блоке BME280 ничего менять не нужно, в нем уже вписан верный адрес датчика по шине i2c
А вот Блок G-AM это генератор, инвертируем вход данного блока, а настройки данного блока делаем такими:
ссылка на блоксхемы передатчика: https://yadi.sk/d/fi_ziYOx3KqRQx
#include "RF24.h" #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <SPI.h> byte ChanneNRF24; byte LevelNRF24; int PauseNRF24; bool NRF24_dataObtained; bool rxFifoFull; byte NRF24_addresWrit[][6] = { "1Node" }; //Адреса передачи byte NRF24_addresRead[][6] = { }; // адреса прослушки RF24 radio( 9 , 10 ); bool RF24Setup=1; //флаг начальной настройки byte RF24_Buffer[32] ; byte RF24_type_mess; // тип блока byte RF24_ID; // идентификатор набора данных bool NRF24freelyToSend; // можно отправлять данные byte currentAddress=250; //текущей адрес отправления unsigned long NRF24_started; bool NRF24Flag; // можно отправлять данные struct NRF24_float{ byte type; // тип блока byte Nomer; // счетчик ошибок float Data[7]; //строка для передачи }; NRF24_float NRF24_Data_FLOAT; bool Send_215636123_1; float IN_1_215636123_1; float IN_2_215636123_1; float IN_3_215636123_1; float IN_4_215636123_1; float IN_5_215636123_1; float IN_6_215636123_1; float IN_7_215636123_1; byte message_ID_215636123_1; byte address_215636123_1; bool received_215636123_1; bool _trgrt1_215636123_1= 0; bool transmit_215636123_1=0; float Temperature_168723051_1; float Pressure_168723051_1; float Altitude_168723051_1; float Humidity_168723051_1; #define BME_SCK_168723051_1 13 #define BME_MISO_168723051_1 12 #define BME_MOSI_168723051_1 11 #define BME_CS_168723051_1 10 #define SEALEVELPRESSURE_HPA_168723051_1 (1013.25) Adafruit_BME280 bme_168723051_1; // I2C bool _gen1I = 0; bool _gen1O = 0; unsigned long _gen1P = 0UL; void setup() { if (!bme_168723051_1.begin()) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } } void loop() { ChanneNRF24 = 90; LevelNRF24 = 2; PauseNRF24 = 0; //начало первичной настройки if ( RF24Setup ) { radio.begin(); delay(2); radio.setChannel( ChanneNRF24 ); // канал (0-125) // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBM, RF24_PA_MAX=0 switch ( LevelNRF24 ) { case 0: radio.setPALevel( RF24_PA_MIN); break; case 1: radio.setPALevel( RF24_PA_LOW); break; case 2: radio.setPALevel( RF24_PA_HIGH); break; case 3: radio.setPALevel( RF24_PA_MAX); break; } int NRF24_i= 0; while ( NRF24_i < ( (sizeof NRF24_addresRead)/(sizeof NRF24_addresRead[0])) ) { #ifdef NRF24_DEBUG // Serial.print( "Address to listen: "); Serial.println((char*)NRF24_addresRead[NRF24_i]);//test #endif radio.openReadingPipe(NRF24_i+1,NRF24_addresRead[NRF24_i]); ++NRF24_i; } radio.startListening(); RF24Setup =0; } //Конец первичной настройки if(radio.rxFifoFull()) rxFifoFull =1; else rxFifoFull =0; if (radio.available()) { radio.read( &RF24_Buffer , sizeof( RF24_Buffer ) ); #ifdef NRF24_DEBUG // Serial.println( "The data: "); Serial.println((char*)RF24_Buffer);//test #endif RF24_type_mess =RF24_Buffer[0]; RF24_ID =RF24_Buffer[1]; NRF24_dataObtained =1; NRF24freelyToSend=0; } else { NRF24_dataObtained =0; if ( PauseNRF24 ==0) PauseNRF24 =10; //ограничение минимальной задержки. if(millis()-NRF24_started > PauseNRF24 )NRF24freelyToSend=1; } if (!(0)) {if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0; } if (_gen1I ) { if (_gen1O) { if ( _isTimer( _gen1P , 1 )) { _gen1P = millis(); _gen1O = 0; } } else { if ( _isTimer( _gen1P , 3000 )) { _gen1P = millis(); _gen1O = 1; } } } Send_215636123_1 = _gen1O; IN_1_215636123_1 = Temperature_168723051_1; IN_2_215636123_1 = 0; IN_3_215636123_1 = 0; IN_4_215636123_1 = 0; IN_5_215636123_1 = 0; IN_6_215636123_1 = 0; IN_7_215636123_1 = 0; message_ID_215636123_1 = 10; address_215636123_1 = 0; if ( Send_215636123_1) { if (!_trgrt1_215636123_1) {transmit_215636123_1=1; _trgrt1_215636123_1 = 1;} } else { _trgrt1_215636123_1 = 0;}; received_215636123_1=0; if (transmit_215636123_1 && NRF24freelyToSend) { NRF24_Data_FLOAT.type=7; // 7 - float NRF24_Data_FLOAT.Nomer= message_ID_215636123_1; NRF24_Data_FLOAT.Data[0]= IN_1_215636123_1 ; NRF24_Data_FLOAT.Data[1]= IN_2_215636123_1 ; NRF24_Data_FLOAT.Data[2]= IN_3_215636123_1 ; NRF24_Data_FLOAT.Data[3]= IN_4_215636123_1 ; NRF24_Data_FLOAT.Data[4]= IN_5_215636123_1 ; NRF24_Data_FLOAT.Data[5]= IN_6_215636123_1 ; NRF24_Data_FLOAT.Data[6]= IN_7_215636123_1 ; #ifdef NRF24_DEBUG // Serial.print ( message_ID_215636123_1 ); Serial.println( " - ID, sending data: "); for (int i=0; i <= 6; i++){ Serial.println(NRF24_Data_FLOAT.Data[i]); } #endif received_215636123_1 =RF24_write(&NRF24_Data_FLOAT, address_215636123_1, &transmit_215636123_1); //функция в главном блоке } Temperature_168723051_1 = bme_168723051_1.readTemperature(); Pressure_168723051_1 = bme_168723051_1.readPressure() / 100.0F * 0.7500; Altitude_168723051_1 = bme_168723051_1.readAltitude(SEALEVELPRESSURE_HPA_168723051_1); Humidity_168723051_1 = bme_168723051_1.readHumidity(); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } bool RF24_write(const void* buf, byte addressCode, bool *transmit) { static byte attemptCounter [((sizeof NRF24_addresWrit)/(sizeof NRF24_addresWrit[0]))]; radio.stopListening(); // остановить слушать if (currentAddress!=addressCode) //Если новый адрес { radio.openWritingPipe( NRF24_addresWrit[ addressCode ] ); // назначить новый currentAddress=addressCode; } bool received =radio.write( buf, 32 ); // отправить radio.startListening(); // возобносить слушать #ifdef NRF24_DEBUG Serial.print( "Number of attempts: "); Serial.println(attemptCounter[addressCode]); if (received) Serial.println("OK"); #endif if (received) {*transmit=0; attemptCounter[addressCode]=0;} else { if (attemptCounter[addressCode]> 3 ){ attemptCounter[addressCode]=0; *transmit=0;} else {attemptCounter[addressCode]=attemptCounter[addressCode]+1; } } NRF24_started = millis(); NRF24freelyToSend=0; //Закоментировать если надо отправлять все данные в один программный цикл return received; }
На этом настройка отправки закончена, давайте теперь приступим к приему:
Также добавляем блок NRF24_Главный:
Далее добавляем блок NRF24_FLOAT:
Далее добавляем блок NRF24_прием_FLOAT, конвертацию строк SConv и дисплей на чипе HD44780:
Описание к блоку NRF24_прием_FLOAT:
Работает только совместно с блоками NRF24_Главный и NRF24_FLOAT (по одному)
Блок служит для приема Int от одной nRF24L01+ к другой.
В проект может быть использовано несколько таких блоков, но для корректной работы message_ID должен быть уникальным в рамках всей сети
Входы
message_ID -(0-255) – идентификатор пакета данных, для правильной работы должен совпадать с message_ID блока NRF24_Прием_строки на принимающей стороне.
И быть уникальным в рамках всей сети.
Выходы
OUT_1 – OUT_7 – числа с данными.
New – сообщение о том, что данные на выходах OUT_1 – OUT_7 обновились. Одиночный импульс.
Настройки дисплея на чипе HD44780:
Ссылка на блоксхему приемника: https://yadi.sk/d/0JQbrsqq3KqSgD
#include <Wire.h> #include "RF24.h" #include <LiquidCrystal_I2C.h> #include <SPI.h> LiquidCrystal_I2C _lcd1(0x27, 16, 2); int _dispTempLength1=0; boolean _isNeedClearDisp1; byte ChanneNRF24; byte LevelNRF24; int PauseNRF24; bool NRF24_dataObtained; bool rxFifoFull; byte NRF24_addresWrit[][6] = { }; //Адреса передачи byte NRF24_addresRead[][6] = { "1Node" }; // адреса прослушки RF24 radio( 9 , 10 ); bool RF24Setup=1; //флаг начальной настройки byte RF24_Buffer[32] ; byte RF24_type_mess; // тип блока byte RF24_ID; // идентификатор набора данных bool NRF24freelyToSend; // можно отправлять данные byte currentAddress=250; //текущей адрес отправления unsigned long NRF24_started; bool NRF24Flag; // можно отправлять данные struct NRF24_float{ byte type; // тип блока byte Nomer; // счетчик ошибок float Data[7]; //строка для передачи }; NRF24_float NRF24_Data_FLOAT; byte message_ID_213763688_1; bool New_213763688_1; float OUT_1_213763688_1; float OUT_2_213763688_1; float OUT_3_213763688_1; float OUT_4_213763688_1; float OUT_5_213763688_1; float OUT_6_213763688_1; float OUT_7_213763688_1; bool _trgrt1_213763688_1= 0; bool transmit_213763688_1=0; int _disp1oldLength = 0; void setup() { Wire.begin(); _lcd1.init(); _lcd1.backlight(); } void loop() {if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;} ChanneNRF24 = 90; LevelNRF24 = 2; PauseNRF24 = 0; //начало первичной настройки if ( RF24Setup ) { radio.begin(); delay(2); radio.setChannel( ChanneNRF24 ); // канал (0-125) // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBM, RF24_PA_MAX=0 switch ( LevelNRF24 ) { case 0: radio.setPALevel( RF24_PA_MIN); break; case 1: radio.setPALevel( RF24_PA_LOW); break; case 2: radio.setPALevel( RF24_PA_HIGH); break; case 3: radio.setPALevel( RF24_PA_MAX); break; } int NRF24_i= 0; while ( NRF24_i < ( (sizeof NRF24_addresRead)/(sizeof NRF24_addresRead[0])) ) { #ifdef NRF24_DEBUG // Serial.print( "Address to listen: "); Serial.println((char*)NRF24_addresRead[NRF24_i]);//test #endif radio.openReadingPipe(NRF24_i+1,NRF24_addresRead[NRF24_i]); ++NRF24_i; } radio.startListening(); RF24Setup =0; } //Конец первичной настройки if(radio.rxFifoFull()) rxFifoFull =1; else rxFifoFull =0; if (radio.available()) { radio.read( &RF24_Buffer , sizeof( RF24_Buffer ) ); #ifdef NRF24_DEBUG // Serial.println( "The data: "); Serial.println((char*)RF24_Buffer);//test #endif RF24_type_mess =RF24_Buffer[0]; RF24_ID =RF24_Buffer[1]; NRF24_dataObtained =1; NRF24freelyToSend=0; } else { NRF24_dataObtained =0; if ( PauseNRF24 ==0) PauseNRF24 =10; //ограничение минимальной задержки. if(millis()-NRF24_started > PauseNRF24 )NRF24freelyToSend=1; } message_ID_213763688_1 = 10; New_213763688_1 =0; if (NRF24_dataObtained ) { if(RF24_type_mess==7) // 7 строка { if (RF24_ID== message_ID_213763688_1 ) { memcpy( &NRF24_Data_FLOAT, RF24_Buffer , 32); OUT_1_213763688_1 =NRF24_Data_FLOAT.Data[0]; OUT_2_213763688_1 =NRF24_Data_FLOAT.Data[1]; OUT_3_213763688_1 =NRF24_Data_FLOAT.Data[2]; OUT_4_213763688_1 =NRF24_Data_FLOAT.Data[3]; OUT_5_213763688_1 =NRF24_Data_FLOAT.Data[4]; OUT_6_213763688_1 =NRF24_Data_FLOAT.Data[5]; OUT_7_213763688_1 =NRF24_Data_FLOAT.Data[6]; New_213763688_1 =1; #ifdef NRF24_DEBUG // Serial.print ( message_ID_213763688_1 ); Serial.print( " - ID, sending data: "); for (int i=0; i <= 6; i++){ Serial.println(NRF24_Data_FLOAT.Data[i]); } #endif } } } if (1) { _dispTempLength1 = ((( _floatToStringWitRaz(OUT_1_213763688_1,2)))).length(); if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1)/2), 0); _lcd1.print((( _floatToStringWitRaz(OUT_1_213763688_1,2)))); } else { if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} } } String _floatToStringWitRaz(float value, int raz) { return String(value,raz); } bool RF24_write(const void* buf, byte addressCode, bool *transmit) { static byte attemptCounter [((sizeof NRF24_addresWrit)/(sizeof NRF24_addresWrit[0]))]; radio.stopListening(); // остановить слушать if (currentAddress!=addressCode) //Если новый адрес { radio.openWritingPipe( NRF24_addresWrit[ addressCode ] ); // назначить новый currentAddress=addressCode; } bool received =radio.write( buf, 32 ); // отправить radio.startListening(); // возобносить слушать #ifdef NRF24_DEBUG Serial.print( "Number of attempts: "); Serial.println(attemptCounter[addressCode]); if (received) Serial.println("OK"); #endif if (received) {*transmit=0; attemptCounter[addressCode]=0;} else { if (attemptCounter[addressCode]> 3 ){ attemptCounter[addressCode]=0; *transmit=0;} else {attemptCounter[addressCode]=attemptCounter[addressCode]+1; } } NRF24_started = millis(); NRF24freelyToSend=0; //Закоментировать если надо отправлять все данные в один программный цикл return received; }
На этом данный пример закончен. Подробности в Видео: