This shows you the differences between two versions of the page.
pm:prj2021:agrigore:cuier_masti [2021/05/31 07:18] maria_irina.gherman |
pm:prj2021:agrigore:cuier_masti [2021/06/01 05:59] (current) maria_irina.gherman [Download] |
||
---|---|---|---|
Line 54: | Line 54: | ||
| Breadboard | 1 | | | Breadboard | 1 | | ||
- | {{pm:prj2021:agrigore:diagrama_circuit.png?900|}} | + | {{pm:prj2021:agrigore:diagrama_circuit.png?700|}} |
- | Nu știu cât se înțelege din diagramă, deci conexiunile vin astfel: | + | Nu știu cât se înțelege din diagramă, deci o să explic un pic conexiunile: |
^ Pini RFID reader ^ Pini Arduino | | ^ Pini RFID reader ^ Pini Arduino | | ||
Line 86: | Line 86: | ||
* **MFRC522** - pentru comunicarea cu RFID reader-ul | * **MFRC522** - pentru comunicarea cu RFID reader-ul | ||
* **LiquidCrystal_I2C** - pentru comunicarea cu LCD-ul folosind I2C | * **LiquidCrystal_I2C** - pentru comunicarea cu LCD-ul folosind I2C | ||
- | | + | |
+ | ==== Diagrama de stări ==== | ||
O simplificare a codului ar fi diagrama asta de stări: | O simplificare a codului ar fi diagrama asta de stări: | ||
Line 92: | Line 94: | ||
* **Ready**: Se așteaptă un input. Căteva verificări care s-ar face la prima citire ar fi: | * **Ready**: Se așteaptă un input. Căteva verificări care s-ar face la prima citire ar fi: | ||
- | * Dacă se scanează altceva decât un Mifare Ultralight, se afișează un mesaj de eroare (în Serial Monitor) și se ignoră cardul respectiv. | + | * Dacă se scanează altceva decât un Mifare Ultralight, se afișează un mesaj de eroare pe LCD și se ignoră cardul respectiv. |
* Dacă ID-ul citit de pe un tag nu există, atunci se afișează eroare și tag-ul este ignorat | * Dacă ID-ul citit de pe un tag nu există, atunci se afișează eroare și tag-ul este ignorat | ||
* Dacă masca a atins numărul maxim de utilizări, atunci se afișează acest lucru și masca este ignorată | * Dacă masca a atins numărul maxim de utilizări, atunci se afișează acest lucru și masca este ignorată | ||
Line 99: | Line 101: | ||
* **Ștergerea unei măști**: Se resetează structurile interne pentru a putea refolosi id-ul respectiv. Dacă masca era trecută ca fiind într-un slot, aceasta este scoasă automat | * **Ștergerea unei măști**: Se resetează structurile interne pentru a putea refolosi id-ul respectiv. Dacă masca era trecută ca fiind într-un slot, aceasta este scoasă automat | ||
* **Scrierea unui tag**: Se caută primul ID liber și se scrie in memoria tag-ului RFID la o adresă anume, urmând un anume format, pentru a minimiza șansele ca un tag să aibă din întâmplare același ID. Ca error checking, se verifică dacă există deja un ID pe tag-ul ce urmează să fie scris. Daca da, atunci se eliberează structurile interne corespunzătoare ID-ului vechi și apoi se asignează ID-ul nou. | * **Scrierea unui tag**: Se caută primul ID liber și se scrie in memoria tag-ului RFID la o adresă anume, urmând un anume format, pentru a minimiza șansele ca un tag să aibă din întâmplare același ID. Ca error checking, se verifică dacă există deja un ID pe tag-ul ce urmează să fie scris. Daca da, atunci se eliberează structurile interne corespunzătoare ID-ului vechi și apoi se asignează ID-ul nou. | ||
+ | |||
+ | ==== Implementare ==== | ||
+ | Ca implementare propriu zisă, am folosit multe structuri de date în care țin informații despre fiecare ID în parte. | ||
+ | Am extrem de multe "variabile de stare", care mă ajută să țin cont de ce s-a întâmplat deja și ce trebuie să se întâmple. | ||
+ | |||
+ | De exemplu, am 2 variabile pentru a ține cont dacă sunt în modul de scriere, ștergere sau citire. Variabilele astea | ||
+ | sunt activate de cele 2 butoane, care folosesc întreruperi. | ||
+ | |||
+ | Alte variabilă care m-a ajutat mult ține de LCD. Eu am în loop mereu să se afișeze slot-urile și utilizările. Dacă vreau | ||
+ | să afișez un alt mesaj, trebuie să sar peste partea din loop care afișeaza utilizările ca să nu se suprascrie instantaneu mesajul. | ||
+ | Variabila se setează desigur când afișez ceva pe LCD și se desetează în 2 moduri: | ||
+ | * Printr-un timer care numără aproximativ 5 secunde | ||
+ | * Manual când ies din modul de scriere sau ștergere | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | <note important>Varianta finală nu arată așa! Cel mai bine se vede în video-ul de mai jos</note> | ||
+ | {{:pm:prj2021:agrigore:too_used_cuier.gif?500|}} | ||
+ | |||
+ | Aici vedem mesajul de eroare când masca are prea multe utilizări. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2021:agrigore:no_slots_cuier.gif?500|}} | ||
+ | |||
+ | Aici se vede cum se aprinde led-ul slot-ului corespunzător și ce se întâmplă când nu mai există sloturi disponibile. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2021:agrigore:wrong_tag_cuier.gif?500|}} | ||
+ | |||
+ | Mesajul de eroare când se scanează un tag invalid. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2021:agrigore:not_registered_cuier.gif?500|}} | ||
+ | |||
+ | Când tag-ul scanat nu este în memoria programului se afișează un mesaj de eroare. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2021:agrigore:write_cuier.gif?500|}} | ||
+ | |||
+ | Procesul de scriere. De menționat că nu adaugă masca în vreun slot, doar îi scrie ID pe tag. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2021:agrigore:delete_cuier.gif?500|}} | ||
+ | |||
+ | Procesul de ștergere. Se vede de asemenea că se șterge și din slot-ul unde era pusă (slotul 1 mai exact) | ||
+ | Pentru aceste două moduri, mesajul cu instrucțiuni nu dispare | ||
+ | până nu se scanează o mască sau se reapasă butonul pentru a anula acțiunea. | ||
+ | |||
+ | <note tip>Am vrut să includ și un [[https://youtu.be/Opx4ZC5pwJA|video]] de tip "pitch", ca să prezinte ideea proiectului. Varianta proiectului care se vede în video doar arată mai frumos. Funcționalitățile sunt exact ca în gif-uri</note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | * Cred că poate fi de ajutor în viața reală, chit că pandemia și restricțiile sunt mai ușoare pe zi ce trece (țin pumnii pentru facultate fizic) | ||
+ | * Chiar dacă nu o să mai avem nevoie de măști, proiectul poate fi adaptat pentru haine de exemplu, pentru că sunt sigură că nimeni nu poartă o haină o singură dată până să o spele. | ||
+ | * A fost fun proiectul, am aplicat într-un final tot ce am invățat și mi-am reamintit că lucrurile ieftine nu sunt niciodată la fel de bune ca cele mai scumpe (mi-am luat țeapă la niște componente :D) | ||
===== Download ===== | ===== Download ===== | ||
+ | {{:pm:prj2021:agrigore:gherman_maria_irina_334cb_pm_cuiersmartmasti.zip|Arhiva cu codul, câteva scheme și demo-urile}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
==== 4 Mai ==== | ==== 4 Mai ==== | ||
- | Am verificat ce stickere NFC am deja, desi trebuie sa mai comand cateva, si am vazut ca au id-uri la fel, deci | + | * Am verificat ce stickere NFC am deja, deși trebuie să mai comand câteva, și am văzut că au id-uri la fel, deci va trebui să scriu/citesc date pe stickere ca să pot identifica în mod unic măștile. |
- | va trebui sa scriu/citesc date pe stickere ca sa pot identifica in mod unic mastile. | + | ==== 20 Mai ==== |
+ | * Am pus la punct partea de citire/scriere pe RC522 și un mic schelet | ||
+ | ==== 22 Mai ==== | ||
+ | * Am definitivat flow-ul de citire scriere cu un format al ID-ului și niște verificări tot pe partea de ID-uri | ||
+ | ==== 23 Mai ==== | ||
+ | * Am pus primele cărămizi la aventura mea cu întreruperi. Am făcut primul schelet al întreruperilor pentru butoane | ||
+ | ==== 24 Mai ==== | ||
+ | * Am încercat să folosesc MAX7219 pentru multiplexarea a 5 seven segment displays, dar pentru un motiv sau altul n-am reușit să-l fac să meargă | ||
+ | ==== 28 Mai ==== | ||
+ | * Nu am abandonat seven segments displays și am încercat cu un shift register, dar sincer nu m-am descurcat cum aș putea să controlez 5 seven segment displays cu un singur shift register. Looking back, nici nu-mi ajungeau pinii pe Arduino și era prea târziu să mai comand încă un shift register | ||
+ | * Am încercat să fac detecția măștii în slotul de cuier (ca să poți să o pui oriunde vrei) cu niște led-uri IR și IR receivers. Partea proastă a fost că ledurile erau prea slabe ca să le detecteze receiverele :D | ||
+ | ==== 29 Mai ==== | ||
+ | * Am abandonat într-un final seven segment displays și am folosit un LCD, care îmi rezolvă două probleme: lipsa unui display pentru counter și nevoia de a indica cumva în ce slot trebuie să pună user-ul masca | ||
+ | * Continuă aventură mea cu întreruperile, de data asta cu un timer. Am vrut să fiu mișto și să nu folosesc getMillis() pentru a număra 4 secunde când vreau eu, ci să folosesc TIMER1. Looking back, trebuia să fac cu millis, că e cam greu să faci un timer să numere **doar** când vrei tu | ||
+ | ==== 30 Mai ==== | ||
+ | * Last minute software changes, am adăugat diverse mesaje de eroare ca să fac tot proiectul mai... verbose să îi zic. | ||
+ | * Desigur și pagina de wiki | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | * [[https://github.com/miguelbalboa/rfid/blob/master/src/MFRC522.h|Documentatia si exemplele librariei MFRC522]] | ||
+ | * [[https://forum.arduino.cc/t/generating-single-timer-interrupt/191825/11|Forum Arduino pentru retrigerable timer]] | ||
+ | * [[https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/|Documentatia si exemplele librariei LiquidCrystal I2C]] | ||
+ | * [[https://forum.arduino.cc/t/writing-to-mifare-ultralight-nfc-tag-using-rc522-module/363199|Forum Arduino pentru scrierea pe tag-urile MIFARE Ultralight]] | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||