Font Size

Olá, tudo bem? Hoje voltaremos a trabalhar com a tecnologia RFID através de uma aplicação onde estaremos gravando dados no cartão RFID.

Basicamente, iremos utilizar as nossas tags que você adquiriu com o nosso Módulo Leitor RFID MFRC522 e gravar dados como o nosso nome ou horários, por exemplo.

Além disso, é importante que você já tenha visto o nosso post onde explicamos detalhadamente o funcionamento dessa tecnologia. Nele, toda a explicação do esquema de ligação que iremos utilizar no projeto de hoje. Clique então no botão abaixo para acessá-lo.

Detalhes importantes

Em primeiro lugar, fique calmo. Porque antes de começarmos a colocar a mão na massa, é importante esclarecer alguns pontos importantes e também dúvidas que podem surgir. A primeira dúvida é com relação aos dados que veio com a sua tag. Essas informações irão sumir sim. Então é importante você utilize uma tag “reserva”.

Em segundo lugar, fique atento. Pois uma dúvida que sempre surge é com relação a distância segura para realizar a leitura da tag, a resposta para essa dúvida é que ele tem uma distância pequena, até 5 cm.

Outro ponto importante é em relação a cartões que utilizam essa tecnologia, isso porque essa experiência pode danificar eternamente cartões de passe, crédito, pulseiras e crachás. Portanto, deixe bem longe da experiência esses itens.

Gravando no cartão RFID – Componentes do Projeto

Montagem do Circuito

Antes de tudo, vamos partir para a ligação do esquemático de hoje que é praticamente a mesma utilizada no post onde explicamos a utilização do módulo RFID. 

Entretanto, o pequeno adicional que fizemos foi de colocar dois push button para indicar o que nosso módulo deve fazer (ler / gravar). Contudo, você pode trocar os push button por outros componentes que trabalham como interruptores.

gravando-no-cartao-rfid
Esquema de ligação ao Arduino

Código do Projeto Comentado

Antes de mais nada, mais um aviso, esse é o último, eu juro! Se você viu em nosso post sobre o módulo RFID, é preciso instalar uma biblioteca para utilizá-lo. Então, caso não tenha baixado ela, clique no botão abaixo e realize a sua instalação.

<code>/*
    Projeto: Realizando leitura e gravação de cartões RFID
    Autor: Danilo Nogueira - AutoCore Robótica
    Data: 04/02/2020
    Código de Dominio Público.
 */

// ==================================================================================================*/
// --- Declaração Bibliotecas ---

#include &lt;SPI.h&gt;            // Biblioteca para realizar a comunicação
#include &lt;MFRC522.h&gt;        // Biblioteca para utilizar os comandos do módulo
#include &lt;LiquidCrystal.h&gt;  // Biblioteca do display LCD

// ==================================================================================================
// --- Declaração das Variáveis ---

// Pinos de pin_ss e Reset do módulo MFRC522
int pin_ss = 10;
int pin_reset = 9;
MFRC522 moduloRFID(pin_ss, pin_reset);  // Criando um objeto 'moduloRFID' da classe MFRC522.
 
LiquidCrystal lcd(6, 7, 5, 4, 3, 2);  // Iniciando o objeto 'lcd' com os pinos do dispay.

// Pinos dos push button utilizados.
float btn_leitura = A0;
float btn_gravar = A1;

// Variável para trabalharmos com a chave de acesso da TAG.
MFRC522::MIFARE_Key key;

// ==================================================================================================
// --- Configurando o void setup() ---

void setup()
{
  pinMode(btn_leitura, INPUT);
  pinMode(btn_gravar, INPUT);
  
  Serial.begin(9600);   // Inicia a serial
  SPI.begin();          // Inicia o barramento SPI
  
  // Iniciando o módulo
  moduloRFID.PCD_Init();
 
  //Inicializa o LCD 16x2
  lcd.begin(16, 2);
  mensageminicial();
 
  //Prepara chave - padrao de fabrica = FFFFFFFFFFFFh
  for (byte i = 0; i &lt; 6; i++) key.keyByte[i] = 0xFF;
}

// ==================================================================================================
// --- Configurando o void loop() ---

