Cuier smart pentru măști

Autor

Introducere

  • Cuierul smart pentru măști propune un mod facil de a stoca măștile reutilizabile și de a anunța utilizatorul când trebuie schimbate.
  • Pandemia ne-a luat pe toți prin surprindere și, chiar dacă a trecut un an, nu mulți respectă “good practice” pentru folosirea măștilor.
  • Problema pe care o rezolvă proiectul meu este stocarea inadecvată a măștilor și refolosirea lor îndelungată prin oferirea unui loc special pentru ele și a unei soluții software pentru a aminti persoanei respective când trebuie schimbată masca.

Descriere generală

Schemă bloc

Funcționalitate

I / O

Plăcuța va primi input de la:

  • butoane:
    • Un buton pentru înregistrarea unei măști
    • Un buton pentru ștergerea unei măști
  • RFID reader:
    • De la tag-urile NFC de pe fiecare mască

Output-ul va fi transmis prin:

  • Un display LCD care afișează numărul de utilizări pentru fiecare slot și diverse mesaje ajutătoare
  • Un led pentru fiecare slot care se aprinde când utilizatorul trebuie să pună masca în slot-ul respectiv

Funcționalitate în mare

Ca funcționalitate generală, utilizatorul își poate înregistra un tag (care se prinde de mască printr-un clips) prin apăsarea unui buton pentru a trece în modul “înregistrare” și o pune în slot-ul din cuier care este afișat pe ecran.

Masca trebuie scanată și când este luată din cuier, și când este depozitată în cuier. Programul va incrementa counter-ul de utilizări doar la ridicare și începe cu 1 by default.

În afară de mesajele ajutătoare, ecranul LCD va afișa tot timpul numărul de utilizări per slot.

Cuierul va avea de asemenea și un buton pentru a șterge o anume mască, pentru a putea refolosi tag-ul.

Hardware Design

Piese necesare

Nume Numar piese
Arduino Uno 1
Ecran LCD 1
Butoane 2
Cititor RFID-RC522 1
Stickere NFC 5
Leduri 7
Rezistori 7
Fire tată-tată -
Fire mamă-tată -
Breadboard 1

Nu știu cât se înțelege din diagramă, deci o să explic un pic conexiunile:

Pini RFID reader Pini Arduino
SDA (SS) 10
SCK 13
MOSI 11
MISO 12
IRQ -
GND GND
RST (reset) -
3.3V 3.3V
Pini LCD Pini Arduino
SDA SDA
SCL SCL
GND GND
Vcc 5V

Butonul de ștergere este conectat la pinul 4, iar cel de scriere la pinul 2.

Cele 5 led-uri pentru sloturile cuierului sunt conectate la A0, A1, A2, A3, 5.

Cele 2 led-uri care indică dacă ne aflăm în modul de scriere/ștergere sunt conectate la pinii 9 respectiv 7.

Software Design

  • Mediul de lucru: Arduino IDE
  • Biblioteci folosite:
    • MFRC522 - pentru comunicarea cu RFID reader-ul
    • LiquidCrystal_I2C - pentru comunicarea cu LCD-ul folosind I2C

Diagrama de stări

O simplificare a codului ar fi diagrama asta de stări:

  • 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 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ă masca a atins numărul maxim de utilizări, atunci se afișează acest lucru și masca este ignorată
  • Scoaterea din slot: La acest pas se actualizează structurile interne și se scoate counterul de utilizări corespunzător slotului respectiv.
  • Punerea în slot: Se caută primul slot liber. Dacă nu există se afișează o eroare. Dacă s-a găsit, se afișează o indicație pe ecran.
  • Ș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.

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

Varianta finală nu arată așa! Cel mai bine se vede în video-ul de mai jos

Aici vedem mesajul de eroare când masca are prea multe utilizări.


Aici se vede cum se aprinde led-ul slot-ului corespunzător și ce se întâmplă când nu mai există sloturi disponibile.


Mesajul de eroare când se scanează un tag invalid.


Când tag-ul scanat nu este în memoria programului se afișează un mesaj de eroare.


Procesul de scriere. De menționat că nu adaugă masca în vreun slot, doar îi scrie ID pe tag.


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.

Am vrut să includ și un 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

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

Jurnal

4 Mai

  • 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.

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

pm/prj2021/agrigore/cuier_masti.txt · Last modified: 2021/06/01 05:59 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