This is an old revision of the document!


Smart Parking System

Introducere

Proiectul consta in realizarea unui sistem automatizat de gestionare a unei parcari cu 4 locuri, utilizand placa de dezvoltare ATmega328P.

Scopul principal este monitorizarea ocuparii locurilor in timp real si controlul accesului prin bariera. Ideea a pornit de la nevoia de a reduce timpul pierdut in trafic pentru cautarea unui loc liber.

Descriere generală

Sistemul este organizat in jurul microcontrollerului ATmega328P care coordoneaza urmatoarele module:

  • module de detectie: 4 senzori LDR (fotorezistori) montati pe fiecare loc de parcare
  • modul de acces: un buton si un servomotor ce actioneaza asupra unei bariere
  • modul de afisaj: ecran OLED I2C pentru informatii text si LED-uri pentru un status vizual

Hardware Design

Lista componente

Componenta Cantitate Rol
ATmega328P Xplained Mini 1 Creierul sistemului
Ecran OLED 0.96” I2C 1 Afisare status locuri
Servomotor SG90 1 Actionare bariera
Fotorezistori (LDR) 4 Detectie masini
LED-uri (4 Rosii, 4 Verzi) 8 Semnalizare locuri
Buzzer Activ 1 Alerta sonora
Buton Push 2 Cerere acces
Modul HW-131 + Baterie 9V 1 Alimentare sistem
Rezistente (220 ohm si 10k) 15 Protectie si divizoare
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

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 apeleaza Hardware_Init care configureaza registrele de directie (DDRD, DDRC) si pregateste comunicarea cu ecranul si senzorii.

2. Etapa de Scanare (Loop): In bucla infinita, se apeleaza ciclic Actualizeaza_Locuri_Si_Numara pentru a verifica statusul celor 4 locuri. Datele sunt procesate si trimise instant catre LCD prin LCD_Afiseaza_Locuri.

3. Etapa de Decizie: Sistemul monitorizeaza pinul butonului (PD6). La apasare, algoritmul verifica variabila de locuri libere: daca este > 0, se apeleaza Bariera_Deschide; in caz contrar, se declanseaza Buzzer_Sunet_Eroare.

Cod sursa

pm/prj2026/alexandru.predescu/bogdan.andrei0509.1779795997.txt.gz · Last modified: 2026/05/26 14:46 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