#include <SPI.h> // Biblioteca para comunicação SPI.
#include <MFRC522.h> // Biblioteca para trabalhar com o módulo RFID MFRC522.
#include <Preferences.h> // Biblioteca para manipulação de preferências (memória não volátil) no ESP32.
#include <ESP32Servo.h> // Biblioteca para controle de servomotor no ESP32.
#define SS_PIN 5 // Define o pino de seleção de escravo (SS) para o módulo RFID.
#define RST_PIN 4 // Define o pino de reset para o módulo RFID.
MFRC522 rfid(SS_PIN, RST_PIN); // Cria uma instância do objeto MFRC522 com os pinos definidos.
#define ledRed 13 // Define o pino do LED vermelho.
#define ledGreen 12 // Define o pino do LED verde.
#define button 14 // Define o pino do botão.
int buttonState = 0; // Variável para armazenar o estado do botão.
bool admMode = false; // Variável para indicar o modo de administrador.
Preferences cards; // Cria uma instância do objeto Preferences para armazenar os IDs dos cartões.
String cardID = ""; // String para armazenar o ID do cartão lido.
#define Servo_PIN 26 // Define o pino para o controle do servomotor.
Servo servo; // Cria uma instância do objeto Servo.
void setup() {
Serial.begin(115200); // Inicializa a comunicação serial a 115200 bps.
SPI.begin(); // Inicializa a comunicação SPI.
rfid.PCD_Init(); // Inicializa o leitor RFID.
cards.begin("Cards", false); // Inicializa o armazenamento de preferências com o nome "Cards".
pinMode(ledRed, OUTPUT); // Define o pino do LED vermelho como saída.
pinMode(ledGreen, OUTPUT); // Define o pino do LED verde como saída.
pinMode(button, INPUT); // Define o pino do botão como entrada.
servo.attach(Servo_PIN); // Anexa o servomotor ao pino definido.
servo.write(0); // Define a posição inicial do servomotor para 0 graus.
}
bool RFIDRead() {
if (!rfid.PICC_IsNewCardPresent()) return false; // Verifica se há um novo cartão presente.
if (!rfid.PICC_ReadCardSerial()) return false; // Lê o ID do cartão.
cardID = ""; // Limpa a string do ID do cartão.
for (int i = 0; i < rfid.uid.size; i++) {
cardID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ")); // Adiciona um zero à esquerda se necessário.
cardID.concat(String(rfid.uid.uidByte[i], HEX)); // Adiciona o byte do ID em formato hexadecimal.
}
cardID.toUpperCase(); // Converte o ID para maiúsculas.
Serial.println(cardID); // Imprime o ID do cartão no serial.
rfid.PICC_HaltA(); // Interrompe a comunicação com o cartão.
return true; // Retorna true indicando que um cartão foi lido.
}
bool CheckCardID(String idCard) {
bool isCardID;
if (cards.getString(idCard.c_str()) != "") { // Verifica se o ID do cartão está armazenado nas preferências.
isCardID = true; // Define que o cartão é válido.
Serial.println(cards.getString(idCard.c_str())); // Imprime o valor armazenado para o cartão.
} else {
isCardID = false; // Define que o cartão não é válido.
}
return isCardID; // Retorna o status do cartão.
}
void SaveCardID(String idCard) {
cards.putString(idCard.c_str(), "Card"); // Salva o ID do cartão nas preferências.
String m = "Cartão " + idCard + " foi salvo com sucesso!!!"; // Mensagem de sucesso.
Serial.println(m); // Imprime a mensagem no serial.
}
void DeleteCardID(String idCard) {
String m;
if (cards.remove(idCard.c_str())) { // Remove o ID do cartão das preferências.
m = "Cartão " + idCard + " foi removido com sucesso!!!"; // Mensagem de sucesso.
} else {
m = "Não foi possivel remover o cartão."; // Mensagem de erro.
}
Serial.println(m); // Imprime a mensagem no serial.
}
void loop() {
buttonState = digitalRead(button); // Lê o estado do botão.
if (buttonState) {
admMode = true; // Ativa o modo de administrador se o botão estiver pressionado.
}
while (admMode) {
digitalWrite(ledRed, !digitalRead(ledRed)); // Pisca o LED vermelho.
digitalWrite(ledGreen, !digitalRead(ledGreen)); // Pisca o LED verde.
delay(200); // Atraso de 200 ms.
if (!RFIDRead()) return; // Tenta ler um cartão, retorna se não conseguir.
if (CheckCardID(cardID)) { // Verifica se o cartão já está armazenado.
DeleteCardID(cardID); // Remove o ID do cartão das preferências.
digitalWrite(ledRed, HIGH); // Acende o LED vermelho.
digitalWrite(ledGreen, LOW); // Apaga o LED verde.
admMode = false; // Desativa o modo de administrador.
delay(2000); // Atraso de 2 segundos.
digitalWrite(ledRed, LOW); // Apaga o LED vermelho.
} else {
SaveCardID(cardID); // Salva o ID do cartão nas preferências.
digitalWrite(ledRed, LOW); // Apaga o LED vermelho.
digitalWrite(ledGreen, HIGH); // Acende o LED verde.
admMode = false; // Desativa o modo de administrador.
delay(2000); // Atraso de 2 segundos.
digitalWrite(ledGreen, LOW); // Apaga o LED verde.
}
}
if (!RFIDRead()) return; // Tenta ler um cartão, retorna se não conseguir.
if (CheckCardID(cardID)) { // Verifica se o cartão é válido.
digitalWrite(ledGreen, HIGH); // Acende o LED verde.
servo.write(180); // Move o servomotor para 180 graus.
delay(2000); // Atraso de 2 segundos.
digitalWrite(ledGreen, LOW); // Apaga o LED verde.
servo.write(0); // Move o servomotor de volta para 0 graus.
} else {
digitalWrite(ledRed, HIGH); // Acende o LED vermelho.
delay(2000); // Atraso de 2 segundos.
digitalWrite(ledRed, LOW); // Apaga o LED vermelho.
}
}