Popescu Irina-Elena Bluetooth and RFID door lock
Door lock-ul se poate deschide atat prin RFID, folosindu-se de un tag, cat si prin modul de bluetooth, folosindu-se de o aplicatie de telefon. Exista doua functii: lock si unlock door. Cand se va apela una dintre aceste functii, se vor porni led-ul si buzzer-ul, si un servomotor se va roti 180 de grade, pentru a trage de un zavor. Am vrut sa fac un door lock pentru a mi-l pune la usa mea, deoarece daca imi inchid usa, mereu trebuie sa ma ridic sa o deschid pentru altcineva; dar acum, pot sa fac totul de pe telefon.
Schema bloc:
Lista de componente:
Schema electrica:
Am folosit Arduino IDE pentru a dezvolta programul. Bibliotecile folosite au fost:
Variabilele globale sunt:
Functii:
setPins()
Setez pinii pe care voi lega componentele de arduino pe OUTPUT:
si ii atasez obiectului de tip servo pinul PWM 3.
activatePins()
Scriu pe pinul 10 valoarea LOW si pe pinul 5 valoarea HIGH, pentru a activa RFID-ul.
setupComponents()
Initializez variabilele globale. Folosind AddicoreRFID_Init() initializez obiectul myRFID. Folosind write setez servo motorul la 0 grade, si variabila door_locked este 0, adica usa este deschisa. In plus, variabila recv_bluetooth este setata la 0 initial, pentru ca nu se primesc date de la bluetooth la setup.
setupBluetoothInterrupt()
Setez variabilele corespunzatoare pentru intreruperea pe USART, deoarece modulul de bluetooth comunica pe USART. Dezactivez intreruperile prin cli(). Setez UBRR0 pe 103, pentru a configura baud rate-ul la 9600bps. Setez bitii UCSZ01 si UCSZ00 pe 1 in UCSR0C pentru a seta ca voi recepta/transmite date de 8 biti. Pentru a activa receptia/transmiterea, setez in UCSR0B biii RXEN0(activeaza receptia pe USART), TXEN0(activeaza transmiterea pe USART) si RXCIE0 pe 1. La final, activez interuperile prin sei().
setup()
Pornesc libraria SPI, deoarece este folosita de RFID. Apelez cele 3 functii descrise anterior si setez bitii corespunzatori pentru a activa interuperea pentru modulul de bluetooth.
set_RGB_led(int red_light, int green_light, int blue_light)
Pornesc led-ul RGB, folosind analogWrite(pin, freq), unde freq = [0, 255], pin = {7, 8, 9}.
servo_lock(int startp, int endp)
Pornesc servo motorul, care face o rotire de la unghiul startp la endp, folosindu-se de functia write. Pentru a fi o miscare lina, folosesc un for, pentru a trece prin fiecare unghi de la startp la endp, si dupa fiecare miscare fac un delay.
servo_unlock(int startp, int endp)
Aplic aceeasi idee ca la functia anterioara, doar ca in sens opus.
door_routine(int redl, int greenl, int bluel, int delayt, int flickert, int freqb)
Rutina care se executa cand se da lock/unlock. De flickert ori, se executa:
lock()
Functia care se apeleaza cand se inchide usa. Se apeleaza functia door_routine, pentru a porni led-ul si buzzer-ul, si se porneste servo motorul.
unlock()
Functia care se apeleaza cand se deschide usa. Se apeleaza functia door_routine, pentru a porni led-ul si buzzer-ul, si se porneste servo motorul.
wrong_tag()
Daca tag-ul pus la RFID este cel gresit, se apeleaza doar door_routine, dar nu se actioneaza si servo motorul.
check_tag()
Se verifica daca tag-ul pus este cel corect. Se verifica fiecare byte din codul tag-ului cu numarul din tag-ul meu. In plus, ca o verificare extra, se verifica si checksum.
RFID_routine()
DUpa ce s-a detectat un tag, daca tag-ul este cel corect, se da lock/unlock. Daca tag-ul este gresit, se apeleaza functia corespunzatoare. Daca inainte se da lock, se apeleaza unlock, si invers.
ISR(USART_RX_vect)
Rutina de tratare a interuperii USART pentru bluetooth. Retin byte-ul primit prin URD0, si setez variabila recv_bluetooth pe 1, asta insemnand ca am primit date de la telefon.
loop()
Se verifica daca s-a gasit vreun tag, sau daca se primesc date de la telefon pe bluetooth. Daca s-a gasit tag, se verifica ce tag s-a gasit, si se verifica manual checksum. Dupa ce se apeleaza functia RFID_routine(), se da halt la modul. Daca s-au primit date de la telefon, se verifica ce functie s-a primit (lock/unlock), se apeleaza functia specifica, si se trimite inapoi la telefon valoarea corespunzatoare (1/0).
Functionare:
Prin RFID, cand se citeste tag-ul bun, automat se da lock(daca starea anterioara a fost unlock), sau unlock(daca starea anterioara a fost lock). Prin bluetooth(folosindu-se de o aplicatie de mobil pe Android), se poate alege daca se doreste lock sau unlock.
Indiferent daca s-a dat lock/unlock prin RFID sau bluetooth, se apeleaza aceeasi rutina pentru pornit led-ul, buzzer-ul si servo motorul.
Aplicatia de mobil pentru comunicarea cu modulul de bluetooth
Am folosit MIT App Inventor pentru a crea aplicatia de mobil ce comunica cu modulul de bluetooth.
Partea de frontend:
Partea de backend:
REUSITE
PROBLEME INTAMPINATE
CE AM INVATAT DIN PROIECT?
Arhiva cu codul sursa si README este: arhiva_cod