Exemplo de Módulo Leitor Rfid Mfrc522 Mifare com Módulo Cartão SD Card (usando cartão SD como banco de dados)

Depois de algum tempo na frente de meu computador buscando uma solução viável para a implantação de um banco de dados de grande capacidade para Arduíno, criei um código que faz o que eu queria.

Fiz pesquisas na internet procurando encontrar uma luz para este problema mas nada encontrei, ai tive que por a mão na massa.

Funcionamento:

O usuário aproxima o cartão do leitor RFID, a tag lida do cartão é comparado com as tags cadastradas no cartão SD, e retorna informando se o cartão esta cadastrado ou não.

Caso o cartão esteja cadastrado ele também informa o nome do usuário que esta ligado a aquele cartão.

Decidi divulgar pois tudo que aprendi em Arduíno foi através de tutoriais da internet.

Obs. O código pode e deve ser melhorado, não fiz comentários nas linhas por falta de tempo e paciência!

\\------------------------------------------------------------------------------------------------------------

#include <SD.h>
File myFile;
#include <SPI.h>
#include <MFRC522.h>
MFRC522 mfrc522(10, 9);
int x = 0;
byte sel = 0;
byte c1 = 0;
byte c2 = 0;
byte c3 = 0;
String status = "";
String cconteudo = "";
String usuario = "";
String nome = "";
char caractere;
char carac;

void setup() {
Serial.begin(9600);
SPI.begin();
if (SD.begin(4)) {
myFile = SD.open("rfid.txt");
if (myFile) {
while (myFile.available()) {
for (x; myFile.read() == 13; x++) {
delay(10);
}
}
}
else {
Serial.println("Falha ao abrir banco de dados");
}
Serial.print(x);
Serial.println(" usuarios cadastrados: ");
myFile.close();
!SD.begin(4);
}
}


