// Projeto: Cancela Controlada por RFID
// Autor: André Silveira
// Data: 03/09/2019
#include "Wire.h" // Biblioteca para Comunicação I2C
#include "Adafruit_GFX.h" // Biblioteca para processamento gráfica
#include "Adafruit_SSD1306.h" // Biblioteca do controlador SSD1306 (128x64 e 128x32)
#include "SPI.h" // Biblioteca comunicação SPI
#include "MFRC522.h" // Biblioteca RFID RC522
#include "Servo.h" // Biblioteca Servo Motor
Adafruit_SSD1306 display = Adafruit_SSD1306();
#define SDA_PIN 10 // Pino SDA
#define RST_PIN 9 // Pino RESET
MFRC522 rfid(SDA_PIN, RST_PIN); // Define pinos para Módulo RFID
Servo servo1; // Cria objeto Servo
int pos; // Variável posição Servo
const int PinoLedVerde = 2; // Pino digital do LED Verde
const int PinoLedVermelho = 3; // Pino digital do LED Vermelho
const int PinoServo = 6; // Pino digital do Servo Motor
byte CancelaFechada = 74; // Ângulo para cancela fechada
byte CancelaAberta = 174; // Ângulo para cancela aberta
void setup(){
Serial.begin(9600);
Serial.println("Aproxime o seu cartao do leitor...");
Serial.println();
Wire.begin(); // INICIALIZA A BIBLIOTECA WIRE
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicializa a tela com endereço I2C 0x3C
display.setTextColor(WHITE); // Define cor do texto
display.setRotation(0); // Configura orientação 0
display.setTextSize(1); // Tamanho do texto
display.clearDisplay(); // Limpa a tela
display.setCursor(14,10); // Posição cursor
display.print("Supermercado"); // Escreve
display.display(); // Efetiva escrita
SPI.begin(); // Inicializa barramento de comunicação SPI
rfid.PCD_Init(); // Inicializa RFID MFRC522
servo1.attach(PinoServo); // Associa pino digital ao Servo
servo1.write(74); // Inicializa Servo na posição Cancela Fechada
pinMode(PinoLedVerde, OUTPUT); // Pino LED Verde como saída
pinMode(PinoLedVermelho, OUTPUT); // Pino LED Vermelho como saída
digitalWrite(PinoLedVerde, LOW); // LED deslidado
digitalWrite(PinoLedVermelho, LOW); // LED deslidado
}
void loop() {
leituraRfid(); // Chama função para validar TAG RFID
}
/* --- Função para validar TAG RFID --- */
void leituraRfid(){
/* --- Verifica se cartão é diferente do último lido --- */
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
return;
}
Serial.println("");
Serial.println("Aguarde um momento");
display.clearDisplay(); // Limpa display
display.setCursor(40,0); // Posiciona cursor
display.print("Aguarde"); // Escreve texto
display.setCursor(50,10); // Posiciona cursor
display.print("por"); // Escreve texto
display.setCursor(30,20); // Posiciona cursor
display.print("favor..."); // Escreve texto
display.display(); // Efetiva escrita
delay(40);
/* --- Monta TAG RFID lida --- */
String strID = "";
for (byte i = 0; i < 4; i++) {
strID += (rfid.uid.uidByte[i] < 0x10 ? "0" : "") + String(rfid.uid.uidByte[i], HEX) + (i!=3 ? ":" : "");
}
strID.toUpperCase();
/* --- Valida endereço da TAG lida comparando com o valor "D0:64:BB:4F" --- */
/* --- O endereço "D0:64:BB:4F" deve ser substituído pelo endereço da sua TAG RFID --- */
Serial.println("");
Serial.print("Identificador (UID) da tag: ");
Serial.println(strID); // Imprime na serial o ID da TAG RFID
if (strID.indexOf("CB:F0:03:C5") >= 0 || strID.indexOf("A6:50:22:7E") >= 0) {
Serial.println("");
Serial.println("Acesso autorizado, cancela abrindo");
digitalWrite(PinoLedVerde, HIGH); // Liga LED Verde
display.clearDisplay(); // Limpa display
display.setCursor(45,5); // Posiciona cursor
display.print("Acesso"); // Escreve texto
display.setCursor(35,15); // Posiciona cursor
display.print("Autorizado"); // Escreve texto
display.display(); // Efetiva escrita
delay(4000); // Aguarda 4 segundos
abrirCancela(); // Abre cancela
delay(10000); // Aguarda 10 segundos
fecharCancela(); // Fecha cancela
digitalWrite(PinoLedVerde, LOW); // Desliga LED Verde
}else{
Serial.println("Acesso negado");
digitalWrite(PinoLedVermelho, HIGH); // Liga LED Vermelho
display.clearDisplay(); // Limpa display
display.setCursor(45,5); // Posiciona cursor
display.print("Acesso"); // Escreve texto
display.setCursor(45,15); // Posiciona cursor
display.print("Negado"); // Escreve texto
display.display(); // Efetiva escrita
delay(10000); // Aguarda 10 segundos
digitalWrite(PinoLedVermelho, LOW); // Desliga LED Verde
display.clearDisplay(); // Limpa display
display.setCursor(14,10); // Posiciona cursor
display.print("MasterWalker Shop"); // Escreve texto
display.display(); // Efetiva escrita
}
rfid.PICC_HaltA(); // Para leitura do cartão
rfid.PCD_StopCrypto1(); // Para criptografia
}
/* --- Função para abrir Cancela --- */
void abrirCancela(){
for (pos = CancelaFechada; pos < CancelaAberta; pos++){
servo1.write(pos); // Posição que o servo deve girar
delay(15); // Intervalo de 15 Milisegundos
}
}
/* --- Função para fechar Cancela --- */
void fecharCancela(){
Serial.println("");
Serial.println("Fechando cancela"); // Escreve
for (pos = CancelaAberta; pos >= CancelaFechada; pos--) {
servo1.write(pos); // Posição que o servo deve girar
delay(15);
}
display.clearDisplay(); // Limpa informações do display
display.setCursor(14,10); // Posiciona cursor para escrever
display.print("Supermercado"); // Escreve
display.display(); // Efetiva escrita
}
|