This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/22 15:52] bogdan.andrei0509 |
pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/26 17:17] (current) bogdan.andrei0509 |
||
|---|---|---|---|
| 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 | | ||
| Line 60: | Line 60: | ||
| In tabelul de mai jos sunt prezentate toate functiile implementate in cadrul proiectului, alaturi de rolul lor in sistem: | 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 registrul TWBR) la o frecventa standard de ~100kHz. | | + | |
| - | | '''I2C_Start''' | Genereaza conditia de START pe magistrala I2C si asteapta confirmarea hardware. | | + | |
| - | | '''I2C_Write''' | Transmite un octet de date pe magistrala I2C catre dispozitivul sclav. | | + | |
| - | | '''LCD_Write_I2C''' | Trimite comenzi sau date catre ecranul LCD prin intermediul expandorului PCF8574, folosind protocolul pe 4 biti. | | + | |
| - | | '''LCD_Cmd''' | Trimite o comanda de configurare catre LCD (ex: mutare cursor, stergere ecran). | | + | |
| - | | '''LCD_Data''' | Trimite un caracter ASCII catre ecran pentru a fi afisat pe pozitia curenta. | | + | |
| - | | '''LCD_Init''' | Realizeaza secventa de initializare hardware a ecranului LCD in modul de lucru pe 4 biti. | | + | ^ Nume functie ^ Explicatie componenta si legatura directa cu proiectul de parcare ^ |
| - | | '''LCD_Afiseaza_Locuri''' | Sterge partial ecranul si afiseaza dinamic numarul de locuri libere, plus mesajul de status corespunzator. | | + | | 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. | |
| - | | '''ADC_Init''' | Configureaza perifericul ADC (Analog-to-Digital Converter), seteaza referinta la 5V si prescalerul la 128. | | + | | I2C_start() | Genereaza conditia de START pe magistrala I2C pentru a initia sesiunea de transmisie a datelor text sau a comenzilor catre ecranul LCD. | |
| - | | '''ADC_Read''' | Selectaza canalul analogic (0-7), porneste conversia si returneaza valoarea digitala (0-1023) citita de pe pin. | | + | | I2C_stop() | Genereaza conditia de STOP pe magistrala I2C pentru a elibera linia de comunicare dupa ce ecranul a primit datele despre starea parcarii. | |
| - | | '''Hardware_Init''' | Configureaza pinii I/O (directii LED-uri, buton cu pull-up, buzzer) si apeleaza initializarile pentru ADC, I2C si LCD. | | + | | I2C_write() | Trimite un octet de date primit ca parametru (comanda sau caracter) direct catre cipul adaptor PCF8574 de pe spatele ecranului LCD 1602. | |
| - | | '''Actualizeaza_Locuri_Si_Numara''' | Citeste succesiv cele 4 LDR-uri, aprinde/stinge LED-urile aferente fiecarui loc si returneaza numarul total de locuri libere. | | + | | LCD_send_internal() | Incapsuleaza protocolul I2C: trimite adresa hardware a ecranului (0x27), urmata de datele efective pentru controlul pinilor ecranului (RS, RW, EN, Backlight). | |
| - | | '''Buzzer_Sunet_Eroare''' | Genereaza o alerta sonora sacadata (Beep-Beep) prin pinul de buzzer atunci cand parcarea este plina. | | + | | 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. | |
| - | | '''Bariera_Deschide''' | Simuleaza deschiderea barierei prin generarea unui sunet lung de confirmare si mentine o temporizare de 2 secunde. | | + | | 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. | |
| - | | '''main''' | Punctul de intrare in program. Ruleaza initializarile, apoi executa bucla infinita in care scaneaza senzorii, actualizeaza ecranul si verifica starea butonului. | | + | | 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 ==== | ==== 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. | + | 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 (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''. | + | 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 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''. | + | 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 ==== | ==== Cod sursa ==== | ||
| https://github.com/Bogdan594/Smart-Parking-System/tree/main | https://github.com/Bogdan594/Smart-Parking-System/tree/main | ||
| + | |||
| + | ==== Video cu proiectul ==== | ||
| + | https://www.youtube.com/watch?v=XeezoRPa95w | ||