Differences

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

Link to this comparison view

pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/08 16:26]
bogdan.andrei0509
pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/26 17:17] (current)
bogdan.andrei0509
Line 18: Line 18:
  
 ===== Hardware Design ===== ===== Hardware Design =====
-==== Lista piese ====+==== Lista componente ​====
 ^ Componenta ^ Cantitate ^ Rol ^ ^ Componenta ^ Cantitate ^ Rol ^
 | ATmega328P Xplained Mini | 1 | Creierul sistemului | | ATmega328P Xplained Mini | 1 | Creierul sistemului |
Line 26: Line 26:
 | LED-uri (4 Rosii, 4 Verzi) | 8 | Semnalizare locuri | | LED-uri (4 Rosii, 4 Verzi) | 8 | Semnalizare locuri |
 | Buzzer Activ | 1 | Alerta sonora | | Buzzer Activ | 1 | Alerta sonora |
-| Buton Push | | Cerere acces |+| Buton Push | | Cerere acces |
 | Modul HW-131 + Baterie 9V | 1 | Alimentare sistem | | Modul HW-131 + Baterie 9V | 1 | Alimentare sistem |
 | Rezistente (220 ohm si 10k) | 15 | Protectie si divizoare | | Rezistente (220 ohm si 10k) | 15 | Protectie si divizoare |
 | Condensator 470uF | 1 | Stabilitate servo | | Condensator 470uF | 1 | Stabilitate servo |
  
 +==== Pini utilizati ==== 
 +Pinii Analogici (PC0 - PC3): Folositi pentru Senzorii LDR. Deoarece acestia returneaza o valoare variabila de tensiune, am utilizat convertorul Analog-Digital (ADC) pentru a determina pragul de ocupare.
 +
 +Pinii I2C (PC4 - SDA, PC5 - SCL): Rezervati exclusiv pentru Ecranul OLED. Aceasta permite comunicarea pe doar doua fire, lasand restul pinilor liberi pentru senzori si actuatoare.
 +
 +Pinul PWM (PD3): Utilizat pentru Servomotor. Servomotoarele necesita un semnal de tip Pulse Width Modulation pentru a mentine un unghi precis.
 +
 +Pinul de Intrerupere Externa (PD2 - INT0): Folosit pentru Butonul de acces. Acest pin permite procesorului sa reactioneze instantaneu la apasare, chiar daca acesta executa alte sarcini in loop-ul principal.
 +
 +Pinii Digitali (PD4-PD7 si PB0-PB3): Alocati pentru controlul LED-urilor RGB si a Buzzer-ului (PB5), acestia fiind utilizati pentru semnale simple de tip ON/OFF.
 +
 +==== Schema Electrica ==== 
 +{{ :​pm:​prj2026:​alexandru.predescu:​smart_parking_system.png?​800 |}}
 +Explicatii schema:
 +
 +Divizoarele de tensiune: Fiecare senzor LDR este inseriat cu o rezistenta de 10k ohm. Tensiunea citita de ATmega se modifica in functie de lumina care cade pe fotorezistor (rezistenta LDR scade la lumina).
 +
 +Protectia LED-urilor: Am utilizat rezistente de 220 ohm pentru a limita curentul, protejand atat LED-urile, cat si pinii microcontrollerului impotriva suprasolicitarii.
 +
 +Stabilitatea alimentarii:​ Modulul MB102 primeste 9V de la baterie si furnizeaza o tensiune stabilizata de 5V catre sina principala (VCC). Condensatorul de 220uF este montat in paralel pe alimentarea servomotorului pentru a absorbi socurile de curent la pornirea barierei.
 +
 +===== Software Design =====
 +
 +Sistemul de management al parcarii este implementat in limbaj C pur (AVR C), utilizand programarea modulara si accesul direct la registrele microcontrolerului ATmega328P. Codul este structurat pe mai multe module functionale:​ drivere de periferice (I2C, ADC, GPIO), logica de procesare si controlul executiei.
 +
 +==== Arhitectura Functiilor ====
 +
 +In tabelul de mai jos sunt prezentate toate functiile implementate in cadrul proiectului,​ alaturi de rolul lor in sistem:
 +
 +
 +
 +
 +
 +
 +
 +
 +^ Nume functie ^ Explicatie componenta si legatura directa cu proiectul de parcare ^
 +| I2C_init() | Initializeaza magistrala de comunicare I2C (TWI) a microcontrolerului,​ setand frecventa de ceas necesara pentru a putea trimite date catre noul ecran LCD 1602. |
 +| I2C_start() | Genereaza conditia de START pe magistrala I2C pentru a initia sesiunea de transmisie a datelor text sau a comenzilor catre ecranul LCD. |
 +| I2C_stop() | Genereaza conditia de STOP pe magistrala I2C pentru a elibera linia de comunicare dupa ce ecranul a primit datele despre starea parcarii. |
 +| I2C_write() | Trimite un octet de date primit ca parametru (comanda sau caracter) direct catre cipul adaptor PCF8574 de pe spatele ecranului LCD 1602. |
 +| LCD_send_internal() | Incapsuleaza protocolul I2C: trimite adresa hardware a ecranului (0x27), urmata de datele efective pentru controlul pinilor ecranului (RS, RW, EN, Backlight). |
 +| LCD_pulse() | Activeaza si dezactiveaza rapid pinul de Enable (EN) al ecranului LCD prin intermediul I2C, fortand display-ul sa preia datele trimise pentru procesare. |
 +| LCD_send() | Transmite o comanda sau un caracter catre LCD impartind octetul in doua jumatati (nibbles), deoarece ecranul este configurat sa functioneze in mod economic pe 4 biti. |
 +| LCD_command() | Trimite instructiuni de configurare hardware catre ecran, cum ar fi mutarea cursorului, stergerea ecranului sau setarea modului de scriere. |
 +| LCD_char() | Trimite un singur caracter ASCII (litera, cifra sau simbol) pentru a fi afisat fizic pe ecranul LCD, setand pinul RS (Register Select) pe HIGH. |
 +| LCD_init() | Ruleaza secventa hardware obligatorie de pornire a ecranului LCD 1602, setandu-l in modul de lucru pe 4 biti, activand lumina albastra de fundal si stergand memoria. |
 +| LCD_print() | Primeste un sir de caractere (string) si apeleaza succesiv functia LCD_char pentru a afisa cuvinte complete pe ecran (ex: "​Locuri libere"​). |
 +| LCD_clear() | Sterge instantaneu tot textul afisat pe cele doua randuri ale LCD-ului si readuce cursorul la pozitia initiala (sus-stanga) pentru a pregati o noua afisare. |
 +| ADC_init() | Configureaza convertorul Analog-Digital (ADC) al ATmega328P, setand tensiunea de referinta la 5V si prescalerul pentru citirea senzorilor de lumina. |
 +| ADC_read() | Selecteaza canalul ADC corespunzator unuia dintre cele 4 locuri de parcare si returneaza o valoare numerica proportionala cu intensitatea luminii de pe acel senzor. |
 +| Interrupt_init() | Configureaza pinii PD2 si PD3 ca intrari cu rezistente de pull-up activate si activeaza intreruperile externe INT0 si INT1 pe front cazator (apasare de buton). |
 +| ISR(INT0_vect) | Rutina de intrerupere declansata de butonul de Intrare. Verifica daca parcare are locuri: daca da, aproba accesul si ridica bariera; daca nu, porneste alarma sonora. |
 +| ISR(INT1_vect) | Rutina de intrerupere declansata de butonul de Iesire. Seteaza directia de miscare pe "​iesire"​ si activeaza ridicarea barierei pentru masina care paraseste parcarea. |
 +| servo_pozitie_jos() | Genereaza semnalul PWM software de 1.5ms necesar pentru a mentine servomotorul in pozitia orizontala de 0 grade, blocand accesul in parcare (bariera coborata). |
 +| servo_pozitie_sus() | Genereaza semnalul PWM software de 1.0ms necesar pentru a roti axul servomotorului la 90 de grade, deschizand accesul masinilor (bariera ridicata). |
 +| main() | Bucla principala a proiectului. Citeste continuu cei 4 senzori LDR, aprinde LED-urile corespunzatoare (Verde/​Rosu),​ calculeaza locurile libere, actualizeaza ecranul LCD si controleaza timpii de actionare ai barierei si buzzerului. |
 +
 +==== Fluxul de Executie ====
 +
 +1. **Etapa de Initializare:​** La alimentarea placii, se configureaza perifericele prin functiile de initializare:​ ''​I2C_init()''​ si ''​LCD_init()''​ pentru pornirea ecranului, ''​ADC_init()''​ pentru senzorii de lumina si ''​Interrupt_init()''​ pentru activarea butoanelor pe pinii de intreruperi externe (PD2 si PD3). Tot acum se seteaza pinii de iesire pentru LED-uri, buzzer si servomotor (DDRB si DDRD).
 +
 +2. **Etapa de Scanare si Monitorizare (Loop):** In bucla principala ''​main()'',​ microcontrolerul citeste ciclic starea celor 4 senzori LDR folosind ''​ADC_read()''​. In functie de pragul de lumina, algoritmul aprinde LED-ul corespunzator (Verde pentru loc liber, Rosu pentru loc ocupat) si calculeaza in timp real numarul total de ''​locuri_libere''​.
 +
 +3. **Etapa de Afisare:** Datele procesate sunt trimise catre ecranul LCD 1602 prin functiile ''​LCD_command()''​ si ''​LCD_print()''​. Daca mai exista locuri, se afiseaza numarul lor; daca parcarea este plina, pe ecran va aparea mesajul "​PARCARE PLINA!"​.
 +
 +4. **Etapa de Eveniment (Intreruperi):​** Sistemul reactioneaza instant la actiunile soferilor prin rutinele de intrerupere:​
 +  * **La apasarea butonului de Intrare (INT0):** Daca sunt locuri libere, se activeaza flag-ul ''​bariera_activa'',​ se afiseaza mesajul de bun venit si se apeleaza ''​servo_pozitie_sus()''​. Daca parcarea e plina, se activeaza flag-ul ''​parcare_plina_bip''​ si buzzerul emite 3 semnale sonore scurte de respingere.
 +  * **La apasarea butonului de Iesire (INT1):** Se ridica automat bariera pentru a permite iesirea masinii, afisand mesajul de drum bun.
 +
 +5. **Etapa de Resetare Bariera:** Dupa ce masina a trecut si timpul de asteptare s-a scurs, se apeleaza ''​servo_pozitie_jos()''​ pentru a cobori bariera, iar ecranul revine la starea initiala de monitorizare.
 +==== Cod sursa ====
 +https://​github.com/​Bogdan594/​Smart-Parking-System/​tree/​main
 +
 +==== Video cu proiectul ====
 +https://​www.youtube.com/​watch?​v=XeezoRPa95w
pm/prj2026/alexandru.predescu/bogdan.andrei0509.1778246817.txt.gz · Last modified: 2026/05/08 16:26 by bogdan.andrei0509
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