[AJUDA] Leitor RFID para Controle de Acessos em Fechadura Elétrica

Olá pessoal,

Estou fazendo um projeto para controle de acessos.

Objetivo do projeto

Leitor RFID onde quando o usuário está permitido ele aciona um Rele que abre uma fechadura elétrica.

Problema

O código está funcionando direitinho, o problema é que ele está fazendo múltiplas leituras quando um cartão está presente e não toma a ação enquanto não remover o cartão do leitor.

Por exemplo: Se eu aproximar e remover bem rápido um cartão do leitor RFID, ele lê o conteúdo e toma a ação necessária, porém se eu deixar o cartão em cima do leitor RFID, ele fica lendo múltiplas vezes a mesma coisa e não toma ação nenhuma (como se o RFID estivesse "ocupado")

O que preciso de ajuda

Gostaria da ajuda de vocês para que ele fizesse a leitura apenas algumas vezes do conteúdo do cartão e já tomasse a ação necessária. Tentei usar o millis() mas não tive sucesso, pode ser que não tenha usado da forma correta. Conseguem me dar um auxilio? 

Sketch

--------------------------------------------------------------------------------------------

//Programa: Leitor RFID RDM6300#include /font>SoftwareSerial.h>
#include /font>RDM6300.h>
#define Rele 7 //Definição do pino de controle do Rele

//Inicializa a serial nos pinos 2 (RX) e 3 (TX)
SoftwareSerial rfid(0, 1);

#define ADD_TAG_CODE "ACBBB0136BDF" // TAG ID que adiciona cartões permitidos
#define DEL_TAG_CODE "210014E2BD6A" //TAG ID que deleta cartões permitidos
String msg;
String ID = "01001C9D55D5,0100179C54DE"; //string para guardar cartões permitidos

int Buzzer = 10;

void setup()
{
Serial.begin(9600);
Serial.println("Serial Ready");

rfid.begin(9600);
Serial.println("RFID Ready");

pinMode(Rele, OUTPUT); //Pino declarado como saída
pinMode(Buzzer, OUTPUT); //Pino Buzzer declarado como saída

}

char c;

void loop(){

while(rfid.available()>0){
c=rfid.read();
msg += c;
Serial.println(msg);
Serial.println(msg.length());
}
msg=msg.substring(1,13);
if(msg.indexOf(ADD_TAG_CODE)>=0) add();
else if(msg.indexOf(DEL_TAG_CODE)>=0) del();
else if(msg.length()>10) verifica();
msg="";

}

void add(){
Serial.print("Para qual cartão deseja dar acesso?: ");
msg="";
while(msg.length()/font>13){
while(rfid.available()>0){
c=rfid.read();
msg += c;
}
}
if(ID.indexOf(msg)>=0) {
Serial.println("\nAcesso garantido para este cartão.");
msg="";
}
else{
Serial.print("Card: ");
Serial.println(msg);
ID += msg;
ID += ",";
//Serial.print("ID: ");
// Serial.println(ID);
msg="";
Serial.println("Acesso permitido para este cartão.");
}

}

void del(){
msg="";
Serial.print("Qual TAG você deseja negar o acesso?: ");
while(msg.length()/font>13){
while(rfid.available()>0){
c=rfid.read();
msg += c;
}
}
msg=msg.substring(1,13);
if(ID.indexOf(msg)>=0){
Serial.println(msg);
Serial.println("TAG encontrada. Acesso permitido para este cartão.");
//ID.replace(card,"");
int pos=ID.indexOf(msg);
msg="";
msg += ID.substring(0,pos);
msg += ID.substring(pos+15,ID.length());
ID="";
ID += msg;
//Serial.print("ID: ");
//Serial.println(ID);
} else Serial.println("\nTAG não encontrada ou já negada");
msg="";
}

void verifica(){
msg=msg.substring(1,13);
if(ID.indexOf(msg)>=0){
Serial.println("Acesso permitido.");
tone(Buzzer, 2500, 150);
digitalWrite(Rele, HIGH);
delay(1000);
digitalWrite(Rele, LOW);
delay(1000);
return;
}
else Serial.println("Acesso negado.");
tone(Buzzer, 500, 300);
}

--------------------------------------------------------------------------------------------

Exibições: 93

Responder esta

Respostas a este tópico

Boa noite TS,

leia : http://labdegaragem.com/forum/topics/sugest-o-de-como-postar?overri...

 Recomendo remover o sketch colado na area de texto do topico.

RV

não sei a fundo se a biblioteca de rfid tenha uma função pronta, do contrário implemente o "conceito" de semáfaro.

Já pesquisei e não encontrei função para isso na biblioteca. Mas quando você diz conceito semáforo você diz sobre o if ou millis() ?
Variável Boolean
Eu cheguei a utilizar e cheguei no mesmo problema. Onde eu tive mais sucesso foi quando utilizei o ‘for’ para limitar a quantidade de carácteres lidos, mas o problema é que com isso ele parou de tomar as ações.
Neste post ele usou uma variável para controlar. “card_status”
https://stackoverflow.com/questions/48760502/how-to-stop-multiple-r...

Interessante que o "card_status" não funcionou nem no meu sketch nem no do exemplo do artigo. Eu tenho um sketch aqui que lê uma vez só, porém não toma ação nenhuma. Quer que eu compartilhe?

Então une os dois sketch que vai ter o resultado que precisa. O sketch do exemplo não apresenta a solução, mas a ideia de como realizar

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço