NRF24L01 Help

.Юра.
Offline
Зарегистрирован: 29.04.2014

Есть Сервер[Mega2560]

#include <SPI.h>
#include "RF24.h"
#include <OneWire.h>
#include <DallasTemperature.h>

RF24 radio(9, 10);

const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};// адреса каналов приема и передачи

long previousMillis = 0;        
long interval = 10000;           

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

typedef struct{
  byte id;
  float temp;
  byte voll;
  byte vol2;
  byte vol3;
  byte vol4;
}
nf1;
nf1 client; 

void setup(){
  radio.begin();
  sensors.begin();  
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(100); 
  radio.setRetries(15,15);
  radio.openWritingPipe(pipes[1]);  
  radio.openReadingPipe(1, pipes[0]);
  //radio.startListening(); 
  client.id = 2; 
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
      sensors.requestTemperatures();
      client.temp = sensors.getTempCByIndex(0);
      radio.stopListening();
      bool ok = radio.write(&client, sizeof(client));
      radio.startListening();
      delay(20);
  }   
}

Клиенты[ProMini,Mega8,Mega8515]


#include <SPI.h>
#include "RF24.h"
#include <OneWire.h>
#include <DallasTemperature.h>

RF24 radio(9, 10);

const uint64_t pipes[2] = {
  0xF0F0F0F000LL, 0xF0F0F0F0FFLL};

long previousMillis = 0;        
long interval = 10000;           

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

typedef struct{
  byte id;
  float temp;
  byte voll;
  byte vol2;
  byte vol3;
  byte vol4;
}
nf1;
nf1 client; 

void setup(){
  radio.begin();
  sensors.begin();  
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(100); 
  radio.setRetries(15,15);
  radio.openWritingPipe(pipes[1]);  
  radio.openReadingPipe(1, pipes[0]);
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
      sensors.requestTemperatures();
      client.temp = sensors.getTempCByIndex(0);
      radio.stopListening();
      bool ok = radio.write(&client, sizeof(client));
      radio.startListening();
      delay(20);
  }   
}

(Сервер принемает только, клиенты отсылают через 10 сек температуру). Все работает без запинок(только пришлось припоять кондеры по 10ф).

Хотелось прикрутить реле, но для этого нужно в два напровления

Попробывал для начала по запросу

[Сервер]

  if (Serial.available() > 0) {
            client.vol4  = Serial.read();
            radio.stopListening();
            radio.write(&client, sizeof(client));
            delay(20);
            radio.startListening();
        }

[Клиенты]

if(radio.available()){
     radio.read(&client, sizeof(client));
     Serial.println(client.vol4);
     if(client.vol4 == '5'){
       temp(); //вывод температуры
     }
  }

void temp()
{
      radio.stopListening();
      sensors.requestTemperatures();
      client.temp = sensors.getTempCByIndex(0);
      radio.write(&client, sizeof(client));
      radio.startListening();
      delay(20); 
}

Но при отправке 5, иногда работает иногда нет. отсылает раз через 5-8 раз.

Что может быть не так.? Как правельно работает 

radio.read(&client, sizeof(client));
radio.stopListening();
radio.write(&client, sizeof(client));
radio.startListening();
.Юра.
Offline
Зарегистрирован: 29.04.2014

Если кто скинет

[Сервер] 

запрос id=1

[Клиенты]

считать id и отправить данные.