Ir ao conteúdo

Posts recomendados

Postado

Ola a todos, estou montando um projeto que utiliza o arduino uno R3 e o modulo  RFID MFRC522, é um projeto ja bastante utilizado e tem muito material na internet sobre ele, mas seu funcionamento sempre se da da mesma forma, ao aproximar a tag (cadastrada)  do leitor uma saida é acionada e conta um tempo (delay) e depoiis desliga, mas eu gostaria que funcionasse da seguinte forma, ao aproximar a tag, a saida ou um led por exemplo é ligado e permanece assim enquanto a tag estiver no leitor, e apaga quando afastar a tag do leitor, em meu projeto preciso usar a condição if e else, onde enquanto a tag estiver no leitor ele executa o que esta no if, mas quanto afastar executa o else, fico grato pela ajuda e atenção de todos, obrigado. abaixo esta o programa que quero modificar.

#include <SPI.h> //INCLUSÃO DE BIBLIOTECA
#include <MFRC522.h> //INCLUSÃO DE BIBLIOTECA
 
#define SS_PIN 10 //PINO SDA
#define RST_PIN 9 //PINO DE RESET
 
MFRC522 rfid(SS_PIN, RST_PIN); //PASSAGEM DE PARÂMETROS REFERENTE AOS PINOS
 
 
const int pinoLedVerde = 3; //PINO DIGITAL REFERENTE AO LED VERDE
const int pinoLedVermelho = 2; //PINO DIGITAL REFERENTE AO LED VERMELHO
 
void setup(){
 
  Wire.begin(); //INICIALIZA A BIBLIOTECA WIRE
  SPI.begin(); //INICIALIZA O BARRAMENTO SPI
  rfid.PCD_Init(); //INICIALIZA MFRC522
  
  pinMode(pinoLedVerde, OUTPUT); //DEFINE O PINO COMO SAÍDA
  pinMode(pinoLedVermelho, OUTPUT); //DEFINE O PINO COMO SAÍDA
  
  digitalWrite(pinoLedVerde, LOW); //LED INICIA DESLIGADO
  digitalWrite(pinoLedVermelho, LOW); //LED INICIA DESLIGADO
}
 
void loop() {
  leituraRfid(); //CHAMA A FUNÇÃO RESPONSÁVEL PELA VALIDAÇÃO DA TAG RFID
}
 
//FUNÇÃO DE VALIDAÇÃO DA TAG RFID
void leituraRfid(){
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) //VERIFICA SE O CARTÃO PRESENTE NO LEITOR É DIFERENTE DO ÚLTIMO CARTÃO LIDO. CASO NÃO SEJA, FAZ
    return; //RETORNA PARA LER NOVAMENTE
 
  /***INICIO BLOCO DE CÓDIGO RESPONSÁVEL POR GERAR A TAG RFID LIDA***/
  String strID = ""; 
  for (byte i = 0; i < 4; i++) {
    strID +=
    (rfid.uid.uidByte[i] < 0x10 ? "0" : "") +
    String(rfid.uid.uidByte[i], HEX) +
    (i!=3 ? ":" : "");
  }
  strID.toUpperCase();
/***FIM DO BLOCO DE CÓDIGO RESPONSÁVEL POR GERAR A TAG RFID LIDA***/
 
  //O ENDEREÇO "27:41:AA:AB" DEVERÁ SER ALTERADO PARA O ENDEREÇO DA SUA TAG RFID QUE CAPTUROU ANTERIORMENTE
  if (strID.indexOf("27:41:AA:AB") >= 0) { //SE O ENDEREÇO DA TAG LIDA FOR IGUAL AO ENDEREÇO INFORMADO, FAZ
    digitalWrite(pinoLedVerde, HIGH); //LIGA O LED VERDE
    delay(3000); //INTERVALO DE 4 SEGUNDOS
    digitalWrite(pinoLedVerde, LOW); //DESLIGA O LED VERDE
  }else{ //SENÃO, FAZ (CASO A TAG LIDA NÃO SEJÁ VÁLIDA)
    digitalWrite(pinoLedVermelho, HIGH); //LIGA O LED VERMELHO
    delay(3000); ////INTERVALO DE 6 SEGUNDOS
    digitalWrite(pinoLedVermelho, LOW); //DESLIGA O LED VERDE
  }
 
  rfid.PICC_HaltA(); //PARADA DA LEITURA DO CARTÃO
  rfid.PCD_StopCrypto1(); //PARADA DA CRIPTOGRAFIA NO PCD
  }

 

  • Curtir 1
  • Membro VIP
Postado
12 horas atrás, picmoretto disse:

ao aproximar a tag, a saida ou um led por exemplo é ligado

Amigo eis seu autonorte...

if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) //VERIFICA SE O CARTÃO PRESENTE NO LEITOR É DIFERENTE DO ÚLTIMO CARTÃO LIDO. CASO NÃO SEJA, FAZ

{led=0; return;}

else

led=1;

Ou simplesmente conecte o led direto à saída de alguma função que sente a presença do tal rfid

led=rfid.PICC_IsNewCardPresent();

ou na linguagem arduina, algo como

#define led_azul 5

digitalwrite(led_azul,rfid.PICC_IsNewCardPresent());

 

  • Curtir 1
Postado

