This shows you the differences between two versions of the page.
pm:prj2021:cghenea:smartlock [2021/05/31 21:22] violeta.fasui [Smart Lock] |
pm:prj2021:cghenea:smartlock [2021/06/02 18:52] (current) violeta.fasui |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | {{:pm:prj2021:cghenea:smart_lock.pdf|}} | + | ====== Smart Lock ====== |
- | ====Smart Lock==== | + | |
Nume: Fasui Violeta Alexandra\\ | Nume: Fasui Violeta Alexandra\\ | ||
Grupa: 334CA | Grupa: 334CA | ||
- | ===Introducere=== | + | ====== Introducere ====== |
Tema proiectului propus este o incuietoare inteligenta. Acesta va simula modul de functionare al unei alarme, tinand cont de starea incuietorii. Astfel vor exista doua situatii: | Tema proiectului propus este o incuietoare inteligenta. Acesta va simula modul de functionare al unei alarme, tinand cont de starea incuietorii. Astfel vor exista doua situatii: | ||
* Daca incuietoarea este inchisa si se simte miscare, atunci alarma va semnala acest lucru, folosind un buzzer. | * Daca incuietoarea este inchisa si se simte miscare, atunci alarma va semnala acest lucru, folosind un buzzer. | ||
Line 10: | Line 9: | ||
Pentru a putea inchide si deschide incuietoarea, voi utiliza o parola ce presupune introducerea unui cod prin keypad. In permanenta, incuietoarea este conectata la un telefon ce ii poate modifica starea. | Pentru a putea inchide si deschide incuietoarea, voi utiliza o parola ce presupune introducerea unui cod prin keypad. In permanenta, incuietoarea este conectata la un telefon ce ii poate modifica starea. | ||
- | ===Descriere generala=== | + | ====== Descriere generala ====== |
In scopul realizarii acestei incuietori voi utiliza un senzor de miscare, un servomotor, un keypad, un buzzer si modelul bluetooth. Incuietoarea va avea doua stari determinate de codul introdus prin keypad: | In scopul realizarii acestei incuietori voi utiliza un senzor de miscare, un servomotor, un keypad, un buzzer si modelul bluetooth. Incuietoarea va avea doua stari determinate de codul introdus prin keypad: | ||
* inchisa: fie atunci cand se introduce #, fie atunci cand se introduce o parola gresita; | * inchisa: fie atunci cand se introduce #, fie atunci cand se introduce o parola gresita; | ||
Line 18: | Line 17: | ||
- | ===Hardware Design=== | + | ====== Hardware Design ====== |
Modul Bluetooth\\ | Modul Bluetooth\\ | ||
Modul PIR - senzor de prezenta\\ | Modul PIR - senzor de prezenta\\ | ||
Line 30: | Line 29: | ||
{{:pm:prj2021:cghenea:captura.jpg?500|}} | {{:pm:prj2021:cghenea:captura.jpg?500|}} | ||
- | {{:pm:prj2021:cghenea:smartlock.jpg?500|}} | + | {{:pm:prj2021:cghenea:smartlock.jpg?600|}} |
+ | |||
+ | ====== Software Design ====== | ||
+ | In scopul realizarii proiectului, am utilizat o variabila care monitorizeaza starea incuietorii. Aceasta isi schimba starea astfel: | ||
+ | * este inchisa atunci cand se apasa tasta '#' sau atunci cand parola introdusa este gresita. | ||
+ | * este deschisa atunci cand combinatia de caractere retinuta in variabila password este aceeasi cu cea setata initial ca fiind codul de deschidere ("1234"). | ||
+ | Pe masura ce tastele sunt apasate, codul este in permanenta retinut intr-un string, iar in momentul in care se introduce caracterul special "*", codul este verificat in functia checkPassword(). Se face compararea a doua stringuri, pentru a putea determina atat starea incuietorii, cat si pe cea a buzzer-ului. Dupa fiecare verificare parola este resetata. | ||
+ | Buzzerul verifica atat starea incuietorii, cat si datele obtinute de senzorul pir. Daca incuietoarea este inchisa iar valoarea senzorului pir este 1, atunci alarma suna. | ||
+ | In loop, se verifica constant datele primite de la telefon. Acesta poate trimite caracterele 'c' pentru a inchide incuietoarea, sau 'o' pentru a o deschide. | ||
+ | |||
+ | <spoiler Cod sursa> | ||
+ | <code> | ||
+ | #include <Servo.h> | ||
+ | #include <Keypad.h> | ||
+ | |||
+ | #define delay_time 100 | ||
+ | |||
+ | Servo servo1; | ||
+ | String pass = "1234"; | ||
+ | int lock = 0; | ||
+ | |||
+ | String password; | ||
+ | const byte Rows = 4; | ||
+ | const byte Cols = 4; | ||
+ | |||
+ | int pir = 12; | ||
+ | int move = 0; | ||
+ | char phone_data; | ||
+ | int buzzer = 13; | ||
+ | |||
+ | char keys[Rows][Cols] = { | ||
+ | {'1','2','3','A'}, | ||
+ | {'4','5','6','B'}, | ||
+ | {'7','8','9', 'C'}, | ||
+ | {'*','0','#','D'} | ||
+ | }; | ||
+ | |||
+ | byte rowPins[Rows] = {9, 8, 7, 6}; | ||
+ | byte colsPins[Cols] = {5, 4, 3, 2}; | ||
+ | |||
+ | Keypad keypad = Keypad(makeKeymap(keys), rowPins, colsPins, Rows, Cols); | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | servo1.attach(11); | ||
+ | keypad.addEventListener(keypadEvent); | ||
+ | pinMode(pir, INPUT); | ||
+ | Serial.println("==== Incuietoare deschisa ====="); | ||
+ | servo1.write(180); | ||
+ | pinMode (buzzer, OUTPUT) ; | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | keypad.getKey(); | ||
+ | move = digitalRead(pir); | ||
+ | Serial.println("Senzor PIR:"); | ||
+ | Serial.println(move); | ||
+ | delay(delay_time); | ||
+ | Serial.println(keypad.getKey()); | ||
+ | if(lock == 1 && move == 1) | ||
+ | { | ||
+ | Serial.println("==== SUNA ALARMA ===="); | ||
+ | for (int i = 0; i <10; i++) | ||
+ | { | ||
+ | digitalWrite (buzzer, HIGH) ; | ||
+ | delay (2) ; | ||
+ | digitalWrite (buzzer, LOW) ; | ||
+ | delay (2) ; | ||
+ | } | ||
+ | } | ||
+ | phone_data = Serial.read(); | ||
+ | if(phone_data == 'c') | ||
+ | { | ||
+ | lock = 1; | ||
+ | servo1.write(0); | ||
+ | } else if(phone_data == 'o') | ||
+ | { | ||
+ | lock = 0; | ||
+ | servo1.write(180); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void keypadEvent(KeypadEvent ekey) { | ||
+ | switch(keypad.getState()) | ||
+ | { | ||
+ | case PRESSED: | ||
+ | switch (ekey) | ||
+ | { | ||
+ | case '*': checkPassword(); break; | ||
+ | case '#' : password = ""; lock = 1; servo1.write(0); Serial.println("==== INCUIETOARE INCHISA ===="); break; | ||
+ | default: password += ekey; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void checkPassword() | ||
+ | { | ||
+ | Serial.println(password); | ||
+ | if(password.compareTo(pass)) | ||
+ | { | ||
+ | password = ""; | ||
+ | servo1.write(0); | ||
+ | lock = 1; | ||
+ | Serial.println("!!!! PAROLA INTRODUSA ESTE GRESITA !!!!"); | ||
+ | } else | ||
+ | { | ||
+ | servo1.write(180); | ||
+ | password = ""; | ||
+ | lock = 0; | ||
+ | Serial.println("!!!! PAROLA INTRODUSA ESTE CORECTA !!!!"); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | |||
+ | |||
+ | ====== Rezultate Obţinute ====== | ||
+ | |||
+ | Proiectul simuleaza functionarea unei alarme. Acest lucru este evidentiiat atat in demo, cat si in urmatoarele imagini: | ||
+ | * Incuietoare inchisa | ||
+ | {{:pm:prj2021:cghenea:inchis.jpg?200|}} | ||
+ | |||
+ | * Incuietoare deschisa | ||
+ | |||
+ | {{:pm:prj2021:cghenea:deschis.jpg?200|}} | ||
+ | |||
+ | [[https://youtu.be/QhZYxrSIBnA]] | ||
+ | |||
+ | ====== Concluzii ====== | ||
+ | Proiectul a necesitat atat acumularea cunostintelor prezentate la laborator, cat si creativitatea fiecaruia. Consider ca proiectul a fost unul practic, cu o utilitate reala, ce poate fi privit ca o experienta constructiva. | ||
- | ===Software Design=== | + | ====== Jurnal ====== |
+ | 25 aprilie: am ales tema a proiectului\\ | ||
+ | 29 aprilie: am modificat ideea de inceput, am ales piesele si am creat aceasta pagina\\ | ||
+ | 10 mai: am comandat piesele suplimentare de care aveam nevoie\\ | ||
+ | 14 mai: implementare proiect\\ | ||
+ | 26 mai: finalizare proiect\\ | ||
- | ===Rezultate Obţinute=== | ||
- | ===Concluzii=== | + | ====== Resurse / Bibliografie ====== |
+ | [[https://ardushop.ro/ro/home/29-placa-de-dezvoltare-uno-r3.html?search_query=arduino+uno&results=242]] | ||
+ | [[https://ocw.cs.pub.ro/courses/pm]] | ||
- | ===Download== | ||
- | ===Jurnal=== | ||
{{:pm:prj2021:cghenea:smart_lock.pdf|}} | {{:pm:prj2021:cghenea:smart_lock.pdf|}} | ||
+ | {{:pm:prj2021:cghenea:smartlock.pdf|}} | ||