Good afternoon, I'm having a hard time creating an arduino program that reads an RFID TAG and it does the validation of the TAG in a mysql database. I have tried many different ways, but without success. I first tested an RFID example that worked perfectly. Then I tested a network-only code and it also worked perfectly, but when I try to integrate the 2 codes to work together it will not work. I believe it is some kind of communication conflict because both RFID and the Network use the Arduino SPI.
Below is an example of the Arduino Source Code.
/*
-------- CONTROLE DE ACESSO RFID + BANCO DE DADOS------------------
===================================================================
Objetivo do programa é através de tags de RFID cadastradas em
um banco de dados mysql, permitir a entrada de funcionários em
determinado local caso o mesmo tenha permissão cadastrada.
=============================================================
By George in 14/12/2017
*/
//Bibliotecas
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <Nanoshield_Ethernet.h>
#include <Nanoshield_EEPROM.h>
#include <SD.h>
//Pinos
#define LED_VERDE 6
#define LED_VERMELHO 7
#define BUZZER 5
#define SS_PIN 2
#define RST_PIN 9
//#define RELE 5
#define BOTAO A0
#define SENSOR A2
#define REDE 10
char inString[32]; // string for incoming serial data
int stringPos = 0; // string index counter
boolean startRead = false; // is reading?
String uidTag = "";
String enderecoMac = "5410EC678A54"; // Mac da Placa de Rede Nanoshield w5500
String readString;
int portaLiberada = 0;
int contadorAtualizacao = 0;
char st[20];
String IDtag = ""; //Variável que armazenará o ID da Tag
bool Permitido = false; //Variável que verifica a permissão
//Vetor responsável por armazenar os ID's das Tag's cadastradas
//Utilizar esse vetor somente para realização de testes sem a conexão com banco de dados.
String TagsCadastradas[] = {"781417246",
"ID_2",
"ID_3"};
MFRC522 LeitorRFID(SS_PIN, RST_PIN); // Cria uma nova instância para o leitor e passa os pinos como parâmetro
byte mac[6];
Nanoshield_EEPROM eeprom(1, 1, 0, true);
IPAddress server(147,1,0,84); // numeric IP for Google (no DNS)
EthernetClient client;
void setup() {
Serial.begin(9600); // Inicializa a comunicação Serial
SPI.begin(); // Inicializa comunicacao SPI
LeitorRFID.PCD_Init(); // Inicializa o leitor RFID mfrc522
pinMode(LED_VERDE, OUTPUT); // Declara o pino do led verde como saída
pinMode(LED_VERMELHO, OUTPUT); // Declara o pino do led vermelho como saída
pinMode(BUZZER, OUTPUT); // Declara o pino do buzzer como saída
pinMode(SS_PIN, OUTPUT); // Declara o pino do SS_PIN do RFID como saída
pinMode(REDE, OUTPUT); // Declara o pino do REDE como saída
//pinMode(RELE, OUTPUT);
digitalWrite(LED_VERDE, HIGH);
digitalWrite(LED_VERMELHO, LOW);
//Abertura da comunicação de REDE
eeprom.begin();
eeprom.startReading(0x00FA);
Serial.println();
Serial.print("MAC address: ");
for (int i = 0; i < 5; i++) {
mac[i] = eeprom.read();
Serial.print(mac[i], HEX);
Serial.print(":");
}
mac[5] = eeprom.read();
Serial.println(mac[5], HEX);
Ethernet.begin(mac); //Inicializando dispositivo de rede
Serial.print("My IP address: ");
for (byte thisByte = 0; thisByte < 4; thisByte++) {
Serial.print(Ethernet.localIP()[thisByte], DEC);
Serial.print(".");
}
Serial.println("");
//Verifica a conexão do arduino com o servidor 84
if (client.connect(server, 80)) {
Serial.println("Servidor Conectado");
//client.println();
}
else{
Serial.println("connection failed");
}
}
void loop() {
Leitura(); //Chama a função responsável por fazer a leitura das Tag's
VerificaBotao(); //Verifica se o botão foi pressionado e libera a porta
}
void VerificaBotao(){
if (analogRead(BOTAO) > 900) {
while (analogRead(BOTAO) > 900) {
;
}
acessoLiberado();
}
}
void Leitura(){
IDtag = ""; //Inicialmente IDtag deve estar vazia.
// Verifica se existe uma Tag presente
if ( !LeitorRFID.PICC_IsNewCardPresent() || !LeitorRFID.PICC_ReadCardSerial() ) {
delay(50);
return;
}
// Pega o ID da Tag através da função LeitorRFID.uid e Armazena o ID na variável IDtag
for (byte i = 0; i < LeitorRFID.uid.size; i++) {
//IDtag.concat(String(LeitorRFID.uid.uidByte[i], HEX));
IDtag.concat(String(LeitorRFID.uid.uidByte[i]));
}
Serial.println(IDtag);
//Compara o valor do ID lido com os IDs armazenados no vetor TagsCadastradas[]
/*for (int i = 0; i < (sizeof(TagsCadastradas)/sizeof(String)); i++) {
if( IDtag.equalsIgnoreCase(TagsCadastradas[i]) ){
Permitido = true; //Variável Permitido assume valor verdadeiro caso o ID Lido esteja cadastrado
}
}*/
/////////////////////////Problema ocorre a partir da execução da função VerificaCodigoRfid()
String returnValue = "";
returnValue = VerificaCodigoRfid();
if(returnValue == "1"){
Permitido = true;
}else{
Permitido = false;
}
/////////////////////////Fim da bronca
if(Permitido == true) acessoLiberado(); //Se a variável Permitido for verdadeira será chamada a função acessoLiberado()
else acessoNegado(); //Se não será chamada a função acessoNegado()
delay(2000); //aguarda 2 segundos para efetuar uma nova leitura
}
void acessoLiberado(){
Serial.println("Executando Função acessoLiberado");
Serial.println("Tag Cadastrada: " + IDtag); //Exibe a mensagem "Tag Cadastrada" e o ID da tag não cadastrada
efeitoPermitido(); //Chama a função efeitoPermitido()
Permitido = false; //Seta a variável Permitido como false novamente
}
void acessoNegado(){
Serial.println("Executando Função acessoNegado");
Serial.println("Tag NAO Cadastrada: " + IDtag); //Exibe a mensagem "Tag NAO Cadastrada" e o ID da tag cadastrada
efeitoNegado(); //Chama a função efeitoNegado()
}
void efeitoPermitido(){
Serial.println("Executando Função efeitoPermitido");
int qtd_bips = 1; //definindo a quantidade de bips
for(int j=0; j<qtd_bips; j++){
//Ligando o buzzer com uma frequência de 1500 hz e ligando o led verde.
portaLiberada = 1;
tone(BUZZER,1500);
digitalWrite(LED_VERMELHO, HIGH);
digitalWrite(LED_VERDE, LOW);
delay(1000);
//Desligando o buzzer e led verde.
noTone(BUZZER);
digitalWrite(LED_VERMELHO, LOW);
digitalWrite(LED_VERDE, HIGH);
//returnValue == "0";
delay(500);
}
Serial.println("AUTORIZADO");
}
void efeitoNegado(){
Serial.println("Executando Função efeitoNegado");
int qtd_bips = 3; //definindo a quantidade de bips
for(int j=0; j<qtd_bips; j++){
//Ligando o buzzer com uma frequência de 500 hz e ligando o led vermelho.
tone(BUZZER,500);
digitalWrite(LED_VERMELHO, HIGH);
digitalWrite(LED_VERDE, LOW);
delay(100);
//Desligando o buzzer e o led vermelho.
noTone(BUZZER);
digitalWrite(LED_VERMELHO, LOW);
digitalWrite(LED_VERDE, HIGH);
delay(100);
}
}
//Faz a validação se o RFID está liberado para acessar o local
String VerificaCodigoRfid(){
Serial.println("Executando Função VerificaCodigoRfid");
client.print("GET /sisconp2/acesso/verificar_acesso.php?acao=verificar_acesso&rfid=");
client.print(IDtag);
client.println(" HTTP/1.1");
client.println("Host: 147.1.0.84");
client.println("Connection: keep-alive");
//client.println("Connection: close");
client.println();
return LerPagina();
}
//Faz a leitura da página para verificar se o acesso está liberado ou não
//Recebe o resultado na página de <0> ou <1>
String LerPagina(){
Serial.println("Executando Função LerPagina");
stringPos = 0;
memset( &inString, 0, 32 ); //clear inString memory
digitalWrite(REDE, LOW);
while(true){//passou aqui
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '<' ) { //'<' is our begining character
startRead = true; //Ready to start reading the part
}else if(startRead){
if(c != '>'){ //'>' is our ending character
inString[stringPos] = c;
stringPos ++;
}else{
startRead = false;
client.stop();
client.flush();
Serial.println("disconnecting.");
return inString;
}
}
}
}
}
Nanoshield x Arduino electronic schematic
RFIDRC522xArduinoelectronicschematic