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.
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.
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:
pinMode(GREEN_PIN, OUTPUT);
digitalWrite(GREEN_PIN, HIGH);
Serial.begin(9600);
Serial.println("Approximate your card to the reader...");
tone(BUZZER_PIN, NOTE_C5, 250);
int joyX = analogRead(JOYSTICK_URY_PIN);
if (joyX < 200) { /* move left */ }
SPI.begin();
mfrc522.PCD_Init();
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;
}