Fico muito grato pela ajuda der todos, usei o exemplo da linha citado mas ao aproximar a tag do leitor nada acontece, mudei o comando somente para ligar o led para ter certeza que o leitor estava funcionado e o led ligou normalmente, (digitalWrite(led_azul, HIGH)); mas ao afastar a tag ele ainda permanece ligado, abaixo esta como coloquei a linha de comando do exemplo onde nada acontece quando aproximo a tag. deste ja agradeço a colaboração de todos.

if (strID.indexOf("TT:EE:9Y:54") >= 0) { //SE O ENDEREÇO DA TAG LIDA FOR IGUAL AO ENDEREÇO INFORMADO, FAZ

   digitalWrite(led_azul,rfid.PICC_IsNewCardPresent());
      
       }
}

 

  • Curtir 1
  • Membro VIP
Postado

Ok... vejamos... mas 1ªmente por gentileza considere que crtl- ctrl-v tem mania de não funcionar a contento. A ideia é instigar apenas.

 

você acende mas não apaga o led...

10 horas atrás, picmoretto disse:

(digitalWrite(led_azul, HIGH));

Considere algo como

if (tag_presente()) digitalWrite(led_azul, HIGH);

else digitalWrite(led_azul, LOW);

 

Também não sei (ou não sabemos) que tipo de retorno há na função rfid.PICC_IsNewCardPresent(). Digamos que seja char e não bit. Assim sendo

 

digitalWrite(led_azul,rfid.PICC_IsNewCardPresent()&1);

 

é uma alternativa - desde que retorne o dado no bit0. Consulte no help da função o que ela retorna.

 

E de novo não se contente com simples ctrl-c ctrl-v. Entenda. Seu voo vai ser + alto.

😁

  • Curtir 1
Postado

obrigado a todos  pelo apoio e paciência, em relação ao  (digitalWrite(led_azul, HIGH)); eu ja havia renomeado ele (#define led_azul 2) e coloquei como saida (pinMode led_azul, OUTPUT); por isso usei o mesmo nome para montar o programa, o problema esta no else pois se eu usar a lógica if e else, o else fica atrelado a esse if, quando se usa a lógica 1 ou 0 fica mais fácil pois o contrario de 1 automaticamente é zero, mas no RFID se a tag for a salva no programa ele executa o if mas, o else só entra se haver uma leitura de outra tag não cadastrada, realizei o teste com a linha  de comando abaixo, o led ascende com a aproximação da tag, e so apaga quando passo outra tag não cadastrada, o grande problema esta em fazer o else reconhecer quando não tem tag nenhuma no sensor e não apenas quando tem uma tag não cadastrada. 

 

if (strID.indexOf("FF:E5:9E:59") >= 0) { //SE O ENDEREÇO DA TAG LIDA FOR IGUAL AO ENDEREÇO INFORMADO, FAZ

   digitalWrite(led_azul, HIGH);
       }
        else{ digitalWrite(led_azul, LOW);}
        

 

  • Curtir 1
  • Membro VIP
Postado
25 minutos atrás, picmoretto disse:

o led ascende com a aproximação da tag, e so apaga quando passo outra tag não cadastrada, o grande problema esta em fazer o else reconhecer quando não tem tag nenhuma no sensor e não apenas quando tem uma tag não cadastrada. 

Neste caso só mesmo com uma boa lida nos helps das funções de rfid. Todas. Uma delas pode ser a que você quer. Caso não tenha (pouco provável), ve se aumenta o consumo de sua vcc com sua presença. Monitore a corrente.

  • Curtir 2
Postado
Em 29/10/2020 às 19:59, picmoretto disse:

o led ascende com a aproximação da tag, e so apaga quando passo outra tag não cadastrada, o grande problema esta em fazer o else reconhecer quando não tem tag nenhuma no sensor e não apenas quando tem uma tag não cadastrada. 

 


if (strID.indexOf("FF:E5:9E:59") >= 0) { //SE O ENDEREÇO DA TAG LIDA FOR IGUAL AO ENDEREÇO INFORMADO, FAZ

   digitalWrite(led_azul, HIGH);
       }
        else{ digitalWrite(led_azul, LOW);}
        

 

Acho que a função salva o cartão na função strID até que outra seja lida.
Já tentou colocar uns seriais ouput para monitorar o valor da variável? Ou então pluga um lcd e a cada loop joga o resultado dessa função no lcd para verificar quando ele zera a leitura

  • Curtir 1
Postado

Olha este exemplo
https://stackoverflow.com/questions/52032537/how-to-execute-code-once-only-when-an-rfid-card-is-present-or-not

Pelo que entendi, 
-[nome da variavel].PICC_IsNewCardPresent() é um teste lógico se um cartão foi lido
-[nome da variavel].PICC_ReadCardSerial() é um teste lógico se você leu o mesmo cartão da última vez

Creio que você deve fazer isso:

If (rfid.PICC_IsNewCardPresent()) {//entra quando é lido um cartão novo

	if (strID.indexOf("FF:E5:9E:59") >= 0) { //SE O ENDEREÇO DA TAG LIDA FOR IGUAL AO ENDEREÇO INFORMADO, FAZ

   		digitalWrite(led_azul, HIGH);
       	}
    else{ digitalWrite(led_azul, LOW);} // desliga o LED se o cartão lido é diferente do seu
else{ digitalWrite(led_azul, LOW);} //desliga o LED se não houver leitura de um cartão novo

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!