Проблемы с передачей данных по NRF24

ykropchik22
Offline
Зарегистрирован: 30.05.2017

Всем привет!
Проблема в следующем. Есть 2 ардуино к одной прикручен 7 сигментный индикатор к другой датчик температуры-влажности. При помощи NRF24 данные с датчика передаются на на индикатор, но после нескольких секунд индикации данные температуры и влажности меняются местами, тоесть если температура 25 градусов, а влажность 40 процентов, то на индикаторе показывает 40 градусов и 25 процентов. Кто знает в чем проблема подскажите. 

RX

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "DHT.h"
#include <TimerOne.h>
#include <TM74HC595Display.h>
#define SCLK 7  // пины ардуины
#define RCLK 6     
#define DIO 5


TM74HC595Display disp(SCLK, RCLK, DIO);
RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно

int i;
int d;

byte digitBuffer[10];

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб

void setup(){
  Serial.begin(9600);
  
  digitBuffer[0] = 0b11000000;
  digitBuffer[1] = 0b11111001;
  digitBuffer[2] = 0b10100100;
  digitBuffer[3] = 0b10110000;
  digitBuffer[4] = 0b10011001;
  digitBuffer[5] = 0b10010010;
  digitBuffer[6] = 0b10000010;
  digitBuffer[7] = 0b11111000;
  digitBuffer[8] = 0b10000000;
  digitBuffer[9] = 0b10010000;


  Timer1.initialize(900); // set a timer of length 1500
  Timer1.attachInterrupt(timerIsr);
  
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  
  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop(void) {
    byte pipeNo;                          
      radio.available(&pipeNo);    // слушаем эфир со всех труб
      radio.read( &i, sizeof(i) );         // чиатем входящий сигнал
      radio.read( &d, sizeof(d));
      Serial.println("Температура ");
      Serial.println(i);
      Serial.println("Влажность ");
      Serial.println(d);
      disp.digit2(i, 1);
      disp.set(0b10011100, 0);    // знак градуса
      delay(5000);
      disp.clear();
      
      disp.digit2(d, 2);
      disp.set(0b10011100, 1);
      disp.set(0b10100011, 0); 
      delay(5000);
      disp.clear(); 
    
}
    void timerIsr()
    {
    disp.timerIsr();
   }

TX

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT22

RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно

DHT dht(DHTPIN, DHTTYPE);

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб

int i;
int d;

void setup(){
  Serial.begin(9600);
  
  dht.begin();

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop(void) { 
  i = dht.readTemperature();
  d = dht.readHumidity();
  Serial.println("Температура ");
  Serial.println(i);
  Serial.println("Влажность ");
  Serial.println(d);  
  radio.write(&i, sizeof(i));
  radio.write(&d, sizeof(d));
  delay(9000);  
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ошибок много.

Одна, глобальная, - в придуманном Вами незащищенном протоколе передачи.

Несколько локальных - в фрагменте, принимающем сообщения.

ykropchik22
Offline
Зарегистрирован: 30.05.2017

Можете поподробней объяснить, пожалуйста, буду благодарен.

Slanapatam
Offline
Зарегистрирован: 30.05.2017

ykropchik22 пишет:
Можете поподробней объяснить, пожалуйста, буду благодарен.
Если не вдаваться в  ошибки подобные  вызову функции не имеющей аргументов  как

byte pipeNo; radio.available(&pipeNo);    // слушаем эфир со всех труб

 

с передачей ей адреса неинициализщированной локальной переменной pipeNo,  то главная ошибка в разделении двух переменных по разным пакетам с последующей потерей синхронизации между четными и нечетными пакетами. Чтение производится не будучи уверенным, что в приемнике есть данные.