void loop() {
mfrc522.PCD_Init();
while (sel == 0) {
Serial.println("Aproxime o seu cartao do leitor...");
cconteudo = "";
while ( ! mfrc522.PICC_IsNewCardPresent()) {
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
for (byte i = 0; i < mfrc522.uid.size; i++) {
cconteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
cconteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
}
cconteudo.toUpperCase();
cconteudo.trim();
mfrc522.PICC_HaltA();

myFile = SD.open("rfid.txt");
if (myFile) {
while (myFile.available() && (c2 == 0)) {
caractere = 0;
while (myFile.available() && (caractere != ';') && (caractere != 13) && (c1 == 0)) {
caractere = myFile.read();
if ((caractere != ';') && (caractere != 13)) {
usuario.concat(caractere);
}
}
usuario.trim();
if ((cconteudo == usuario ) && (c1 == 0) ) {
status = "Usuario encontrado";
Serial.println(status);
c1 = 1;
c3 = 1;
}
else {
usuario = "";
status = "Usuario nao encontrado ";
}
if (c3 == 1) {
carac = 0;
while (myFile.available() && (carac != 13) && (c3 == 1)) {
carac = myFile.read();
if ((carac != 13) && (carac != ';')) {
nome.concat(carac);
}
delay(10);
}
nome.trim();
if (c3 == 1) {
c3 = 0;
c2 = 1;
sel = 1;
}
}

}

}
else {
Serial.println("Falha ao abrir banco de dados");
}
if (status != "Usuario encontrado") {
Serial.println(status);
}

}
myFile.close();
Serial.print("Bem vindo ");
Serial.println(nome);
delay(2000);

}

\\---------------------------------------------------------------------------------------------------------------------------------------------

Arquivo rfid.txt contido no cartão de memoria (primeiro vai as tag dos cartões e após o nome do usuário do cartão.

11 22 33 44;nome1
22 22 33 44;nome2
31 11 22 33;nome3
22 33 54 22;nome4
12 22 33 33;nome5
32 44 12 99;nome6
32 68 11 12;nome7
88 99 11 74;nome8
51 88 99 33;nome9
33 F2 0D 01 ;Daniel Baltazar Schneider
12 P2 00 33;nome11
12 33 55 I7;nome12
88 99 33 55;nome13

\\----------------------------------------------------------------------------------------------------------------------------------------------

Alguma duvida ou sugestão? comente.

Exibições: 2879

Responder esta

Respostas a este tópico

Chique demais amigo! Obrigado por compartilhar.

Vc já pensou na possibilidade de tornar esse seu projeto mais ambicioso?

Vamos imaginar um cenário onde esse controle por RFID tenha que ser posto em vários locais (várias portas de acesso a um determinado local, ou várias bombas de combustível que tenham que ser liberadas mediante o cartão do funcionário autorizado, etc)

Se ficar dependendo de SD card pra consultar os usuários autorizados, vc terá um trabalho chato pra manter essa lista (adicionar, excluir, editar, etc). Que tal dar um passo além, dessa vez usando um banco de dados externo, tipo mysql. Dessa forma, o conjunto arduino + ethernet shield + módulo leitor RFID fariam a consulta nessa referido banco de dados, que seria mais facilmente gerenciado pelo administrador. Com o banco de dados externo, vc também teria a possibilidade de criar um sistema de registro de log de acessos, log de falhas

Sabias palavras.

Esse sistema de armazenamento de tags dos usuários no cartão SD é ideal para projetos fixos como um exemplo o controle da fechadura de uma unica porta.

Estou trabalhando em um projeto que será necessário o cartão SD para banco de dados, pois nele nem sempre o WIFI Shield terá acesso a rede. O SD card guardara os usuários autorizados e quando entrar dentro da área de cobertura sera feita a atualização automática dos usuários autorizados. Nesse projeto também usarei um GPS Shield. Agora não sei se o Arduíno vai dar conta de tudo isso.

bem pensado, amigo. Como nem sempre garante-se 100% de conectividade entre o conjunto arduino + leitor RFID  + ethernet shield, o uso de SD card para armazenamento dos dados aliado a sincronização quando houver conectividade é uma bela solução.

Amigo

To com problemas para gravar um cartão rfid virgem, ou alterar a tag de um cartão já gravado.

Você tem uma ideia de como posso fazer isso?

Não tenho experiência com rfid. Tenho uns aqui, mas ainda não me animei em mexer com eles.

Olá Daniel, tudo bem ?

Estou com um projeto que a principio é similiar ao seu, a diferença é que ao invés de gravar e ler a tag no SD ou PIC eu preciso utilizar banco de dados mysql + conexão 3g pois os equipamentos ficaram fora da empresa e toda vez que for acionado com o uso do cartão o sistema ira consultar o saldo (crédito pré pago) no cartão para liberar ou não o uso do equipamento, estou a procura de algum profissional para nos ajudar a concluir esse projeto, atualmente eu consigo fazer a comunicação via SMS entre o equipamento e o servidor, preciso mudar para comunicação via pacote de dados além de alguns incrementos, estou a procura de um freelancer para essa tarefa

Olá.

Infelizmente atualmente me encontro muito ocupado, o curso de graduação esta me exigindo muito tempo.

Seu problema, acredito que não seja difícil de resolver. Desculpe-me mas por enquanto não conseguirei ajudar.

O seu projeto é muito interessante,  eu também gostaria de executá-lo um dia.

Boa sorte com o projeto amigo. 

Olá muito obrigado para o ensino. Eu tenho um problema com o código, quando encontra o usuário imprime o nome, mas não pede a passagem de outro cartão. tentar encontrar uma solução, mas eu não posso estou estudando programação. desde já muito obrigado

Amigo boa noite, Teria como você postar o esquema eletrônico, pois estou com o problema de quando ligo o SD não funciona o RC522 e vise versa.

Quero ver no que estou errando.

Beleza amigo.

Vou fazer um esquema usando o fritzing e postarei aqui.

 

Boa tarde,

gostaria de saber se você poderia divulgar o esquema com as ligações?

Estava tentando fazer algo parecido.

Porém tive a dificuldade ao ver que utilizaria as mesmas portas para o leitor e para o SD. 

Fico no aguardo.

Desde já agradeço. :)

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço