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
- 01x Arduino UNO
- 01x KIT Módulo RFID
- 01x Protoboard
- 01x Display LCD
- 02X Push Botton
- 01x Potenciômetro de 10K
- Alguns Jumpers
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.
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 <SPI.h> // Biblioteca para realizar a comunicação
#include <MFRC522.h> // Biblioteca para utilizar os comandos do módulo
#include <LiquidCrystal.h> // 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 < 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 < moduloRFID.uid.size; i++)
{
Serial.print(moduloRFID.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(moduloRFID.uid.uidByte[i], HEX);
// Agrupando o conteudo lido
conteudo.concat(String(moduloRFID.uid.uidByte[i]<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, &key, &(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, &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 < 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, &key, &(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, &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 < 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 < moduloRFID.uid.size; i++)
{
Serial.print(moduloRFID.uid.uidByte[i] < 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 < 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, &key, &(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, &key, &(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, &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 < 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, &key, &(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, &key, &(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, &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.
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! 🤘
