Подключение к ардуине
Arduino Nano, UNO
SCK — D13
MOSI — D11
MISO — D12
CSN — D10
CE/SS — D9
Arduino MEGA
SCK — D52
MOSI — D51
MISO — D50
CSN — D53
CE/SS — D49
Для СЕ и CSN можно использовать любые пины (меняется в скетче RF24 radio(9,10);).
http://nnov.3dn.ru/misc/arhs/RF24.zip
функция, которая каждую секунду смотрит, не отрублено ли питание. В библиотеке сделайте публичной функцию get_status(). Вообщем работает эта хрень и код работает параллельно. Можно выставить частоту опроса. Если модуль отключился, а потом включился,поднимаем его функцией powerUP() и устанавливаем опять настройки. По питанию определился, меня это устраивает, дальше буду обрабатывать передачу radio.write(&svalue,sizeof(svalue)); Так как код тоже зависает если не может передать.
Код (Text):
//-------------------------------------------------------------------------------------------------
//Подключение библиотек
//-------------------------------------------------------------------------------------------------
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
//---------------------------------------------------------------------------------------------------------------
//Константы для обработки беспроводных датчиков
//---------------------------------------------------------------------------------------------------------------
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t NRF = 0xE8E8F0F0E1LL;
const uint64_t NRF1 = 0xE8E8F0F0A2LL;
//Выставляем пины на модель NRF2401+
RF24 radio(CE_PIN, CSN_PIN);
//-------------------------------------------------------------------------------------------------
//Переменные программы
//-------------------------------------------------------------------------------------------------
unsigned long MessageNRF; //Сообщение на прием / передачу
int SensorCounter=0; //Счетчик прохода позиций
int NRFOnlineStatus; //Статус модуля
//Если радио включено значение переменной true
boolean NRFOnlineValue=false;
//Счетчики
unsigned long NRFOnlineCounter=0; //Счетчик времени в OffLine (NRFOnlineDelay)
unsigned long NRFOnlineTimer=millis(); //Таймер проверки питания
unsigned long NRFOnlineDelay=1000; //Задержка проверки в миллисекундах
unsigned long UpdateSensorTimer=millis();
unsigned long UpdateSensorDelay=100;
//-------------------------------------------------------------------------------------------------
//Функция инициализации NRF
//-------------------------------------------------------------------------------------------------
void StartRadio(void)
{
radio.begin();
delay(2000);
radio.setChannel(2);
radio.setRetries(10,10);
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.openReadingPipe(1,NRF1);
radio.setPayloadSize(32);
radio.startListening();
radio.powerUP();
NRFOnlineStatus=radio.get_status(); //Стату NRF модуля при старте
}
//---------------------------------------------------------------------------------------------
//Функция проверки Radio (Online)
//---------------------------------------------------------------------------------------------
void RadioOnline(void)
{
if(millis() - NRFOnlineTimer > NRFOnlineDelay)
{
NRFOnlineTimer=millis();
//Получаем текущее состояние
int CurrentStatus=radio.get_status(); //Текущее состояние модуля
//Если текущее состояниеравно предыдущем то
if (CurrentStatus==NRFOnlineStatus)
{
//Когда остановится счетчик на проверку то поднимаем радио заново
if (NRFOnlineCounter>1)
{
radio.powerUp();
StartRadio();
NRFOnlineCounter=0;
}
NRFOnlineValue=true;
}
else
{
NRFOnlineValue=false;
NRFOnlineCounter++;
}
}
}
//---------------------------------------------------------------------------------------------
//Функция отправки команды передатчику
//---------------------------------------------------------------------------------------------
void send_answer(unsigned long svalue,uint64_t p)
{
radio.stopListening(); //Перестаем слушать
radio.openWritingPipe(p); //Открывем трубу для отправки
radio.flush_tx();
radio.write(&svalue,sizeof(svalue)); // Отправляем ответ
radio.startListening();
}
//-------------------------------------------------------------------------------------------------
//Функция обработки сенсора для других устройств
//-------------------------------------------------------------------------------------------------
void UpdateSensor()
{
if(millis() - UpdateSensorTimer > UpdateSensorDelay)
{
SensorCounter++;
UpdateSensorTimer = millis();
}
if(SensorCounter > 10)
{
SensorCounter=0;
if (NRFOnlineValue)
{
send_answer(100,NRF);
}
}
}
//-------------------------------------------------------------------------------------------------
//Функция прослушки радиоканала
//-------------------------------------------------------------------------------------------------
void RadioRead(void)
{
if (radio.available())
{
radio.read(&MessageNRF,sizeof(MessageNRF));
Serial.println(MessageNRF);
}
}
//-------------------------------------------------------------------------------------------------
//Установки Arduino
//-------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(57600);
StartRadio();
}
void loop()
{
UpdateSensor();
RadioOnline(); //Проверка радио на отключение питания
//Если есть питание на модуле, то слушаем Radio
if (NRFOnlineValue) { RadioRead(); }
}
|