Ir ao conteúdo
  • Cadastre-se

Arduino função liga e desliga com RFID arduino


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...