Универсальный приемопередатчик работающий в ISM диапазоне (Industrial, Scientific,
Medical), предназначен для построения радиочастотных систем передачи данных в
нелицензированных частотных диапазонах. Приемопередатчики устойчивы к помехам,
высокочувствительны, превосходная стабильность частоты, имеют низкое энергопотребление.
В модуле использована частотная модуляция с минимальной девиацией частоты, а
запатентованная технология ShockBurst повышает помехоустойчивость. Имеется возможность
программной смены чувствительности приемника и мощности передатчика. Управление модулем
выполняется по SPI. Микросхема nRF905 имеет встроенный стабилизатор напряжения питания.
nRF905 не совместим с 5В уровнями логики, поэтому подключение без преобразователя уровней
может вывести модуль из строя.
Технические характеристики
// Передатчик #include <nRF905.h> #include <SPI.h> #define RXADDR {0xFE, 0x4C, 0xA6, 0xE5} // Адрес этого устройства (4 байта) #define TXADDR {0x58, 0x6F, 0x2E, 0x10} // Адрес устройства, которому будем отправлять (4 байта) #define TIMEOUT 1000 // 1 секунда для перерыва между соединениями void setup() { // Инициализация модуля nRF905_init(); // Уставновка адреса (идентификатора) этого устройства byte addr[] = RXADDR; nRF905_setRXAddress(addr); // Перевод в режим получения данных nRF905_receive(); //Связь с компьютером (для отладки) Serial.begin(9600); //Вывод сообщения Serial.println(F("Client started")); } void loop() { // Переменная counter - счетчик // Квалификатор static означает что переменная сохраняет значение между вызовами функции static byte counter; // Создание данных для передачи char data[NRF905_MAX_PAYLOAD] = {0}; sprintf(data, "test %hhu", counter); // Инкремент счетчика counter++; // Запомнить текущее "время" unsigned long startTime = millis(); // Установка адреса для передачи byte addr[] = TXADDR; nRF905_setTXAddress(addr); // Установка данных nRF905_setData(data, sizeof(data)); // Отправить данные (отправить сбой, если происходит другая передача данных, // продалжать попытки пока не появится удачная отправка) while(!nRF905_send()); // Перевести в режим получения данных nRF905_receive(); // Создание буфера для ответа byte buffer[NRF905_MAX_PAYLOAD]; bool success; // Дождаться ответа с задержкой между соединениями unsigned long sendStartTime = millis(); while(1) { success = nRF905_getData(buffer, sizeof(buffer)); if(success)// Получены данные break; // Задержка if(millis() - sendStartTime > TIMEOUT) break; } // Если данные успешно получены, вывести на дисплей (в терминал) if(success) { unsigned int totalTime = millis() - startTime; Serial.print(F("Ping time: ")); Serial.print(totalTime); Serial.println(F("ms")); // Вывод содержимого соединения Serial.print(F("Data from server: ")); Serial.write(buffer, sizeof(buffer)); Serial.println(); } else Serial.println(F("Ping timed out")); delay(1000); }
// Приемник #include <nRF905.h> #include <SPI.h> #define RXADDR {0x58, 0x6F, 0x2E, 0x10} // Адрес этого устройства (4 байта) #define TXADDR {0xFE, 0x4C, 0xA6, 0xE5} // Адрес устройства, которому будем отправлять (4 байта) void setup() { // Инициализация модуля nRF905_init(); // Уставновка адреса (идентификатора) этого устройства byte addr[] = RXADDR; nRF905_setRXAddress(addr); // Перевод в режим получения данных nRF905_receive(); //Связь с компьютером (для отладки) Serial.begin(9600); //Вывод сообщения Serial.println(F("Server started")); } void loop() { Serial.println(F("Waiting for ping...")); // Создание буфера для данных byte buffer[NRF905_MAX_PAYLOAD]; // Ожидание данных while(!nRF905_getData(buffer, sizeof(buffer))); //Произведено соединение Serial.println(F("Got ping")); // Установка адреса для передачи byte addr[] = TXADDR; nRF905_setTXAddress(addr); // Установить основные данные (ответ с полученными данными) nRF905_setData(buffer, sizeof(buffer)); //Сообщение об отправке ответа Serial.println(F("Sending reply...")); // Отправить данные (отправить сбой, если происходит другая передача данных, // продолжать попытки пока не появится удачная отправка) while(!nRF905_send()); // Вернуть в режим получения данных nRF905_receive(); // Сообщение об успешной отправке ответа Serial.println(F("Reply sent")); // Вывести содержание соединения Serial.print(F("Data: ")); Serial.write(buffer, sizeof(buffer)); Serial.println(); }