NANO+RC522+NRF24 двусторонние общение
- Войдите на сайт для отправки комментариев
Сб, 04/08/2018 - 16:36
Всем привет, не выходит реализовать двусторонние общение на 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();
}
Подскажите как организовать это можно?