void loop()
{
  
  /* Agora dentro no loop, devemos sempre estar verificando
  *  qual botão foi pressionado. Para então, dizer ao
  *  módulo o que ele deve fazer.
  */ 
  
  // Verificando se o botão leitura foi pressionado
  int modo_le = digitalRead(btn_leitura);
  delay(150);
  if (modo_le != 0)
  {
    lcd.clear();
    Serial.println("Modo leitura selecionado");
    
    lcd.setCursor(2, 0);
    lcd.print("Modo leitura");
    
    lcd.setCursor(3, 1);
    lcd.print("selecionado");
    
    while (digitalRead(btn_leitura) == 1) {}
    delay(3000);
    
    // Chamanda a função 'modo_leitura'
    modo_leitura();
  }
  
  
  // Verificando se o botao gravacao foi pressionado
  int modo_gr = digitalRead(btn_gravar);
  if (modo_gr != 0)
  {
    lcd.clear();
    Serial.println("Modo gravacao selecionado");
    
    lcd.setCursor(2, 0);
    lcd.print("Modo gravacao");
    
    lcd.setCursor(3, 1);
    lcd.print("selecionado");
    
    while (digitalRead(btn_gravar) == 1) {}
    delay(3000);
    modo_gravacao();
  }
} // fim void loop

// ==================================================================================================
// --- Configurando as funções ---

void mensageminicial()
{
  Serial.println("Selecione o modo do operação leitura ou gravacao...");
  Serial.println();
  
  lcd.clear();
  lcd.print("Selecione o modo");
  
  lcd.setCursor(0, 1);
  lcd.print("leitura/gravacao: ");
}
 
void mensagem_inicial_cartao()
{
  Serial.println("Aproxime o seu cartao do leitor...");
  lcd.clear();
  lcd.print(" Aproxime o seu");
  lcd.setCursor(0, 1);
  lcd.print("cartao do leitor");
}
 
void modo_leitura()
{
  // chama a função 'mensagem_inicial_cartao'
  mensagem_inicial_cartao();
  
  //Aguarda o cartao ser aproximado
  while ( ! moduloRFID.PICC_IsNewCardPresent())
  {
    delay(100);
  }
  if ( ! moduloRFID.PICC_ReadCardSerial())
  {
    return;
  }
  
  //Mostra UID na serial
  Serial.print("UID da tag : ");
  
  String conteudo = "";
  byte letra;
  
  // Realiza a leitura de todo o conteúdo da TAG
  for (byte i = 0; i &lt; moduloRFID.uid.size; i++)
  {
    Serial.print(moduloRFID.uid.uidByte[i] &lt; 0x10 ? " 0" : " ");
    Serial.print(moduloRFID.uid.uidByte[i], HEX);
    
    // Agrupando o conteudo lido
    conteudo.concat(String(moduloRFID.uid.uidByte[i]&lt;0x10 ? " 0" : " "));
    conteudo.concat(String(moduloRFID.uid.uidByte[i], HEX));
  }
  Serial.println();
 
  // Obtem os dados do setor 1, bloco 4 = Nome
  byte sector         = 1;
  byte blockAddr      = 4;
  byte trailerBlock   = 7;
  byte status;
  byte buffer[18];
  byte size = sizeof(buffer);
 
  // Autenticacao usando chave inicial do código
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                  trailerBlock, &amp;key, &amp;(moduloRFID.uid));
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
  
  // Realiza a leitura do block (que nesse caso é o bloco 4)
  status = moduloRFID.MIFARE_Read(blockAddr, buffer, &amp;size);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Read() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
  }
  
  // Mostra os dados do nome no Serial Monitor e LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.print("O nome cadastrado foi: ");
  
  // Os valores lido em 'status' serão convertidos e mostrados no display
  for (byte i = 1; i &lt; 16; i++)
  {
    Serial.print(char(buffer[i]));
    lcd.write(char(buffer[i]));
  }
 
  // Obtem os dados do setor 0, bloco 1 = Sobrenome
  sector         = 0;
  blockAddr      = 1;
  trailerBlock   = 3;
 
  // Autenticacao usando chave inicial
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                  trailerBlock, &amp;key, &amp;(moduloRFID.uid));
  
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
  
  status = moduloRFID.MIFARE_Read(blockAddr, buffer, &amp;size);
  
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print(F("MIFARE_Read() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
  }
  
  // Mostra os dados do sobrenome no Serial Monitor e LCD
  lcd.setCursor(0, 1);
  
  for (byte i = 0; i &lt; 16; i++)
  {
    Serial.print(char(buffer[i]));
    lcd.write(char(buffer[i]));
  }
  Serial.println();
 
  // Halt PICC
  moduloRFID.PICC_HaltA();
  
  // Stop encryption on PCD
  moduloRFID.PCD_StopCrypto1();
  
  // Espera 3 segundos e inicia a verificação
  delay(3000);
  mensageminicial();
}
 
