This shows you the differences between two versions of the page.
|
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 | 1 | Cerere acces | | + | | Buton Push | 2 | 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 | ||