Cutia vine un cod pin preconfigurat, si anume “0000”.
Utilizatorul poate folosi acest cod pin, sau il poate schimba
introducand secventa “*00*”, dupa care ii se va cere sa introduca
vechiul cod pin, apoi urmatorul cod pin. Daca codul vechi introdus
este gresit actiunea va esua, afisandu-se un mesaj care informeaza
utilizatorul de ce a esuat.
Codul pin poate contine doar cifre, fiind format din 4 cifre.
Butonul '#' poate fi folosit pentru a anula comanda actuala.
Incuietoare cutiei va ramane deschisa cat timp utilizatorul nu inchide capacul. Seriala afiseaza informatii de debug daca este conectata, iar LCD-ul afiseaza toate informatiile de care utilizatorul are nevoie.
Pentru a reseta codul pin, in cazul in care este nevoie, in interiorul cutiei exista un buton marcat cu RESET_CODE. Codul va fi resetat la cel din fabrica.
Codul pin este salvat pe un card microSD. Codul nu este salvat in “clar”, ci se foloseste un hash al lui. Codul propriu zis nu este salvat niciodata, si este folosit doar la citire pentru a calcula hash-ul.
Aplicatia asteapta input de la utilizator, ce poate reprezenta un cod PIN din cifre, un cod special (“*00*”) pentru a schimba codul pin sau apasarea butonului CANCEL ('#') care anuleazaz actiunea curenta si revine in starea initiala de asteptare a input-ului. Daca codul pin este corect, incuietoarea se va deschide, in caz contrar afisandu-se un mesaj de eroare.
Sistemul are feedback atat prin afisajul pe display, cat si prin sunete ce se aud dintr-un buzzer.
Utilizatorul are dreptul la 3 incercari. Daca greseste codul pin de 3 ori, este nevoit sa astepte 10 secunde pana cand poate introduce un nou cod pin.
O schema block a proiectului este:
Schema componentelor este urmatoarea:
Un cod pin este format din 4 cifre. Nu poate contine alte caractere.
Codul pin de fabrica al aplicatiei este “0000”.
Daca codul PIN introdus este are acelasi hash cu cel al codului corect, se va trimite un semnal
care va deschide incuietoarea (invartirea servomotorului). Dupa o perioadata fixa (3 secunde) de timp,
se va verifica daca cutia a fost inchisa (senzorul HALL detecteaza campul magnetic), si va inchide incuietoarea.
Codurile pin nu sunt stocate direct pe card, ci se foloseste o functie de hashing.
Astfel se va stoca valoarea hash-ului respectiva unui cod pin.
Functia de hash a fost verificata inaintea implementarii in arduino si nu
produce coliziuni pentru nicio combinatie posibila de cod pin de intrare.
Parola va fi salvata pe un card microSD, aceasta fiind salvata si dupa decuplarea
sursei de energie. Codul pin poate fi schimbat prin introducerea secventei “*00*”,
dupa care se asteapta codul pin vechi, urmat de introducerea noului codul pin dorit.
Daca codul pin vechi a fost uitat, accesul este imposibil fara forta. Daca cutia este
deschisa, se poate apasa butonul din interior marcat cu reset pentru a reseta codul
pin la cel de fabrica “0000”. Acest buton va genera o intrerupere ce va oprii orice
actiune era in proces.
Pentru a intrerupe actiunile, in intrerupe se modifica o variabla de stare, ce reprezinta
ca actiunea curenta trebuie oprita iar pin-ul resetat.
Pentru a gestiona afisarea la LCD, se va folosi o implementare pe stari. Daca starea device-ului
nu s-a schimbat, atunci nu se mai modifica mesajul(nu resetam lcd-ul degeaba).
Functia Hash a fost testata pentru toate input-urile posibile si nu produce coliziuni, fiind perfecta
pentru ce avem nevoie in aceasta implementare.
Utilizatorul nu poate introduce un cod PIN ce contine altceva inafara de cifre, un mesaj de eroare
fiind afisat in caz contrar.
Monitorizarea numarului de incercari se face printr-o variabila globala, fiind reseta odata cu apasarea butonului de reset pin sau introducerea codului pin corecta, sau dupa asteptarea timpului de 10 secunde.
Pentru sunetele buzzerului, se folosesc 2 sunete simple, formate din cate 2 note muzicale. Pentru esec se foloseste de 2 ori nota B4 (494 Hz). Pentru succes, se folosesc notele B5 (988 Hz) si E6(1319 Hz).
Per total, desi proiectul pleaca de la o idee simpla, implementarea este destul de complexa, folosindu-se destul de multe mecanisme pentru a “complica” (cu rost) proiectul. A fost surprizator de greu sa realizez partea fizica a proiectului (nu ma asteptam sa fie asa greu sa inghesui niste fire intr-o cutie). Mi-ar fi placut daca aspectul interior al componentelor ar fi fost mai “clean” dar pentru asta probabil ar fi trebui sa imi leg eu componentele de placi si sa leg fire exact de lungimea dorita. Consider ca proiectul este destul de complex atat hardware cat si software.
O arhiva cu resursele folosite: aici