#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
// Definindo os pinos do Leitor RFID
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
// Definindo o Motor da Porta
Servo portaServo;
// Definindo os pinos das Luzes (LEDs)
const int ledVerde = 2;
const int ledVermelho = 4;
// CADASTRO DOS DOIS CARTÕES AUTORIZADOS
String cartaoFuncionario = "27 01 2c a2";
String cartaoGerente = "e3 55 19 1a";
void setup() {
Serial.begin(9600);
SPI.begin(); // Inicia a comunicação SPI
rfid.PCD_Init(); // Liga o leitor RFID
portaServo.attach(5); // Liga o motor no pino 5
portaServo.write(0); // Porta começa FECHADA (0 graus)
// Configura os LEDs como saídas
pinMode(ledVerde, OUTPUT);
pinMode(ledVermelho, OUTPUT);
Serial.println("Sistema Pronto! Aproxime um cartao...");
}
void loop() {
// Espera aproximar um cartão
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
return;
}
// Lê o código do cartão aproximado
String tagLida = "";
for (byte i = 0; i < rfid.uid.size; i++) {
tagLida.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
tagLida.concat(String(rfid.uid.uidByte[i], HEX));
}
tagLida.trim();
// Mostra o código lido no Monitor Serial
Serial.print("Cartao Lido: ");
Serial.println(tagLida);
// ----- VERIFICAÇÃO DOS ACESSOS -----
if (tagLida == cartaoFuncionario) {
// CASO 1: FUNCIONÁRIO COMUM (LED Verde acende direto)
Serial.println("Acesso Permitido: Funcionario");
digitalWrite(ledVerde, HIGH); // Liga LED Verde
portaServo.write(90); // ABRE A PORTA
delay(3000); // Fica aberta por 3 segundos
portaServo.write(0); // FECHA A PORTA
digitalWrite(ledVerde, LOW); // Desliga LED Verde
}
else if (tagLida == cartaoGerente) {
// CASO 2: GERENTE / TI
// Como não tem som, para diferenciar do funcionário comum, o LED verde pisca antes de abrir!
Serial.println("Acesso Permitido: Gerente");
// LED Verde pisca duas vezes rápido (sinal VIP)
digitalWrite(ledVerde, HIGH); delay(150);
digitalWrite(ledVerde, LOW); delay(150);
digitalWrite(ledVerde, HIGH); delay(150);
portaServo.write(90); // ABRE A PORTA
delay(3000); // Fica aberta por 3 segundos
portaServo.write(0); // FECHA A PORTA
digitalWrite(ledVerde, LOW); // Desliga LED Verde
}
else {
// CASO 3: QUALQUER OUTRO CARTÃO (INTRUSO)
Serial.println("Acesso NEGADO!");
// LED Vermelho pisca 3 vezes em sinal de alerta/erro
for(int i=0; i<3; i++){
digitalWrite(ledVermelho, HIGH);
delay(300);
digitalWrite(ledVermelho, LOW);
delay(300);
}
}
rfid.PICC_HaltA(); // Reseta o leitor para a próxima leitura
}