nrf24l01 + rfid rc522

rapidshe
Offline
Зарегистрирован: 31.12.2015

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

Проблема следующая.

скрестил два примера.

задача: при поднесении опеределенной метки послать сигнал по nrf24l01(почему он? я хз. наверное было бы проще взять какойнибудь передатчик 433. связь всёравно в одну сторону).

 

проблема: после первой отправки данных перестает отправлять.

при этом считывание карты нормально происходит и до и после отправки данных, а вот второй раз отправить данные не получается уже :/

Выклутился извращением - после каждой отправки данных делаю програмный ресет. но это ж жесть.

в чем проблема? вроде SS пинами нормально манипулирую...

пока что программа просто считывает номер метки и просто отправляет данные, введенные в монитор.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t Pipe = 0xE8E8F0F0AALL;

#include <MFRC522.h>
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 8
#define RST_PIN 7
#define DD 4 // Pin D4 --> выход на реле
#define ZZ 5 // Pin D4 --> выход на активный зумер
#define REL DD // REL - открывает дверь
MFRC522 mfrc522(SS_PIN, RST_PIN);        // MFRC522
MFRC522::MIFARE_Key key;

// готовим массив карт с флагами доступа 0-нет доступа, 1-естьдоступ (спец пропуска)
struct Cards {
  String id;
  int flag;
};
struct Cards cards[8] = {{"3646564140", 1}, {"1904792590", 1}, {"1637145102", 0}, {"73934703", 1}, {"4067496491", 1}, {"964301100", 1}, {"2524519168", 1}, {"1645645646", 1}};
boolean work = false;
unsigned int CUR_TIME;
unsigned int ALL_TIME;
bool needSend=false;
RF24 radio(CE_PIN, CSN_PIN);

int data[4];


void setup() {
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
  Serial.println(F("hi"));
  currentTime = 0;
  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);
  SPI.begin();               // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  digitalWrite(8, HIGH);
  digitalWrite(10, LOW);
  radio.begin();
  radio.setChannel(99);
  radio.setRetries(15, 30);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setAutoAck(1);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, Pipe);
  radio.startListening();

  if (needSend)
    {
    needSend=false;
    SendData(data[0], data[1], data[2]);  
    }
  }
void(* resetFunc) (void) = 0; // Reset MC function



void loop()
{
if (Serial.available()) {  //если в мониторе порта ввели что-то
    String SerialReadBuf = "";
    while (Serial.available()) {  //сохраняем строку в переменную val
      int ch = Serial.read();
      SerialReadBuf += char(ch);
      delay(10);
    }
    Serial.print(F("serialBuf ")); Serial.println(SerialReadBuf);
    byte n = 0;
    String val[] = {"", "", "", ""};
    for (int i = 0; i <= SerialReadBuf.length() - 1; i++) {
      if (SerialReadBuf.charAt(i) != '@') {
        val[n] += SerialReadBuf.charAt(i);
      }
      if ((SerialReadBuf.charAt(i) == '@') && n < 3) {
        n += 1;
      }
    }
    data[0] = val[0].toInt();
    data[1] = val[1].toInt();
    data[2] = val[2].toInt();
    data[3] = val[3].toInt();
    SendData(data[0], data[1], data[2]);
    needSend=true;
    resetFunc();
    
  }


  ALL_TIME = (millis() / 1000);
  if ((ALL_TIME - CUR_TIME) >= 5) {
    work = true;
    work = false;
    CUR_TIME = ALL_TIME;
  }
  if (work == false) {
    work = true;
    //------------------------РАБОТАЕМ СО СЧИТЫВАТЕЛЕМ КАРТ----------------------------
    // Look for new cards, and select one if present
    if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
      delay(50);
      work = false;
      return;
    }

    String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      // mfrc522.PICC_HaltA();

    Serial.print(F("Card UID: "));
    Serial.print(UID);
    Serial.println();
    if (UID != "") {
      for (int i = 0; i <= 7; i++) {
        if (cards[i].id == UID && cards[i].flag == 1) {
          // ТУТ ДЕЙСТВИЕ
          work = false;
          return;
        }
      }

    }
  }
  work = false;
}

