Company logger

Project Documentation

Introducere

Autor: Dragomir Andrei - 332CA - andrei.dragomir1401@stud.acs.pub.ro

Ce scop are?

Proiectul reprezinta un sistem de tracking si information alerts pentru angajati la corporatie. Targetul este ca angajatorul sa poate monitoriza accesele angajatilor in birou, cat si timpii lucrati de acestia. Scopul este vanzarea catre companii.

Cum functioneaza?

Cu simplul card de access, cand angajatul ajunge la birou poate sa se logheze in sistem si orele de lucru vor fi contorizate de la sine pana la o delogare ulterioara. Pe langa asta, angajatul primeste si remindere la venire si primeste feedback legat de modificarile de program la plecare. Angajatorul poate verifica pentru fiecare angajat cat si cand s-a logat ultima data, cat si alte detalii.

Descriere generală

Ce microcontroller folosim?

Intentia din spatele proiectului este folosirea unei placute Arduino ca si controller principal care va comunica cu celelalte componenete ale sistemului. Pentru proiectul prezentat este suficienta ca punct central de control aceasta placuta Arduino.

Ce fac celelalte componente?

Logarea se face pe baza de card cu RFID. La logare avem buzzer si LED indicator pentru feedbackul logarii. Un modul timer ne ofera timpul real pentru logare si delogare, iar joystickul este pentru navigarea prin meniu de catre admin.

Diagrama proiectului

Hardware Design

  • Arduino UNO R3
  • RFID-RC522
  • HW-479 RGB LED
  • TMB12A05 BUZZER
  • LCD I2C
  • Joystick
  • MH Real Time Clock Modules 2

Schema Electrică

Hardware Design Image 1

Hardware Design Image 2

Hardware Design Image 3

Hardware Design Image 4

Hardware Design Image 5

Software Design

Stadiul actual al implementării software: Stadiul actual al implementării software include un sistem complet funcțional de acces RFID, afișaj LCD și joystick pentru navigare în meniurile administrative. Utilizatorii autorizați pot accesa memento-uri personalizate și loga timpul petrecut. Codul principal folosește biblioteci externe și funcții dedicate pentru fiecare componentă.

Motivați alegerea bibliotecilor folosite în cadrul proiectului: Bibliotecile MFRC522, LiquidCrystal_I2C, Wire, și RtcDS1302 sunt esențiale pentru comunicarea cu cititorul RFID, ecranul LCD și ceasul în timp real (RTC). Ele simplifică interfațarea cu hardware-ul și permit implementarea rapidă a funcțiilor necesare. De exemplu, inițializarea structurilor de biblioteca:

MFRC522 mfrc522(SS_PIN, RST_PIN);
mfrc522.PCD_Init();
LiquidCrystal_I2C lcd(0x27, 16, 2);
lcd.init();
lcd.backlight();

RtcDS1302 Rtc(myWire);
Rtc.Begin();

Evidențiați elementul de noutate al proiectului: Elementul de noutate constă în integrarea unui sistem de vizualizare a timpilor si productivitatii angajatilor, ceea ce deschide posibilitatea comercializarii catre firme.

Justificați utilizarea funcționalităților din laborator în cadrul proiectului: Proiectul utilizează funcționalități studiate în diverse laboratoare pentru a interacționa cu componentele hardware:

  • Laboratorul 0: GPIO - Configurarea și utilizarea pinilor GPIO pentru LED-uri și buzzer:
    pinMode(GREEN_PIN, OUTPUT);
    digitalWrite(GREEN_PIN, HIGH);
    
  • Laboratorul 1: UART - Comunicarea serială pentru debug și afișarea mesajelor în consola serială:
    Serial.begin(9600);
    Serial.println("Approximate your card to the reader...");
    
  • Laboratorul 3: Timere. PWM - Utilizarea PWM pentru controlul buzzer-ului:
    tone(BUZZER_PIN, NOTE_C5, 250);
    
  • Laboratorul 4: ADC - Citirea valorilor analogice de la joystick:
    int joyX = analogRead(JOYSTICK_URY_PIN);
    if (joyX < 200) { /* move left */ }
    
  • Laboratorul 5: SPI - Comunicarea cu cititorul RFID:
    SPI.begin();
    mfrc522.PCD_Init();
    
  • Laboratorul 6: I2C - Comunicarea cu ecranul LCD și RTC-ul:
    Wire.begin();
    lcd.init();
    Rtc.Begin();
    

Explicați scheletul proiectului, interacțiunea dintre funcționalități și modul în care a fost validat că acestea funcționează conform: Scheletul proiectului este structurat în funcții specifice pentru fiecare componentă și aspect al interacțiunii utilizatorului. Codul principal este organizat în funcții de configurare, funcții de loop principal și funcții de manipulare a componentelor hardware. Funcțiile de configurare inițializează componentele hardware și variabilele globale:

Funcția setup inițializează componentele hardware și variabilele globale:

void setup() {
    // Initialize serial communication, I2C, SPI, LCD, RTC, GPIO pins, etc.
}