void modo_gravacao()
{
  mensagem_inicial_cartao();
  
  //Aguarda cartao
  while ( ! moduloRFID.PICC_IsNewCardPresent()) {
    delay(100);
  }
  if ( ! moduloRFID.PICC_ReadCardSerial())    return;
 
  //Mostra UID na serial
  Serial.print(F("UID do Cartao: "));    //Dump UID
  for (byte i = 0; i &lt; moduloRFID.uid.size; i++)
  {
    Serial.print(moduloRFID.uid.uidByte[i] &lt; 0x10 ? " 0" : " ");
    Serial.print(moduloRFID.uid.uidByte[i], HEX);
  }
  
  // Mostra o tipo do cartao
  Serial.print(F("nTipo do PICC: "));
  byte piccType = moduloRFID.PICC_GetType(moduloRFID.uid.sak);
  Serial.println(moduloRFID.PICC_GetTypeName(piccType));
 
  byte buffer[34];
  byte block;
  byte status, len;
 
  Serial.setTimeout(20000L) ;
  Serial.println(F("Digite o sobrenome + o caractere #"));
  
  lcd.clear();
  lcd.print("Digite o sobreno");
  
  lcd.setCursor(0, 1);
  lcd.print("me + #");
  
  // Guarda todo o texto antes de '#' na variavel 'buffer'
  len = Serial.readBytesUntil('#', (char *) buffer, 30) ;
  for (byte i = len; i &lt; 30; i++) buffer[i] = ' ';
 
  // Gravando o sobrenome no bloco 1 (que depois iremos ler também no bloco 1)
  block = 1;
  
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                    block, &amp;key, &amp;(moduloRFID.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  // Gravando no bloco selecionado (1)
  status = moduloRFID.MIFARE_Write(block, buffer, 16);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  // Agora selecionamos o bloco 2 para a gravação
  block = 2;
  
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                    block, &amp;key, &amp;(moduloRFID.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  // Gravando no bloco selecionado (2)
  status = moduloRFID.MIFARE_Write(block, &amp;buffer[16], 16);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  Serial.println(F("Digite o nome + o caractere #"));
  
  lcd.clear();
  lcd.print("Digite o nome e");
  
  lcd.setCursor(0, 1);
  lcd.print("em seguida #");
  
  // Segue o mesmo esquema que usamos para armazenos o valor do sobrenome
  len = Serial.readBytesUntil('#', (char *) buffer, 20) ;
  for (byte i = len; i &lt; 20; i++) buffer[i] = ' ';
 
  // Agora vamos gravar nos blocos 4 e 5 o nosso nome
  block = 4;
  
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                    block, &amp;key, &amp;(moduloRFID.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  // Gravando no bloco 4
  status = moduloRFID.MIFARE_Write(block, buffer, 16);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  block = 5;
  
  status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
                                    block, &amp;key, &amp;(moduloRFID.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    return;
  }
 
  // Gravando no bloco 5
  status = moduloRFID.MIFARE_Write(block, &amp;buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(moduloRFID.GetStatusCodeName(status));
    //return;
  }
  
  // Se tudo ocorreu bem, aparece a mensagem abaixo no display
  else
  {
    Serial.println(F("Parabéns, os seus dados foram gravados com sucesso!"));
    lcd.clear();
    lcd.print("Gravacao OK!");
  }
 
  moduloRFID.PICC_HaltA(); // Halt PICC
  moduloRFID.PCD_StopCrypto1();  // Stop encryption on PCD
  
  // Após 5 segundos, realiza novamente a verificação
  delay(5000);
  mensageminicial();
}</code>

Resultado do Projeto

Por fim, para finalizar o projeto de hoje, deixo abaixo o vídeo de nosso canal mostrando o funcionamento de todo o projeto.

https://youtu.be/X7MzD65Sq2Y

Gostou do post? Caso tenha ficado algo incompleto para você, comente abaixo 📝

Dicas? Dúvidas? 🤔 Críticas? 😱 Só comentar abaixo! 👇

Forte abraço e compartilha se gostou! 🤘

2.00 avg. rating (48% score) - 5 votes