Go Down

Topic: Erro ao bloquear tag não cadastrado - RFID RC522 (Read 101 times) previous topic - next topic

yago4xd

Dec 10, 2014, 03:43 pm Last Edit: Dec 12, 2014, 09:46 pm by yago4xd
Boa tarde pessoal. Fiz um sistema de trava eletrônica usando o RFID RC522.

O problema que ocorre, é que o sistema, ao ler uma tag não cadastrada no código, ele bloqueia a passagem, porém, se eu passar uma tag cadastrada (obviamente que a porta abre), e logo depois desta tag cadastrada eu passar uma outra não cadastrada, ela libera o acesso da mesma forma, de vez em quando. Depende do tempo que se passa, isso não ocorre. Acho que ela grava o code da tag anterior (tag cadastrada) e acaba usando para a tag não cadastrada.

Aqui abaixo consta o code que usei para este sistema:

Code: [Select]
// inclusão das bilibotecas
#include <SPI.h>
#include <RFID.h>
#include <Wire.h>

// definição do RFID
RFID rfid(10,5);
byte tag[5] = {0x33,0x09,0x8F,0xF4,0x41};
// coloque aqui seus outros cartões permitidos

byte serNum[5];
byte data[5];

// definição das melodias de acesso/boas vindas e rejeição/erro


// definição dos pinos do LED, Buzzer e Rele
int LED_access = 2;
int LED_intruder = 3;

int rele = 9;


void setup(){
  Serial.begin(9600);
  SPI.begin(); // inicialização da comunicação SPI para o RFID
  rfid.init(); // inicialização do RFID
  pinMode(LED_access,OUTPUT);
  pinMode(LED_intruder,OUTPUT);
  pinMode(rele,OUTPUT);
}
 
void loop(){
  // aqui voce vai criar uma variável para cada usuário
  // INICIALDONOME_card ou CODIGO_card
  boolean tag_card = true; // tag
  
  if (rfid.isCard()){ // encontrado cartão válido
    if (rfid.readCardSerial()){ // faz a leitura do cartão
      data[0] = rfid.serNum[0]; // armazena o número serial
      data[1] = rfid.serNum[1];
      data[2] = rfid.serNum[2];
      data[3] = rfid.serNum[3];
      data[4] = rfid.serNum[4];

    }
  
  //rfid.halt(); // RFID para standby
 
  for(int i=0; i<5; i++){
    if(data[i] != tag[i]) tag_card = false;
    // aqui você pode verificar os outros cartões permitidos
  }
  if (tag_card){// adicione os outros usuários com um ou logico ||
    Serial.println("Bem vindo!");
    digitalWrite(rele, HIGH); // libera porta
    delay(250); // espera
    digitalWrite(rele, LOW); // trava porta
  }
  else{ // se um cartão desconhecido foi encontrado
    Serial.println("Cartao nao reconhecido!");
    Serial.println("Contacte o administrador!"); // imprime mensagem
    digitalWrite(LED_intruder, HIGH); // acende LED vermelho
    for (int i = 0; i < 6; i++){ // toca música de rejeição de usuário
      
    }
    delay(1000);
    digitalWrite(LED_intruder, LOW); // apaga LED vermelho
  }

  delay(200);
  rfid.halt();
  }  
}
  


