domingo, 14 de agosto de 2016

Módulo rfid MFRC522 + ARDUINO + LCD 16x2 I2C




Nesse exemplo o primeiro cartão é lido e seu número de série é armazenado em uma variável.
Depois ao aproximar um cartão, este é lido e seu número é comparado com o número armazenado. Se forem iguais mostra a mensagem " ACESSO LIBERADO" caso contrário mostra "ACESSO NEGADO".
Como é um programa teste não me preocupei em armazenamento não volátil do número de série do cartão valido.  Para uso real será necessário, pro exemplo, alterar o código para armazenar o número de série do cartão "válido" na memoria eprom do arduino.

Material utilizado:

Módulo RFID MFRC522 (datasheet)
Arduino UNO (foi usado um similar)
Display LCD 16x2 com módulo I2C.
Jumpers

Ligação:




Código:

/* adaptado do codigo que acompanha a biblioteca MFRC522:
https://github.com/ljos/MFRC522

Este exemplo armazena o numero primeiro cartão lido em uma variavel
A partir ao aproximar um catão é feita a comparação entre o valor lido do cartão e o valor armazenado.
As informações são mostrada em um display 16x2 via comunicação I2C.
*/

// bibliotecas
#include <SPI.h>  // padrão do arduino
#include <MFRC522.h>  // necessário adicionar na pasta libraries do arduino
#include <Wire.h> // padrão do arduino
#include <LiquidCrystal_I2C.h> // necessário adicionar na pasta libraries do arduino

LiquidCrystal_I2C lcd(0x27,16,2);
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);    // cria uma intancia MFRC522 com o nome mfrc522

int *aux;
int card1[4];
int flag = 0;
int led = 13;
int cnt =0;

void setup() {
        pinMode(led, OUTPUT);
        
        lcd.init();
        lcd.backlight();
    SPI.begin();        // Init SPI bus
    mfrc522.PCD_Init();    // Init MFRC522 card
        lcd.print(" Aproxime o card");
        lcd.setCursor(0,1);
        lcd.print(" Para registro  ");
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Now a card is selected. The UID and SAK is in mfrc522.uid.
    
    // Dump UID
    
    for (byte i = 0; i < mfrc522.uid.size; i++) {
            aux[i]= mfrc522.uid.uidByte[i];
    } 
           if(flag == 0)
           {
             lcd.clear();
             lcd.print("   Card UID:    ");
             lcd.setCursor(0,1);
             for (byte i = 0; i < mfrc522.uid.size; i++) {
               card1[i] = aux[i];
             lcd.print( card1[i], DEC);
             lcd.print( " ");
             flag =1;
            }
           delay(3000);
           lcd.clear();
           lcd.print(" Aproxime o card");
           lcd.setCursor(0,1);
           lcd.print("  Para Acesso   ");
           } 

           else{
            
           
             for (byte i = 0; i < mfrc522.uid.size; i++) {
               if(aux[i] == card1[i])
                cnt++;
             }
                            
            if(cnt == mfrc522.uid.size-1)
            {
              lcd.clear();
              lcd.print("     ACESSO     ");
              lcd.setCursor(0,1);
              lcd.print("   PERMITIDO    ");
              delay(2000);
             }
             else
             {
              lcd.clear();
              lcd.print("     ACESSO     ");
              lcd.setCursor(0,1);
              lcd.print("     NEGADO     ");
              delay(2000);
             }
             
           }
           
           lcd.clear();
           lcd.print(" Aproxime o card");
           lcd.setCursor(0,1);
           lcd.print("  Para Acesso   ");
  cnt=0;
}