Table of Contents

rfid-frequency-card-670-2.jpg

RFID Access System

Student: Sebastian Luțan

Grupa: 331CC

Introducere

Proiectul meu propune dezvoltarea unui sistem de acces utilizând tehnologia RFID, care asigură securitatea în spații private prin prevenirea accesurilor neautorizate.

Am ales să folosesc un microcontroller ESP32, care permite transmiterea datelor în timp real catre un server online, oferind utilizatorilor posibilitatea de a vizualiza istoricul intrărilor și ieșirilor.

Când o persoană dorește accesul, aceasta prezintă cartela RFID în fața cititorului. Cartela RFID conține un identificator unic (UID) care este transmis cititorului. După ce cititorul primește UID-ul, acesta îl transmite către microcontroller pentru verificare. Microcontroller-ul consultă baza de date pentru a confirma dacă UID-ul este înregistrat și are dreptul de acces.

În funcție de validitatea accesului, buzzer-ul va emite pentru fiecare caz un sunet intuitiv care va semnala permisiunea accesului, tipul de acces va fi afșat pe ecranul LCD si led-ul se va aprinde pentru a confirma interogarea.

Indiferent de rezultatul verificării, microcontroller-ul trimite detaliile accesului (UID, ora, data, rezultatul accesului) către o bază de date unde sunt stocate pentru monitorizare și analiză ulterioară.

Informațiile legate de istoricul intrărilor, respectiv cel al ieșirilor, se pot vizualiza in timp real pe un smartphone sau website prin intermediul Arduino Cloud. (Placa si telefonul nu trebuie sa fie neaparat in aceeasi retea).

Tot de pe smartphone, se poate oferi accesul de catre administrator prin apasarea unui buton din dashboard-ul aplicatiei.

Descriere generală

Schema componentelor hardware

Schema de comunicare in cloud

Scheme realizate pe draw.io

Hardware Design

Schema realizata pe platforma circuito.io.

Lista de piese:

Alegerea pinilor :

Ecran LCD I2C 20×4:

Cititor RFID :

Led RGB :

Buzzer

Forma initiala a proiectului:

stadiu_1_lutan.jpeg

Software Design

Am dezvoltat acest proiect utilizând Arduino IDE

Bibliotecile folosite :

Pentru a economisi spațiul paginii, următoarele fragmente din cod nu includ întreaga implementare (setarea cursorului pentru ecranul LCD, tonurile buzzer-ului sau controlul led-ului).

Acestea au scopul de a evidenția o anumită funcționalitate din cod.

Codul integral se poate găsi în arhiva din partea de jos a paginii.

Gestionarea utilizatorilor

Structura User

Utilizatorii sunt definiți în sistem printr-o structură numită User, care este configurată pentru a stoca UID-ul fiecărui card RFID, numele utilizatorului asociat și o stare booleană care indică dacă utilizatorul este în interiorul spațiului.

struct User {
    String uid;
    String name;
    bool isInside;
};

Această structură este utilizată pentru a crea un array users care conține toți utilizatorii sistemului. Fiecare utilizator este inițializat cu UID-ul cardului său RFID, numele său și starea isInside setată inițial pe false.

User users[] = {
    {"84850FC9", "Alice", false},
    {"849E19C9", "Bob", false},
    {"5DEA616F", "Charlie", false}
};

Funcția getUserByUID

Pentru a verifica dacă un UID citit de la un card RFID corespunde unui utilizator înregistrat, se foloseste funcția getUserByUID. Aceasta iterează prin array-ul de utilizatori și returnează un pointer către utilizatorul corespunzător dacă găsește o potrivire. Dacă nu, returnează nullptr.

User* getUserByUID(const String& uid) {
    for (int i = 0; i < numUsers; i++) {
        if (users[i].uid == uid) {
            return &users[i];
        }
    }
    return nullptr;
}

Verificarea și Actualizarea Stării Utilizatorului

În cadrul buclei loop(), sistemul verifică în mod constant prezența unui nou card RFID. Dacă un card este prezent și citit corect, sistemul extrage UID-ul cardului și verifică validitatea acestuia folosind funcția isValidUID.

if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    return;
}
 
String uidString = getUIDString(&mfrc522.uid);
if (isValidUID(uidString)) {
    User* user = getUserByUID(uidString);

Dacă UID-ul este valid și corespunde unui utilizator înregistrat, sistemul actualizează starea utilizatorului (intrare sau ieșire) și afișează un mesaj relevant pe ecranul LCD.

    if (user != nullptr) {
        if (user->isInside) {
            lcd.print("Goodbye,");
        } else {
            lcd.print("Have a nice day,");
        }
        user->isInside = !user->isInside;
        lcd.print(user->name + "!");
    }
} else {
    lcd.print("Access Denied !");
}

Comunicarea cu Arduino Cloud

Sistemul folosește Arduino IoT Cloud pentru a monitoriza și a raporta evenimente de acces, facilitând o gestiune centralizată și la distanță a accesului utilizatorilor.

Configurarea Conexiunii și Autentificarea

Configurația include stabilirea identificatorilor necesari pentru autentificarea dispozitivului în rețeaua Wi-Fi și în Arduino Cloud:

const char DEVICE_LOGIN_NAME[]  = "secret";
const char SSID[]               = "secret";    // Network SSID
const char PASS[]               = "secret";    // Network password (use for WPA, or use as key for WEP)
const char DEVICE_KEY[]  =      "secret";    // Secret device password

Inițializarea Proprietăților pentru Cloud

Funcția initProperties() configurează conectivitatea cu Arduino Cloud, stabilind ID-ul dispozitivului și cheia secretă, precum și proprietățile care vor fi monitorizate și controlate de la distanță.

void initProperties(){
  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.addProperty(log_access, READ, 2 * SECONDS, NULL);
  ArduinoCloud.addProperty(open_gate, READWRITE, ON_CHANGE, onOpenGateChange);
}

Funcția onOpenGateChange Este invocată când proprietatea open_gate este modificată prin cloud, permițând deschiderea porții indiferent de verificările locale RFID.

void onOpenGateChange() {
  lcd.print("OPEN");
  log_access = "Open by Admin";
}

Logarea Accesului și Formarea Mesajelor din Cloud

Când un utilizator validează cu succes accesul prin prezentarea unui card RFID valid sau când accesul este refuzat, se formează un mesaj corespunzător care este trimis în cloud.

Acces Valid:

if (isValidUID(uidString)) {
    User* user = getUserByUID(uidString);
 
    if (user != nullptr) {
        String cloudMessage;
        if (user->isInside) {
            cloudMessage = user->name + " left";
            lcd.print("Goodbye,");
        } else {
            cloudMessage = user->name + " entered";
            lcd.print("Have a nice day,");
        }
        user->isInside = !user->isInside;
        log_access = cloudMessage; 
    }
}

Acces nevalid:

else {
    String cloudRejectMessage = "Someone tried to access the gate";
    log_access = cloudRejectMessage; 
    lcd.print("Access Denied !");
}

Rezultate Obţinute

Concluzii

Implementarea sistemului de acces s-a dovedit a fi un proiect interesant. Chiar dacă nu a fost extrem de complex, acesta m-a ajutat să înțeleg funcționarea sistemelor RFID, sisteme cu care interacționăm zilnic. De asemenea, am descoperit Arduino Cloud, o platformă foarte interesantă, care mi-a extins perspectivele asupra posibilităților de dezvoltare a proiectelor Arduino.

Download

archive_rfid.zip

Bibliografie/Resurse

ESP-WROOM-32 38 PINS PINOUT