[ResAgradeço qualquer ajuda.

luisilva

#1
Dec 11, 2014, 12:32 am Last Edit: Dec 11, 2014, 12:33 am by luisilva
Não gosto deste bloco:
Code: [Select]
 for(int i=0; i<5; i++){
    if(data[i] != tag[i]) tag_card = false;
    // aqui você pode verificar os outros cartões permitidos
  }


O que acontece se todos os dígitos forem diferentes menos o último?


Outra coisa que não gosto é que não vejo lógica no que acontece se for detectado um cartão, ou seja, se o resultado deste teste for positivo:
Code: [Select]
 if (rfid.isCard()){ // encontrado cartão válido


mas não se conseguir ler o código desse cartão, ou seja, se o resultado deste teste for negativo:
Code: [Select]
   if (rfid.readCardSerial()){ // faz a leitura do cartão


Não daria esse problema que está a descrever?

Não ficaria melhor assim?
Code: [Select]
// inclusão das bilibotecas
#include <SPI.h>
#include <RFID.h>
#include <Wire.h>

// definição do RFID
RFID rfid(10,5);
byte tag[5] = {0x33,0x09,0x8F,0xF4,0x41};
// coloque aqui seus outros cartões permitidos

byte serNum[5];
byte data[5];

// definição das melodias de acesso/boas vindas e rejeição/erro


// definição dos pinos do LED, Buzzer e Rele
int LED_access = 2;
int LED_intruder = 3;

int rele = 9;


void setup(){
  Serial.begin(9600);
  SPI.begin(); // inicialização da comunicação SPI para o RFID
  rfid.init(); // inicialização do RFID
  pinMode(LED_access,OUTPUT);
  pinMode(LED_intruder,OUTPUT);
  pinMode(rele,OUTPUT);
}
 
void loop(){
  // aqui voce vai criar uma variável para cada usuário
  // INICIALDONOME_card ou CODIGO_card
  boolean tag_card = false; // tag
  
  if (rfid.isCard()){ // encontrado cartão válido
    if (rfid.readCardSerial()){ // faz a leitura do cartão
      data[0] = rfid.serNum[0]; // armazena o número serial
      data[1] = rfid.serNum[1];
      data[2] = rfid.serNum[2];
      data[3] = rfid.serNum[3];
      data[4] = rfid.serNum[4];

      for(int i=0; i<5; i++){
        // aqui você pode verificar os outros cartões permitidos
        if(data[i] == tag[i]){
           tag_card = true;
        }
        else {
           tag_card = false;
           break;
        }
      }
    }
  
  //rfid.halt(); // RFID para standby
 
  if (tag_card){// adicione os outros usuários com um ou logico ||
    Serial.println("Bem vindo!");
    digitalWrite(rele, HIGH); // libera porta
    delay(250); // espera
    digitalWrite(rele, LOW); // trava porta
  }
  else{ // se um cartão desconhecido foi encontrado
    Serial.println("Cartao nao reconhecido!");
    Serial.println("Contacte o administrador!"); // imprime mensagem
    digitalWrite(LED_intruder, HIGH); // acende LED vermelho
    for (int i = 0; i < 6; i++){ // toca música de rejeição de usuário
      
    }
    delay(1000);
    digitalWrite(LED_intruder, LOW); // apaga LED vermelho
  }

  delay(200);
  rfid.halt();
  }  
}
  

yago4xd

Agora, passado um tempo, ocorre outro problema (não sei porque veio a acontecer, mas é a segunda vez que ligo a placa) O rele fica piscando até que se passe uma tag não cadastrada. Enquanto ele estiver sem tag, ou com tag cadastrada, o rele fica piscando incessantemente, mas ao passar uma tag não cadastrada, ele para o rele.

Estou analisando o código, mas a princípio, não encontro nada errado!

Define a variável tag_card como false e isso passa.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

luisilva

Talvez, uma coisa assim, resulte:
Code: [Select]
// inclusão das bilibotecas
#include <SPI.h>
#include <RFID.h>
#include <Wire.h>

// definição do RFID
RFID rfid(10,5);
byte tag[5] = {0x33,0x09,0x8F,0xF4,0x41};
// coloque aqui seus outros cartões permitidos

byte serNum[5];
byte data[5];

// definição das melodias de acesso/boas vindas e rejeição/erro


// definição dos pinos do LED, Buzzer e Rele
int LED_access = 2;
int LED_intruder = 3;

int rele = 9;


void setup(){
  Serial.begin(9600);
  SPI.begin(); // inicialização da comunicação SPI para o RFID
  rfid.init(); // inicialização do RFID
  pinMode(LED_access,OUTPUT);
  pinMode(LED_intruder,OUTPUT);
  pinMode(rele,OUTPUT);
  digitalWrite(rele, LOW); // trava porta
}
 
void loop(){
  // aqui voce vai criar uma variável para cada usuário
  // INICIALDONOME_card ou CODIGO_card
  boolean tag_card = false; // tag
 
  if (rfid.isCard()){ // encontrado cartão válido
    if (rfid.readCardSerial()){ // faz a leitura do cartão
      data[0] = rfid.serNum[0]; // armazena o número serial
      data[1] = rfid.serNum[1];
      data[2] = rfid.serNum[2];
      data[3] = rfid.serNum[3];
      data[4] = rfid.serNum[4];

      for(int i=0; i<5; i++){
        // aqui você pode verificar os outros cartões permitidos
        if(data[i] == tag[i]){
           tag_card = true;
        }
        else {
           tag_card = false;
           break;
        }
      }
    }
 
  //rfid.halt(); // RFID para standby
 
  if (tag_card){// adicione os outros usuários com um ou logico ||
    Serial.println("Bem vindo!");
    digitalWrite(rele, HIGH); // libera porta
    delay(250); // espera
    digitalWrite(rele, LOW); // trava porta
  }
  else{ // se um cartão desconhecido foi encontrado
    Serial.println("Cartao nao reconhecido!");
    Serial.println("Contacte o administrador!"); // imprime mensagem
    digitalWrite(LED_intruder, HIGH); // acende LED vermelho
    for (int i = 0; i < 6; i++){ // toca música de rejeição de usuário
     
    }
    delay(1000);
    digitalWrite(LED_intruder, LOW); // apaga LED vermelho
  }

  delay(200);
  rfid.halt();
  } 
}
 

yago4xd

@bubulindo,

acho que estavas a falar disto:

Code: [Select]
boolean tag_card = false; // tag

isso foi definido no loop

@luisilva,

uma solução tão óbvia rsrs. Vou testar, mas acho que isso sana o problema!

@bubulindo,

acho que estavas a falar disto:

Code: [Select]
boolean tag_card = false; // tag
Por acaso estava a falar disto:

Code: [Select]
  boolean tag_card = true; // tag

;)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

luisilva

@bubulindo: Penso que isso era um dos problemas do programa original. Também não estou a ver porque funcionaria.

Go Up