This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:vnedelceva [2026/05/23 23:02] vnedelceva [Rezultate Obtinute] |
pm:prj2026:alexandru.jipa2803:vnedelceva [2026/05/25 19:37] (current) vnedelceva [Software Design] |
||
|---|---|---|---|
| Line 65: | Line 65: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | **Mediu de dezvoltare:** AVR-GCC + VSCode + PlatformIO | + | **Mediu de dezvoltare:** |
| ^ Periferic ^ Utilizare ^ | ^ Periferic ^ Utilizare ^ | ||
| Line 74: | Line 74: | ||
| | GPIO | Scan keypad matriceal 4x4, LED-uri, buzzer | | | GPIO | Scan keypad matriceal 4x4, LED-uri, buzzer | | ||
| - | **Structura software - masina de stari:** | + | **Masina de stari** |
| - | * **DISARMED** — sistem dezarmat, LED verde aprins, LCD afiseaza "System disarmed / * to arm" | + | Logica principala este implementata ca o masina de stari in functia ''main()'', folosind ''switch(alarm_state)''. Fiecare stare are comportament propriu si tranzitii clare catre urmatoarea: |
| - | * **EXIT DELAY (10s)** — countdown pe LCD dupa apasarea *, timp sa iesi din camera | + | |
| - | * **ARMED** — PIR activ prin INT0, LED rosu aprins, LCD afiseaza "System ARMED" | + | |
| - | * **ENTRY DELAY (15s)** — miscare detectata, countdown accelerat, utilizatorul introduce PIN | + | |
| - | * **ALARM** — buzzer continuu, LED rosu clipeste, dezactivare doar prin PIN corect | + | |
| - | **Functionalitati implementate:** | + | * **DISARMED** — LED verde aprins, LCD afiseaza "System disarmed / * to arm". Sistemul asteapta apasarea ''*'' pentru a initia armarea. |
| - | * Cod PIN implicit: 1234 (configurabil in cod) | + | * **EXIT DELAY (10s)** — countdown afisat pe LCD, bip la fiecare 2 secunde. Utilizatorul are timp sa paraseasca incaperea. |
| - | * Maxim 3 incercari gresite de PIN → declansare imediata alarma | + | * **ARMED** — PIR activ prin intrerupere externa INT0, LED rosu aprins. Orice miscare detectata declanseaza tranzitia spre ENTRY DELAY. |
| - | * Tasta # reseteaza PIN-ul introdus | + | * **ENTRY DELAY (15s)** — countdown pe LCD cu bip accelerat in ultimele 5 secunde. Utilizatorul introduce PIN-ul pentru dezarmare. |
| - | * Senzor MQ-2 cu debounce (10 citiri consecutive) pentru evitarea falselor alarme | + | * **ALARM** — buzzer continuu, LED rosu clipeste, LCD afiseaza "!! ALARM !!". Dezactivare posibila doar prin PIN corect. |
| - | * Warm-up MQ-2 de 30 secunde la pornire | + | |
| - | * Notificari Bluetooth prin UART: armare, miscare detectata, PIN gresit, alarma activa, gaz detectat | + | **Timekeeping non-blocant** |
| + | |||
| + | Pentru a evita blocarea buclei principale cu ''_delay_ms()'', Timer1 este configurat in mod CTC cu prescaler 64 si ''OCR1A = 249'', generand o intrerupere la fiecare 1ms. ISR-ul incrementeaza un contor global ''millis_count''. Functia ''millis()'' returneaza valoarea acestuia cu intreruperile dezactivate temporar (''cli()''/''sei()'') pentru a evita race conditions. Toate countdown-urile sunt calculate ca diferente ''millis() - delay_start''. | ||
| + | |||
| + | **Intrerupere externa PIR** | ||
| + | |||
| + | PIR-ul este conectat la PD2 (INT0) si configurat pe front crescator (''ISC01=1, ISC00=1''). La detectarea miscarii, ISR-ul seteaza un flag ''pir_flag = 1'', procesat in bucla principala doar daca sistemul este in starea ARMED. Aceasta separare intre ISR si logica principala evita executia de cod complex in intrerupere. | ||
| + | |||
| + | **Scan keypad matriceal** | ||
| + | |||
| + | Keypad-ul 4x4 este scanat prin metoda row-by-row: pe rand, fiecare linie (output) este trasa la LOW, iar coloanele (input cu pull-up) sunt citite. O apasare este confirmata prin dubla citire cu debounce de 20ms, iar eliberarea tastei este asteptata activ inainte de a returna caracterul, prevenind inregistrarea multipla a aceleiasi apasari. | ||
| + | |||
| + | **Comunicatie I2C cu LCD** | ||
| + | |||
| + | LCD-ul 16x2 este controlat prin modulul PCF8574 (adresa 0x27). Intreaga comunicatie | ||
| + | este implementata de la zero, fara biblioteci externe — functiile de initializare, | ||
| + | trimitere de comenzi, afisare de caractere si pozitionare cursor sunt scrise manual | ||
| + | prin manipularea directa a registrelor TWI (''TWCR'', ''TWDR'', ''TWBR''). LCD-ul | ||
| + | primeste date in mod 4-bit: fiecare byte este trimis in doua nibble-uri, fiecare cu | ||
| + | pulsul de Enable ridicat si coborat prin I2C pentru a fi citit de LCD. | ||
| + | |||
| + | **Senzor MQ-2** | ||
| + | |||
| + | Senzorul de gaz este citit pe pinul PC1 (iesire digitala DO). La pornire este implementat un warm-up de 30 de secunde pentru stabilizarea senzorului. Un contor de debounce software (''gas_count'') impune 10 citiri consecutive pozitive inainte de a declansa alarma, eliminand spike-urile electrice izolate. | ||
| + | |||
| + | **Cod PIN si securitate** | ||
| + | |||
| + | PIN-ul este stocat ca sir de caractere si comparat cu ''strcmp()''. Cifrele sunt adaugate una cate una la fiecare apasare, afisate ca ''*'' pe LCD. Dupa 3 incercari gresite consecutive sistemul trece direct in STATE_ALARM. Tasta ''#'' reseteaza PIN-ul introdus curent. Fiecare eveniment (armare, miscare, PIN gresit, alarma, gaz) este trimis prin UART catre modulul Bluetooth HC-05, vizibil in aplicatia Serial Bluetooth Terminal. | ||
| ===== Rezultate Obtinute ===== | ===== Rezultate Obtinute ===== | ||
| {{:pm:prj2026:alexandru.jipa2803:5228697284009205102.jpg?400|}} | {{:pm:prj2026:alexandru.jipa2803:5228697284009205102.jpg?400|}} | ||