This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/26 14:39] bogdan.andrei0509 [Arhitectura Functiilor] |
pm:prj2026:alexandru.predescu:bogdan.andrei0509 [2026/05/26 17:17] (current) bogdan.andrei0509 |
||
|---|---|---|---|
| Line 67: | Line 67: | ||
| - | | Nume Functie | Descriere / Rol in Proiect | | + | ^ Nume functie ^ Explicatie componenta si legatura directa cu proiectul de parcare ^ |
| - | | I2C_init | Initializeaza magistrala I2C (configurand prescalerul TWSR si registrul de rata TWBR la valoarea 72) pentru a stabili frecventa de ceas. | | + | | 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 si asteapta finalizarea acesteia prin verificarea flag-ului hardware (TWINT). | | + | | 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 comunicatie, urmata de o scurta temporizare. | | + | | 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 | Incarca un octet de date in registrul TWDR si il transmite pe magistrala catre dispozitivul sclav (expandorul LCD-ului), asteptand confirmarea. | | + | | 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 | Functie ajutatoare care impacheteaza transmisia I2C completa (START, adresa LCD in mod scriere 0x27 << 1, trimitere date si STOP). | | + | | 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 | 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_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 | 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_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 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_command() | Trimite instructiuni de configurare hardware catre ecran, cum ar fi mutarea cursorului, stergerea ecranului sau setarea modului de scriere. | |
| - | | 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_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 | Realizeaza secventa hardware standard de initializare a ecranului LCD in modul de lucru pe 4 biti, urmata de configurarea cursorului si stergerea ecranului. | | + | | 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 afiseaza fiecare caracter pe rand pe ecran, pana la intalnirea terminatorului de sir. | | + | | 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 | Trimite comanda de stergere completa a ecranului (0x01) si asteapta timpul necesar executiei acesteia. | | + | | 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 | Initializeaza perifericul ADC (Analog-to-Digital Converter), setand tensiunea de referinta la AVCC (5V) si activand prescalerul (divizor de frecventa). | | + | | 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 analogic primit ca parametru (0-3 pentru senzori), porneste conversia, asteapta finalizarea acesteia si returneaza valoarea digitala (0-1023). | | + | | 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 interne activate si seteaza intreruperile externe INT0 si INT1 sa se declanseze pe front cazator (Falling Edge). | | + | | 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 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(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 pentru butonul de iesire. Daca bariera este inactiva, o activeaza si seteaza directia de iesire. | | + | | 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 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_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 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. | | + | | 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 | 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. | | + | | 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 | ||