Funcția loop gestionează logica de acces și navigarea în meniurile administrative:

void loop() {
     -> Verifica admin
        -> Verifică proximitate card
           -> Verifica access/iesire
           -> Printează mesaje de acces
              -> Logheaza timer
              -> Aprinde LED
              -> Porneste buzzer
     -> Printează mesaje idle, etc.
}

Funcțiile auxiliare gestionează componentele hardware și interacțiunea utilizatorului, cum ar fi afișarea mesajelor pe LCD, citirea valorilor joystick-ului și operarea LED-urilor și buzzer-ului:

void adminLogged() {
    // Gestionează meniurile administrative când administratorul este logat
}

void handleAdminAccess() {
    // Gestionează accesul administratorului la sistem
}

void handleUserAccess(String readUID) {
    // Gestionează accesul utilizatorilor obișnuiți la sistem
}

void displayAccessDenied() {
    // Afișează mesajul de acces refuzat
}

void printIdle() {
    // Afișează mesajul de așteptare
}

void printStringOnLCD(const char *message) {
    // Afișează un mesaj pe ecranul LCD
}

String convertUID(MFRC522 &mfrc522) {
    // Convertește UID-ul citit de la cardul RFID într-un string
}

bool isAuthorizedUID(String uid) {
    // Verifică dacă UID-ul citit este autorizat
}

void turnOffLEDs() {
    // Stinge toate LED-urile
}

void setDateTime() {
    // Setează data și ora în RTC
}

Validarea funcționalităților a fost realizată prin teste individuale pentru fiecare componentă hardware și prin teste integrate pentru întregul sistem, asigurând astfel o funcționare corectă și eficientă.

Atașați demo video pentru întregul proiect însoțit de explicații: Demo video-ul va prezenta autentificarea utilizatorilor, afișarea memento-urilor, logarea timpului de acces și navigarea în meniuri. Explicațiile vor detalia funcționarea fiecărei componente.

Explicați cum ați realizat calibrarea elementelor de senzoristică: Calibrarea elementelor de senzoristică a fost realizată pentru a asigura funcționarea corectă și precisă a fiecărei componente hardware. În această secțiune sunt prezentate metodele de calibrare utilizate pentru joystick, RFID, LCD, buzzer și LED-uri.

Citirea și calibrarea valorilor joystick-ului:

int joyX = analogRead(JOYSTICK_URX_PIN);
int joyY = analogRead(JOYSTICK_URY_PIN);

if (joyX < 200)
else if (joyX > 800)

if (joyY < 2000
else if (joyY > 800)

Calibrarea cititorului RFID:

MFRC522 mfrc522(SS_PIN, RST_PIN);
if (mfrc522.PICC_IsNewCardPresent())
    if (mfrc522.PICC_ReadCardSerial())

Inițializarea și calibrarea afișajului LCD:

LiquidCrystal_I2C lcd(0x27, 16, 2);
lcd.init();
lcd.backlight();
lcd.clear();

Configurarea și calibrarea buzzer-ului:

pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH);

void playTone(int tone, int duration) {
    digitalWrite(BUZZER_PIN, LOW);
    tone(BUZZER_PIN, tone, duration);
    delay(duration);
    noTone(BUZZER_PIN);
    digitalWrite(BUZZER_PIN, HIGH);
}

Calibrarea LED-urilor:

pinMode(GREEN_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);

void turnOffLEDs() {
    digitalWrite(GREEN_PIN, LOW);
    digitalWrite(RED_PIN, LOW);
    digitalWrite(BLUE_PIN, LOW);
}

void setLEDColor(int red, int green, int blue) {
    analogWrite(RED_PIN, red);
    analogWrite(GREEN_PIN, green);
    analogWrite(BLUE_PIN, blue);
}

Explicați cum, de ce și unde ați realizat optimizări:

Optimizarea citirii și comparării UID-urilor RFID:

Această optimizare a fost realizată pentru a asigura citirea rapidă și compararea eficientă a UID-urilor cardurilor RFID. Funcția convertUID transformă UID-ul citit într-un format string pentru a facilita compararea cu UID-urile stocate ale utilizatorilor autorizați. Această conversie este necesară deoarece UID-urile sunt citite sub formă de byte și trebuie convertite într-un format ușor de utilizat pentru comparare:

String convertUID(MFRC522 &mfrc522) {
    String readUID = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
        readUID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "") + String(mfrc522.uid.uidByte[i], HEX);
    }
    readUID.toUpperCase();
    return readUID;
}

Prin convertirea UID-urilor la formatul string, codul poate compara eficient UID-urile citite cu cele stocate pentru a verifica autorizarea utilizatorilor:

bool isAuthorizedUID(String uid) {
    for (int i = 0; i < uidCount; i++) {
        if (authorizedUsers[i].uid == uid) return true;
    }
    return false;
}

Video

Bibliografie/Resurse

https://github.com/Dragomir1401/PRODUCTIVITY-LOGGER