void SendData(char receiver, char effect, char effectValue) {

  byte nul = 0;
  int data[] = {receiver, effect, effectValue, nul};
  Serial.print(F("send radio "));
  Serial.print(data[0]);
  Serial.print(F("@"));
  Serial.print(data[1]);
  Serial.print(F("@"));
  Serial.print(data[2]);
  Serial.println(F("@0"));
  delay(10);
  digitalWrite(8, HIGH);
  digitalWrite(10, LOW);

  radio.stopListening();
  radio.openWritingPipe(Pipe);
  radio.write( &data, sizeof(data) );
  radio.startListening();
  radio.write( &data, sizeof(data) );
  delay(10);
  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);

  //    SPI.begin();               // Init SPI bus
  //    mfrc522.PCD_Init();        // Init MFRC522 card

}
String dump_byte_array(byte *buffer, byte bufferSize) {
  //   String s;
  unsigned long uiddec = 0;
  //    unsigned long temp;
  char uid[8];
  for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //берем только последние 4 байта и переводим в десятичную систему
    unsigned long p = 1;
    for (int k = 0; k < bufferSize - m - 1; k++) {
      p = p * 256;
    }
    uiddec += p * buffer[m];
    //   s = s + (buffer[m] < 0x10 ? "0" : "");
    //   s = s + String(buffer[m], HEX);
  }
  //    s.toCharArray(uid, 8);
  return String(uiddec);
}

 

 

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

В 152-й строке вы пытаетесь передать, но перед ней начинаете слушать, разве это правильно?

rapidshe
Offline
Зарегистрирован: 31.12.2015

но этот косяк появился уже в поисках решения проблемы, когда я в senddata закидывал полностью блок инициализации nRF.

конечно поправил, но не заработало...

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t Pipe = 0xE8E8F0F0AALL;

#include <MFRC522.h>
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 8
#define RST_PIN 7
#define DD 4 // Pin D4 --> выход на реле
#define ZZ 5 // Pin D4 --> выход на активный зумер
#define REL DD // REL - открывает дверь
MFRC522 mfrc522(SS_PIN, RST_PIN);        // MFRC522
MFRC522::MIFARE_Key key;

// готовим массив карт с флагами доступа 0-нет доступа, 1-естьдоступ (спец пропуска)
struct Cards {
  String id;
  int flag;
};
struct Cards cards[8] = {{"3646564140", 1}, {"1904792590", 1}, {"1637145102", 0}, {"73934703", 1}, {"4067496491", 1}, {"964301100", 1}, {"2524519168", 1}, {"1645645646", 1}};
boolean work = false;
unsigned int CUR_TIME;
unsigned int ALL_TIME;
bool needSend=false;
RF24 radio(CE_PIN, CSN_PIN);

int data[4];


void setup() {
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
  Serial.println(F("hi"));

  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);
  SPI.begin();               // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  digitalWrite(8, HIGH);
  digitalWrite(10, LOW);
  radio.begin();
  radio.setChannel(99);
  radio.setRetries(15, 30);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setAutoAck(1);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, Pipe);
  radio.startListening();

  if (needSend)
    {
    needSend=false;
    SendData(data[0], data[1], data[2]);  
    }
  }
void(* resetFunc) (void) = 0; // Reset MC function



void loop()
{
if (Serial.available()) {  //если в мониторе порта ввели что-то
    String SerialReadBuf = "";
    while (Serial.available()) {  //сохраняем строку в переменную val
      int ch = Serial.read();
      SerialReadBuf += char(ch);
      delay(10);
    }
    Serial.print(F("serialBuf ")); Serial.println(SerialReadBuf);
    byte n = 0;
    String val[] = {"", "", "", ""};
    for (int i = 0; i <= SerialReadBuf.length() - 1; i++) {
      if (SerialReadBuf.charAt(i) != '@') {
        val[n] += SerialReadBuf.charAt(i);
      }
      if ((SerialReadBuf.charAt(i) == '@') && n < 3) {
        n += 1;
      }
    }
    data[0] = val[0].toInt();
    data[1] = val[1].toInt();
    data[2] = val[2].toInt();
    data[3] = val[3].toInt();
    SendData(data[0], data[1], data[2]);
    needSend=true;
 //   resetFunc();
    
  }


  ALL_TIME = (millis() / 1000);
  if ((ALL_TIME - CUR_TIME) >= 5) {
    work = true;
    work = false;
    CUR_TIME = ALL_TIME;
  }
  if (work == false) {
    work = true;
    //------------------------РАБОТАЕМ СО СЧИТЫВАТЕЛЕМ КАРТ----------------------------
    // Look for new cards, and select one if present
    if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
      delay(50);
      work = false;
      return;
    }

    String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      // mfrc522.PICC_HaltA();

    Serial.print(F("Card UID: "));
    Serial.print(UID);
    Serial.println();
    if (UID != "") {
      for (int i = 0; i <= 7; i++) {
        if (cards[i].id == UID && cards[i].flag == 1) {
          // ТУТ ДЕЙСТВИЕ
          work = false;
          return;
        }
      }

    }
  }
  work = false;
}

