NANO+RC522+NRF24 двусторонние общение

Нет ответов
Gorky
Offline
Зарегистрирован: 08.01.2018

Всем привет, не выходит реализовать двусторонние общение на NRF24.
Есть NANO+NRF24    и   NANO+RC522+NRF24. Суть такая что считываю ардуинкой (1) UID метки, передаю на другую ардуинку(2), после этого должен получить любое сообщение от ардуинки (2) на (1). Ну в идеале это текст который привязан к номеру меки. Работает все кроме отправки либо приема обратного сообщения. Использую библиотеку RF24Network потому что в идеале должно быть 12 ардуино с RC522 и они отправляют это на главную. 

Код NANO+RC522+NRF24

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_RFID 10
#define RST_RFID 9
MFRC522 rfid(SS_RFID, RST_RFID); // Пины RC522
MFRC522::MIFARE_Key key;

#define SS_NRF 8
#define RST_NRF 7
RF24 radio(RST_NRF, SS_NRF); // Пины NRF24 

int count = 0 ;
byte UID[4]; //Храним UID тут

RF24Network network(radio);

const uint16_t this_node = 2;// Адресс этой ардуинки
const uint16_t other_node = 1;// Адресс куда передаем

String output; // Строкапередача UID + кредиты (не используется)

void setup(void)
{
  Serial.begin(9600);
  SPI.begin();
  radio.begin();
 network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины
  rfid.PCD_Init(); // Инициализация RC522

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  Serial.print("READY TX");
}

void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

void card () { // тут считываем новую карту и сохраняем в массив UID

  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  if (rfid.uid.uidByte[0] != UID[0] || // Если приложенна новая карта
      rfid.uid.uidByte[1] != UID[1] ||
      rfid.uid.uidByte[2] != UID[2] ||
      rfid.uid.uidByte[3] != UID[3] ) {

    for (byte i = 0; i < 4; i++) {
      UID[i] = rfid.uid.uidByte[i];
    }
    Serial.print("In dec: ");
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    count = 1;   // Меняем значение переменной
  }  else Serial.println("Card read previously."); // Если приложенна текущая карта

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}

void received () { // Прием обратных данных

  while (network.available()) // Если есть сообщение то читаем его  !
  {                          //НО оно зависает на этом, если убрать while тогда оно хоть работает дальше.
    RF24NetworkHeader header;
    static char mecountage[32]; // сюда пишем принятое сообщение
    network.read(header, &mecountage, sizeof(mecountage));// Читаем сообщение
    Serial.print("Received: ");
    Serial.println(mecountage); // Выводим принятое сообщение
    count = 0;
  }
}
void sen () { // Тут отправляем UID
  Serial.print("Sending...");
  RF24NetworkHeader header(/*to node*/ other_node);
  //output = (String (mecountage[0]) + String (mecountage[1]) + String (mecountage[2]) + String (mecountage[3]));  // Не используется
  bool ok = network.write(header, &UID, sizeof(UID)); // Отправляем
  if (ok) {
    Serial.println("ok.");
    count = 2 ; // Меняем переменную
  } else
  {
    Serial.println("failed");
  }
}

void loop(void)
{
  digitalWrite (SS_RFID, LOW);  // Меняем состояние count пинов
  digitalWrite (SS_NRF, HIGH);
  network.update();
  if (count == 0) {  // Читаем карту
    card();
  }
  if (count == 1) {// Отправляем UID
    digitalWrite (SS_RFID, HIGH);  // Меняем состояние count пинов
    digitalWrite (SS_NRF, LOW);
    sen ();
  }
  if (count == 2) {   // Принимаем сообщение
    received ();
  }
}

Код NANO+NRF24

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

#define SS_NRF 8
#define RST_NRF 7
RF24 radio(RST_NRF, SS_NRF);  // Пины NRF24

String serial; // Для вывода в сериал порт принятого UID
String UID;
RF24Network network(radio);
int count = 0;
const uint16_t this_node = 1;// Адресс этой ардуинки
const uint16_t other_node = 2;// Адресс куда передаем

String card1 = "2342434246"; // Тут храню UID карт который использую
String card2 = "192247132166";
String card3 = "96197102168";
String card4 = "55170114180";

const char* info;

void setup(void)
{
  Serial.begin(9600);
  SPI.begin();
  radio.begin();
  network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины
  Serial.println("READY RX");
}

void received () { // Прием UID
  if (count == 0) {
    while ( network.available() )
    {
      RF24NetworkHeader header;
      byte message[4]; // храним юид
      network.read(header, &message, sizeof(message));
      Serial.print("Received: ");
      UID = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3])); // Даже не спрашивайте зачем ) UID для сравнения
      serial = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3]) + " From:" + header.from_node);
      Serial.println(serial);// выводим UID и от какой ардуины получен
      count = 1;
    }
  }
}
void sen () { // Обратная передача данных
  if (count == 1) {
    if (UID = card1) { // если пришел UID 1 карты то message = cadr1
      info = "card1";
    }
    if (UID = card2) { // если пришел UID 1 карты то message = cadr1
      info = "card2";
    }
    if (UID = card3) { // если пришел UID 1 карты то message = cadr1
      info = "card3";
    }
    if (UID = card4) { // если пришел UID 1 карты то message = cadr1
      info = "card4";
    }
    Serial.print("Sending...");
    RF24NetworkHeader header(/*to node*/ 2);
    bool ok = network.write(header, info, sizeof(info)); // отправляем информацию о карте
    if (ok) {
      Serial.println("ok.");
      count = 0;
    } else {
      Serial.println("failed");
    }
  }
}

void loop(void)
{
  network.update();
  received();
  sen();
}

Подскажите как организовать это можно?