Программа

Для организации передачи данных будем использовать сразу две библиотеки. Первая — RF24, необходима для работы с модулем nRF24L01 по интерфейсу SPI. Вторая — SerialFlow, служит для пакетной передачи данных.

Для проверки работоспособности радиотракта будем передавать текущее значение таймера, с одного модуля на другой.

#include <SerialFlow.h>

SerialFlow rd(7,8);

const unsigned long data_to = 100; 
unsigned long tm, data_next;

void setup(void){
    rd.setPacketFormat(2, 1);
    rd.begin(0xF0F0F0F0E1LL,0xF0F0F0F0D2LL);
}

void loop(void){
    tm = millis();
    if( tm > data_next ){
        data_next = tm + data_to;
        rd.setPacketValue( tm );
        rd.sendPacket();
    }
}

Разберем программу по шагам. Первое, что мы делаем — это создаём объект класса SerialFlow:

SerialFlow rd(7,8);

7 и 8 — это номера выводов Ардуино, к которым подключены контакты радиомодуля CN и CSN.

В функции setup мы настраиваем формат передаваемых пакетов:

rd.setPacketFormat(2, 1);

Здесь первый аргумент — это размер передаваемых чисел. Помним, что число в диапазоне от 0 до 255 занимает 1 байт, а число от 0 до 65535 — 2 байта. Если мы будем в пакете передавать количество миллисекунд с начала запуска системы, то 2-х байтного числа нам хватит на 65 минут, что соответствует одному часу (вполне хватит для теста). После этого число переполнится и отсчет таймера сбросится. Второй аргумент этой функции отвечает за количество чисел в пакете. Нам будет достаточно одного числа, так сто ставим 1.

Теперь настроим передатчик. Первый аргумент — это адрес передатчика (модуль №1). Второй — адрес приёмника (модуль №2).

rd.begin(0xF0F0F0F0E1LL,0xF0F0F0F0D2LL);

Наконец, в цикле loop каждые 100 миллисекунд происходит отправка пакета. Здесь используется алгоритм выполнения по таймеру, который мы рассмотрели в одном из уроков. Переходим к приёмнику.

Приёмник

От приемника требуется принимать пакеты и каким-то образом сигнализировать нам об этом. Полученные данные будем отправлять через последовательный порт в монитор последовательного порта Arduino IDE.

#include <SerialFlow.h>

SerialFlow rd(7,8);

void setup(void){
    Serial.begin(57600);
    rd.setPacketFormat(2, 1);
    rd.begin(0xF0F0F0F0D2LL,0xF0F0F0F0E1LL);
}

void loop(void){
    unsigned int v;
    if( rd.receivePacket() ){
        v = rd.getPacketValue(0);
        Serial.println(v);
    }
}

Здесь мы точно так же создаем объект SerialFlow с аргументами 7 и 8. Затем настраиваем параметры пакета. А в строчке:

rd.begin(0xF0F0F0F0D2LL,0xF0F0F0F0E1LL);

первым параметром указываем адрес модуля №2, а вторым — адрес модуля №1.

Загружаем программу на оба контроллера и открываем на приемнике монитор последовательного порта. Если все было сделано правильно, то каждые 100 миллисекунд в окне должны появляться значения таймера на передатчике.


Изменено: