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 Descriere / Rol in Proiect
I2C_init Initializeaza magistrala I2C (configurand prescalerul TWSR si registrul de rata TWBR la valoarea 72) pentru a stabili frecventa de ceas.
I2C_start Genereaza conditia de START pe magistrala I2C si asteapta finalizarea acesteia prin verificarea flag-ului hardware (TWINT).
I2C_stop Genereaza conditia de STOP pe magistrala I2C pentru a elibera linia de comunicatie, urmata de o scurta temporizare.
I2C_write Incarca un octet de date in registrul TWDR si il transmite pe magistrala catre dispozitivul sclav (expandorul LCD-ului), asteptand confirmarea.
LCD_send_internal Functie ajutatoare care impacheteaza transmisia I2C completa (START, adresa LCD in mod scriere 0x27 « 1, trimitere date si STOP).
LCD_pulse Genereaza un impuls pe pinul EN (Enable) al LCD-ului (tranzitie Sus-Jos) pentru a determina ecranul sa preia nibble-ul de date trimis prin expandor, pastrand iluminarea de fundal (BL) activa.
LCD_send Imparte un octet de date in doua grupuri de cate 4 biti (high nibble si low nibble) si le trimite succesiv catre LCD folosind functia LCD_pulse (mod de lucru pe 4 biti).
LCD_command Trimite o comanda de configurare catre LCD (cum ar fi mutarea cursorului) apeland LCD_send cu parametrul de mod setat pe 0 (pinul RS dezactivat).
LCD_char Trimite un caracter ASCII catre ecran pentru a fi afisat pe pozitia curenta, apeland LCD_send cu pinul RS activat (1 « RS).
LCD_init Realizeaza secventa hardware standard de initializare a ecranului LCD in modul de lucru pe 4 biti, urmata de configurarea cursorului si stergerea ecranului.
LCD_print Primeste un sir de caractere (string) si afiseaza fiecare caracter pe rand pe ecran, pana la intalnirea terminatorului de sir.
LCD_clear Trimite comanda de stergere completa a ecranului (0x01) si asteapta timpul necesar executiei acesteia.
ADC_init Initializeaza perifericul ADC (Analog-to-Digital Converter), setand tensiunea de referinta la AVCC (5V) si activand prescalerul (divizor de frecventa).
ADC_read Selecteaza canalul analogic primit ca parametru (0-3 pentru senzori), porneste conversia, asteapta finalizarea acesteia si returneaza valoarea digitala (0-1023).
Interrupt_init Configureaza pinii PD2 si PD3 ca intrari cu rezistente de pull-up interne activate si seteaza intreruperile externe INT0 si INT1 sa se declanseze pe front cazator (Falling Edge).
ISR(INT0_vect) Rutina de intrerupere pentru butonul de intrare. Daca sunt locuri libere si bariera e inactiva, porneste bariera (sens intrare). Daca parcarea este plina, activeaza flag-ul de bip de eroare.
ISR(INT1_vect) Rutina de intrerupere pentru butonul de iesire. Daca bariera este inactiva, o activeaza si seteaza directia de iesire.
servo_pozitie_jos Genereaza un impuls software de PWM (1.5 ms pe starea High, restul pana la 20 ms pe Low) pe pinul PB4 pentru a pozitiona bratul servomotorului in pozitia de bariera coborata.
servo_pozitie_sus Genereaza un impuls software de PWM (1.0 ms pe starea High, restul pana la 20 ms pe Low) pe pinul PB4 pentru a pozitiona bratul servomotorului in pozitia de bariera ridicata.
main Punctul de intrare in program. Configureaza directia pinilor pentru LED-uri, servo si buzzer, apeleaza initializarile, activeaza global intreruperile (sei()), iar in bucla infinita monitorizeaza senzorii LDR, actualizeaza numarul de locuri, aprinde LED-urile aferente si gestioneaza starile barierei sau ale alertei de parcare plina.

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.1779795557.txt.gz · Last modified: 2026/05/26 14:39 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