void SendData(char receiver, char effect, char effectValue) {

  byte nul = 0;
  int data[] = {receiver, effect, effectValue, nul};
  Serial.print(F("send radio "));
  Serial.print(data[0]);
  Serial.print(F("@"));
  Serial.print(data[1]);
  Serial.print(F("@"));
  Serial.print(data[2]);
  Serial.println(F("@0"));
  delay(10);
  digitalWrite(8, HIGH);
  digitalWrite(10, LOW);
  radio.stopListening();
  radio.openWritingPipe(Pipe);
  radio.write( &data, sizeof(data) );
  delay(10);
  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);

  //    SPI.begin();               // Init SPI bus
  //    mfrc522.PCD_Init();        // Init MFRC522 card

}
String dump_byte_array(byte *buffer, byte bufferSize) {
  //   String s;
  unsigned long uiddec = 0;
  //    unsigned long temp;
  char uid[8];
  for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //берем только последние 4 байта и переводим в десятичную систему
    unsigned long p = 1;
    for (int k = 0; k < bufferSize - m - 1; k++) {
      p = p * 256;
    }
    uiddec += p * buffer[m];
    //   s = s + (buffer[m] < 0x10 ? "0" : "");
    //   s = s + String(buffer[m], HEX);
  }
  //    s.toCharArray(uid, 8);
  return String(uiddec);
}

 

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

Похоже, у нас с вами одна и таже проблема ... я ее тут описывал. Но я пришел к выводу, что проблема не в передаче, а в приеме, но пока не знаю, как ее решить.

У меня работает вот в таком странном виде:

если добавить цикл (у вас строка 149)

for(int I = 0; I < 150; I++)
{
   // Ваша 149 строка
}

то передача идет как по маслу

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я сам с этими модулями не работал, хотя лежит 10-ок, недавно наткнулся

http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/

может что то для себя подчерпнете.

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

Да, я это читал ... хочу этому товарищу в личку написать ...

rapidshe
Offline
Зарегистрирован: 31.12.2015

ulis пишет:

Похоже, у нас с вами одна и таже проблема ... я ее тут описывал. Но я пришел к выводу, что проблема не в передаче, а в приеме, но пока не знаю, как ее решить.

У меня работает вот в таком странном виде:

если добавить цикл (у вас строка 149)

for(int I = 0; I < 150; I++)
{
   // Ваша 149 строка
}

то передача идет как по маслу

 

я удивлен, но работает) причем из раза в раз из 149 пакетов приходит 147... пожалуй I можно уменьшить до 10)

спасибо) но это всеравно не элегантно :)

 

кстати проблема все же в передаче. когд без считывателя отрабатывает отлично

rapidshe
Offline
Зарегистрирован: 31.12.2015

окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)

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

rapidshe пишет:

окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)

Конечно, добавить цикл, не понимая его назначение - это не только не элегантно, это еще и ущемляет мою гордость ... :) Мне надоели все эти пляски с бубном вокруг библиотеки nrf, возможно, она что-то не учитывает или есть какая-то тайна ... поэтому, продолжая поиски примеров на просторах вселенной, я наткнулся на таковой, который сразу заработал: http://www.elecfreaks.com/203.html

Теперь осталось разобрать и понять каждую строчку примера и приспособить для себя .... с учетом плохого знания языка - на это уйдут многие годы :) Там используется софтверный spi