Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 ​catevasi 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>​
  
pm/prj2021/agrigore/cuier_masti.1622434684.txt.gz · Last modified: 2021/05/31 07:18 by maria_irina.gherman
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0