Differences

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

Link to this comparison view

pm:prj2026:alexandru.jipa2803:vnedelceva [2026/05/23 21:42]
vnedelceva [Descriere generala]
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-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:​5206555671036369584.jpg?400|}}+{{:​pm:​prj2026:​alexandru.jipa2803:​5228697284009205102.jpg?400|}}
  
 ===== Concluzii ===== ===== Concluzii =====
pm/prj2026/alexandru.jipa2803/vnedelceva.1779561741.txt.gz · Last modified: 2026/05/23 21:42 by vnedelceva
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