Вопрос по NRF24L01

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Приемник и передатчик домашней метеостанции жена заставила связать посредством NRF24L01. Собрал тестовые передатчик и приемник с минимум кода.
Работает, но как-то странно.

Код передатчика:

// Библиотеки для работы с радиомодулем NRF24L01
#include <SPI.h>;
#include <nRF24L01.h>;
#include <RF24.h>;

// Переменные хранят считанную с датчиков температуру
float _tempD1;
float _tempD2;
float _tempMid;

// Переменные хранят данные освещенности, считанные с аналоговых входов A0 и A1
int _photoSens1;
int _photoSens2;

void fnReadLux(void)
{
  // Счтываем освещенность
  _photoSens1 = analogRead(A0);
  _photoSens2 = analogRead(A1);   
}

/*******************************************************************************************************************/
// Библиотеки для работы с датчиком темпереатуры
#include "OneWire.h"
#include "DallasTemperature.h"

/*******************************************************************************************************************/
/******************************************** Датчик температуры ***************************************************/
/*******************************************************************************************************************/
// Выход данных датчика температуры подключен к pin A2 (=16) Arduino
#define one_wire_bus 16

// Создаем экземпляр класса oneWire, передаевая ему параметр (номер пина Arduino)
OneWire oneWire(one_wire_bus);

DallasTemperature sensors(&oneWire);

// Функция считывания температуры
void fnGetTemp(void)
{
  sensors.requestTemperatures();
  _tempD1 = sensors.getTempCByIndex(0);
  _tempD2 = sensors.getTempCByIndex(1);
  _tempMid = (_tempD1 + _tempD2)/2;
}

/*******************************************************************************************************************/
/**************************************** Функции для работы с радиомодулем  ***************************************/
/*******************************************************************************************************************/
// Сигналы CE и CSN на пинах 9 и 10 соответственно
// RF24 _mrRF24(CE,CSN);
RF24 _mrRF24(9,10);

// адрес трубы канала
const uint64_t _pipe = 0xAF1510009002LL;

// Функция инициализации модуля
void fnIniRF24(void)
{
  _mrRF24.begin();
  _mrRF24.setChannel(72);
  _mrRF24.setDataRate(RF24_250KBPS);  
  _mrRF24.setPALevel(RF24_PA_HIGH);
  _mrRF24.stopListening();  
  _mrRF24.openWritingPipe(_pipe);  
}

// Функция передает данные
void fnSendData(void)
{  
    _mrRF24.write(&_tempMid, sizeof(_tempMid));  
}

void setup()
{
  // Начало работы с датчиками температуры
  sensors.begin();

  // Инициализация передатчика  
  fnIniRF24();
}

void loop()
{
   fnGetTemp();
   fnReadLux();   
   
   for(int i = 0; i < 100; i++)
   {    
    fnSendData();    
   }     
}

Код приемника:

// Библиотеки для работы с радиомодулем NRF24L01
#include <SPI.h>;
#include <nRF24L01.h>;
#include <RF24.h>;

/*******************************************************************************************************************/
/**************************************** Функции для работы с радиомодулем  ***************************************/
/*******************************************************************************************************************/
// Сигналы CE и CSN на пинах 9 и 10 соответственно
// RF24 _mrRF24(CE,CSN);
RF24 _mrRF24(9,10);

float _tempO;     // Температура на улице (outdoor)

// адрес трубы канала
const uint64_t _pipe = 0xAF1510009002LL;

// Функция инициализации модуля
void fnIniRF24(void)
{
  _mrRF24.begin();
  _mrRF24.setChannel(72);
  _mrRF24.setDataRate(RF24_250KBPS);  
  _mrRF24.setPALevel(RF24_PA_HIGH);
  _mrRF24.openReadingPipe(1,_pipe);
  _mrRF24.startListening();  
}

// Функция принимает данные
void fnReceiveData(void)
{
  if(_mrRF24.available())
  {
    _mrRF24.read(&_tempO, sizeof(_tempO));    
  }
  else
  {
   _tempO = -99.9;
  }
}

void setup()
{
  Serial.begin(9600);  
  fnIniRF24();
}

void loop()
{
  fnReceiveData();
  Serial.println(_tempO);
  delay(500);  
}

 Так вот, если в передатчике убрать последний for, т.е. передавать данные просто в цикле loop, то данные не передаются, приемник  возвращает в мониторе все время -99.9 .... Если for вернуть, то передается примерно 80% из этого for. Чего в супе не хватает?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

откуда жена знает про NRF24L01?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

jeka_tm пишет:

откуда жена знает про NRF24L01?

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

то есть проблема не в NRF24L01 изначально, а в проводах и ногах. может в эту сторону копать