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 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

Video cu proiectul

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