Arduino RFID + Nanoshield Ethernet Network Communication Conflict Problem

Asked

Viewed 472 times

1

Good afternoon, I have a difficulty in creating an Arduino program that reads an RFID TAG and validates the TAG in a mysql database. I have tried several ways, but to no avail. 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 stops working. I believe it is some kind of communication conflict because both RFID and the Network use the SPI of the Antarctic.

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 scheme

inserir a descrição da imagem aqui

Electronic schematic RFID RC522 x Arduino inserir a descrição da imagem aqui

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.