This is an old revision of the document!
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.
| 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 |
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.
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.
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.
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. |
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.