Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:vlad.radulescu2901:dimitrie.constantin [2026/05/24 22:28]
dimitrie.constantin
pm:prj2026:vlad.radulescu2901:dimitrie.constantin [2026/05/25 16:04] (current)
dimitrie.constantin
Line 3: Line 3:
 ===== Introducere ===== ===== Introducere =====
  
-SafeDrive este un sistem embedded de siguranță conceput pentru a simula funcționalitatea dispozitivelor comerciale de tip Alcolock. Obiectivul său principal este de a evalua concentrația de alcool din aerul expirat de șofer și de a preveni activ pornirea motorului vehiculului dacă limita legală este depășită. ​+SafeDrive este un sistem embedded de siguranță conceput pentru a simula funcționalitatea dispozitivelor comerciale de tip Alcolock. Obiectivul său principal este de a evalua concentrația de alcool din aerul expirat de șofer și de a preveni activ pornirea motorului vehiculului dacă limita legală este depășită.
  
-Motivația din spatele acestui proiect este construirea unei aplicații tangibile, menite să salveze vieți, care face legătura între senzorii hardware de bază și sistemele de siguranță activă. Prin renunțarea la mediul standard Arduino, acest proiect servește drept un exercițiu complex de programare AVR. Acesta provoacă dezvoltatorul să orchestreze perfect multiple periferice hardware — cum ar fi ADC pentru procesarea semnalelor analogice, ​SPI pentru gestionarea sistemului ​de fișiere, I2C pentru afișarea datelor și Timerele hardware pentru ​generarea semnalului audio digital ​— într-o singură aplicație unitară, bazată pe întreruperi.+Motivația din spatele acestui proiect este construirea unei aplicații tangibile, menite să salveze vieți, care face legătura între senzorii hardware de bază și sistemele de siguranță activă. Prin renunțarea la mediul standard Arduino, acest proiect servește drept un exercițiu complex de programare AVR. Acesta provoacă dezvoltatorul să orchestreze perfect multiple periferice hardware — cum ar fi ADC pentru procesarea semnalelor analogice, ​I2C operat manual la nivel de regiștri pentru afișarea datelor, UART Software pentru multimedia ​și Timerele hardware pentru ​o arhitectură complet non-blocantă ​— într-o singură aplicație unitară, bazată pe întreruperi.
  
 ===== Descriere generală ===== ===== Descriere generală =====
Line 13: Line 13:
 Întregul flux operațional este orchestrat de microcontrolerul ATmega328P. Arhitectura sistemului este împărțită în patru blocuri logice principale: Întregul flux operațional este orchestrat de microcontrolerul ATmega328P. Arhitectura sistemului este împărțită în patru blocuri logice principale:
  
-  * **Pornire bazată pe Întreruperi (Interrupt-Driven):​** Interacțiunea începe când utilizatorul apasă butonul de "​Contact"​. În loc să irosească cicluri de procesor verificând constant starea butonului (polling), sistemul se bazează pe o Întrerupere Externă (INT0) pentru a se trezi instantaneu și a declanșa secvența de testare. +  * **Pornire bazată pe Întreruperi (Interrupt-Driven):​** Interacțiunea începe când utilizatorul apasă butonul de "​Contact"​. În loc să irosească cicluri de procesor verificând constant starea butonului (polling), sistemul se bazează pe o Întrerupere Externă (INT1) pentru a se trezi instantaneu și a declanșa secvența de testare. 
-  * **Procesarea Semnalelor Analogice:​** Un senzor de gaz MQ-3 furnizează continuu o tensiune analogică proporțională cu concentrația de alcool către ADC-ul microcontrolerului. +  ​ 
-  * **Feedback Vizual în Timp Real:** Stările sistemului, ​instrucțiunile pentru utilizator (ex: "Va rugam suflati",​ "Motor Blocat"​) ​și citirile senzorului ​sunt trimise către un ecran LCD 1602. Comunicarea este gestionată eficient prin protocolul I2C folosind un expandor PCF8574. +  * **Procesarea Semnalelor Analogice:​** Un senzor de gaz MQ-3 furnizează continuu o tensiune analogică proporțională cu concentrația de alcool către ADC-ul microcontrolerului, valoarea fiind filtrată digital și analizată printr-un algoritm de Peak-Hold timp de 7 secunde. 
-  * **Sistem de Alertă Multimedia:​** Dacă sistemul detectează un test picat, simulează blocarea motorului (indicată de un LED Roșu) și declanșează o avertizare ​sonoră. Microcontrolerul ​montează un card MicroSD ​via SPI, citește un fișier audio digital ​(.wav) și controlează un difuzor de 8Ω folosind ​semnale Fast PWM de înaltă frecvență.+  ​ 
 +  * **Feedback Vizual ​Custom ​în Timp Real:** Stările sistemului, ​timpul rămas ​și alcoolemia instantanee ​sunt trimise către un ecran LCD 20x4. Comunicarea este gestionată eficient prin protocolul I2C folosind un expandor PCF8574, condus printr-un driver software scris manual de la zero, fără biblioteci dedicate LCD. 
 +  ​ 
 +  * **Sistem de Alertă Multimedia ​și Auditiv:** Dacă sistemul detectează un test picat, simulează blocarea motorului (LED Roșu) și declanșează o avertizare. Microcontrolerul ​comandă via UART (SoftwareSerialun modul DFPlayer Mini pentru asistență vocală ​și pulsează asincron ​un buzzer activ folosind ​baza de timp a Timerului 1.
  
 ===== Hardware Design ===== ===== Hardware Design =====
  
-Tabelul de mai jos detaliaază componentele necesare pentru a construi prototipul SafeDrive:+Tabelul de mai jos detaliază componentele necesare pentru a construi prototipul SafeDrive:
  
 ^ Nr. ^ Nume Componentă ^ Cant. ^ Rol Tehnic & Detalii ^ ^ Nr. ^ Nume Componentă ^ Cant. ^ Rol Tehnic & Detalii ^
 | 1 | ATmega328P Xplained Mini | 1 | Unitatea centrală de procesare care gestionează toată logica, întreruperile și timpii de execuție. | | 1 | ATmega328P Xplained Mini | 1 | Unitatea centrală de procesare care gestionează toată logica, întreruperile și timpii de execuție. |
 | 2 | Modul Senzor de Gaz MQ-3 | 1 | Detectează concentrația de alcool; oferă un semnal analogic (0-5V). | | 2 | Modul Senzor de Gaz MQ-3 | 1 | Detectează concentrația de alcool; oferă un semnal analogic (0-5V). |
-| 3 | Display LCD 1602 + I2C | 1 | Oferă feedback vizual. Modulul PCF8574 atașat reduce cablarea la doar pinii SDA și SCL. | +| 3 | Display LCD 20x4 + I2C | 1 | Oferă feedback vizual ​extins. Modulul PCF8574 atașat reduce cablarea la doar pinii SDA și SCL. | 
-| 4 | Adaptor Card MicroSD ​| 1 | Acționează ca unitate de stocare pentru fișierele audio; comunică prin magistrala SPI. | +| 4 | Modul Audio DFPlayer Mini | 1 | Acționează ca unitate de decodare și stocare ​(MicroSD) ​pentru fișierele audio de ghidare. | 
-| 5 | Difuzor 8Ω 0.5W | 1 | Convertește semnalele electrice ​PWM în avertizări sonore/​vocale. | +| 5 | Modul Amplificator LM386 Mono | 1 | Prelucrează semnalul de nivel mic (DAC) din playerul audio pentru a ataca eficient difuzorul. | 
-| 6 | Tranzistor NPN 2N2222 | 1 | Acționează ca un amplificator pentru difuzor, comandat de pinul PWM al microcontrolerului (include o rezistență de bază de 1kΩ). | +| 6 | Difuzor 8Ω 0.5W | 1 | Convertește semnalele electrice ​amplificate ​în avertizări sonore/​vocale. | 
-| 7 | Buton tactil (Push Button) | 1 | Simulează contactul mașinii, fiind conectat la un pin de întrerupere externă. | +| 7 | Buton tactil (Push Button) | 1 | Simulează contactul mașinii, fiind conectat la un pin de întrerupere externă ​hardware. | 
-| 8 | LED-uri de Status (R, G, V) | 3 | Indică starea simulată a motorului (Blocat/​Avertisment/​Deblocat). | +| 8 | LED-uri de Status (R, B, V) | 3 | Indică starea simulată a motorului (Blocat/​Avertisment/​Deblocat). | 
-| 9 | Breadboard 830 puncte | 1 | Platforma principală de prototipare pentru rutarea alimentării și a semnalelor. | +| 9 | Buzzer Activ | 1 | Oferă semnalizare acustică suplimentară (chiuit EKG) la depășirea pragului critic. | 
-10 | Fire conexiune DuPont | 1 set | Folosite pentru interconectarea modulelor cu placa Xplained Mini. |+| 10 | Breadboard 830 puncte | 1 | Platforma principală de prototipare pentru rutarea alimentării și a semnalelor. | 
 +11 | Fire conexiune DuPont | 1 set | Folosite pentru interconectarea modulelor cu placa Xplained Mini. |
  
 ===== Alocarea Pinilor (Pinout) și Justificare ===== ===== Alocarea Pinilor (Pinout) și Justificare =====
Line 38: Line 42:
 Alocarea pinilor nu a fost aleatorie, ci a respectat strict arhitectura internă a microcontrolerului ATmega328P: Alocarea pinilor nu a fost aleatorie, ci a respectat strict arhitectura internă a microcontrolerului ATmega328P:
  
-  * **Modul MicroSD (SPI):** Sunt folosiți pinii hardware SPI dedicați: **PB2 (CS), PB3 (MOSI), PB4 (MISO) și PB5 (SCK)**. Utilizarea perifericului SPI hardware este obligatorie pentru a atinge viteza necesară citirii fișierelor audio fără lag. 
   * **Ecran LCD (I2C):** Sunt folosiți pinii **PC4 (SDA)** și **PC5 (SCL)**. Aceștia sunt pinii hardware dedicați magistralei TWI (Two-Wire Interface).   * **Ecran LCD (I2C):** Sunt folosiți pinii **PC4 (SDA)** și **PC5 (SCL)**. Aceștia sunt pinii hardware dedicați magistralei TWI (Two-Wire Interface).
-  * **Ieșire ​Audio (WAV):** Este utilizat pinul **PB1 (D9)**. Acest pin corespunde ieșirii **OC1A**, fiind legat direct la Timer-ul 1 pe 16-biți, necesar ​pentru ​a genera semnale Fast PWM de înaltă frecvență+  ​ 
-  * **Senzor MQ-3 (Analog Out):** Este conectat la **PC1 (A1)**, un canal direct al convertorului Analog-Digital ​(ADC) intern. +  ​* **Modul Audio DFPlayer ​(UART):** Sunt utilizați pinii **PB2 (D10 - RX)** ș**PB3 (D11 - TX)** emulați prin SoftwareSeriallăsând portul hardware UART nativ liber pentru ​debugging pe PC. 
-  * **LED-uri RGB și Buzzer:** Sunt conectate la pini GPIO standard (**PD2, PD4, PD7** pentru LED; **PB0** pentru buzzer), ​deoarece necesită doar comutare digitală simplă (HIGH/LOW)+  ​ 
-  * **Buton (Contact):​** Este conectat la **PC0 (A0)** și utilizează o întrerupere ​de tip PCINT (Pin Change Interrupt) pentru a trezi sistemul din modul sleep.+  * **Senzor MQ-3 (Analog Out):** Este conectat la **PC1 (ADC1)**, un canal direct al convertorului Analog-Digital intern. 
 +  ​ 
 +  * **LED-uri RGB și Buzzer:** Sunt conectate la pini GPIO standard (**PD2, PD4, PD7** pentru LED-uri; **PB0** pentru buzzer), ​manipulate direct prin bitmasking pe regiștri. 
 +  ​ 
 +  * **Buton (Contact):​** Este conectat la **PD3 (INT1)**, permițând trezirea ​și comutarea ​de stare instantanee exclusiv prin vectorul de întrerupere hardware pe front căzător.
  
 ===== Explicația Schemei Electrice ===== ===== Explicația Schemei Electrice =====
  
-{{:​pm:​prj2026:​vlad.radulescu2901:​schema_electrica.png?400|}} +{{ :​pm:​prj2026:​vlad.radulescu2901:​schema_electrica_constantindimitrie_buna.png?850 |}} 
-  * **Magistralele de alimentare:​** Toate modulele împart o alimentare comună. Magistrala de +5V și cea de GND sunt distribuite printr-un breadboard de la pinii de putere ai plăcii Xplained Mini. + 
-  * **Protecția logică:** Butonul de contact utilizează ​rezistență de pull-down de 10kΩ pentru a asigura un nivel logic LOW (0V) stabil atunci când nu este apăsat. LED-urile ​RGB sunt protejate de rezistențe limitatoare de curent de 220Ω pe fiecare canal. +  * **Magistralele de alimentare:​** Toate modulele împart o alimentare comună. Magistrala de +5V și cea de GND sunt distribuite printr-un breadboard de la pinii de putere ai plăcii Xplained Mini, având un condensator electrolitic principal de filtrare pentru absorbția vârfurilor de curent generate de amplificatorul audio. 
-  * **Filtrarea Audio:** Semnalul ​PWM generat de microcontroler ​este digital ​(unde dreptunghiulare). Pentru a fi transformat într-un semnal audio analogic ascultabiltrece printr-un convertor digital-analogic (DAC) pasiv, format dintr-un filtru RC trece-jos (Rezistență 1kΩ în serie și Condensator 100nF în paralel spre GND), înainte ​de a intra în modulul amplificator.+  ​ 
 +  * **Protecția logică:** Butonul de contact utilizează rezistențde pull-up internă activată din cod pentru a asigura un nivel logic HIGH stabil atunci când nu este apăsat. LED-urile sunt protejate de rezistențe limitatoare de curent de 330Ω pe fiecare canal. 
 +  ​ 
 +  * **Filtrarea Audio:** Semnalul ​audio curat este extras din pinul DAC (neamplificatal modulului DFPlayer și rutat direct către intrarea modulului LM386asigurând ​un sunet puternic ​și clar pe difuzorul ​de . 
 ===== Software Design ===== ===== Software Design =====
  
Line 56: Line 67:
  
   * **IDE & Toolchain:​** Visual Studio, PlatformIO   * **IDE & Toolchain:​** Visual Studio, PlatformIO
 +  ​
   * **Logica Principală de Implementare:​**   * **Logica Principală de Implementare:​**
-    * **Supra-eșantionare și Mediere ADC:** Pentru ​atenua zgomotul inerent al senzorului MQ-3, ADC-ul este configurat să preia mai multe antioane rapide într-o fereastră de 3 secunde. Aceste citiri sunt mediate pentru a produce o valoare finală extrem de stabilă. +    * **Baza de Timp Asincronă:** S-utilizat Timer-ul 1 în mod CTC pentru a genera un "​tick"​ exact la fiecare 500ms. Acesta guvernează decrementarea ferestrei de test (7 secunde), ​antionarea pe senzor și pulsarea buzzer-ului, lăsând funcția ''​loop()''​ complet non-blocantă. 
- +     
-<note tip> +    * **Mașină de Stări ​(FSM):** Sistemul funcționează pe baza unei arhitecturi finite-state-machine,​ fiecare stare controlând simultan LCD-ul, LED-urile, buzzer-ul ​și feedback-ul audio. 
-(Etapa 3Detalii tehnice suplimentare,​ inclusiv configurările specifice ale regiștrilor ​și schema logică a buclei principalevor fi documentate în această secțiune după finalizarea codului. +     
-</​note>​+    * **Comunicare I2C Low-Level:​** Driverul pentru LCD a fost implementat manual prin manipularea directă a registrelor TWIfără utilizarea bibliotecilor standard Arduino.
  
 ===== Explicarea calibrării elementelor de senzoristică ===== ===== Explicarea calibrării elementelor de senzoristică =====
Line 67: Line 79:
 Calibrarea senzorului analogic de gaz MQ-3 (bazat pe dioxid de staniu - SnO2) a necesitat o abordare empirică, divizată în două etape esențiale datorită naturii termochimice a componentei:​ Calibrarea senzorului analogic de gaz MQ-3 (bazat pe dioxid de staniu - SnO2) a necesitat o abordare empirică, divizată în două etape esențiale datorită naturii termochimice a componentei:​
  
-  * **Pre-încălzirea (Burn-in hardware):​** Deoarece senzorul funcționează pe baza unui filament de încălzire intern, acesta necesită o perioadă de stabilizare. La prima utilizare, componenta a fost menținută alimentată timp de 24 de ore în aer curat pentru a se "​arde"​ pelicula internă. Suplimentar,​ la fiecare testare curentă este prevăzut un timp de caldaj (warm-up) de 5-10 minute. ​Fără această etapă, senzorul raportează valori fals-pozitive uriașe din cauza umezelii și a impurităților reziduale de pe suprafața ceramică. +  * **Pre-încălzirea (Burn-in hardware):​** Deoarece senzorul funcționează pe baza unui filament de încălzire intern, acesta necesită o perioadă de stabilizare. La prima utilizare, componenta a fost menținută alimentată timp de 24 de ore în aer curat pentru a se "​arde"​ pelicula internă. Suplimentar,​ la fiecare testare curentă este prevăzut un timp de caldaj (warm-up) de 5-10 minute. 
-  * **Determinarea pragului de repaus (Baseline) și conversia:​** Prin monitorizarea valorilor brute (Raw ADC, cuprinse între 0 și 1023) via portul Serial într-un mediu cu aer curat, s-a determinat o constantă de bază a mediului (stocată în variabila ''​prag_aer_curat''​). Pentru a obține o estimare a concentrației de alcool, sistemul calculează diferența dintre valoarea curentă citită și acest prag de repaus, aplicând ulterior un factor de atenuare și o conversie liniară empirică:+  ​ 
 +  * **Determinarea pragului de repaus (Baseline) și conversia:​** Prin monitorizarea valorilor brute via portul Serial într-un mediu cu aer curat, s-a determinat o constantă de bază a mediului ​de aprox. 120 (stocată în variabila ''​prag_aer_curat''​). Pentru a obține o estimare a concentrației de alcool, sistemul calculează diferența dintre valoarea curentă citită și acest prag de repaus, aplicând ulterior un factor de atenuare și o conversie liniară empirică:
  
 <​code>​ <​code>​
Line 81: Line 94:
  
 **1. Optimizarea memoriei dinamice (Prevenirea Memory Leaks / Heap Fragmentation)** **1. Optimizarea memoriei dinamice (Prevenirea Memory Leaks / Heap Fragmentation)**
-  ​* **Cum:** Au fost eliminate complet instanțierile de obiecte de tip ''​String()'' ​(ex. ''​String(valoare_bruta)''​) ​din rutinele de logging serial. Concatenările costisitoare au fost înlocuite cu apeluri succesive, bazate pe text constant, folosind ''​Serial.print()''​. În plus, printarea datelor de diagnoză a fost mutată strict în interiorul blocului condiționat de flag-ul Timerului 1. + 
-  * **De ce:** Alocarea și dezalocarea dinamică repetată la viteze mari (în bucla infinită ''​loop()''​) ​ducea la fragmentarea rapidă a memoriei SRAM. Această epuizare a resurselor bloca procesorul într-o buclă de așteptare, provocând "​înghețarea"​ sistemului ​exact la momentul trecerii prin pragurile superioare de alertă sau la comunicarea UART cu modulul DFPlayer.+  ​* **Cum:** Au fost eliminate complet instanțierile de obiecte de tip ''​String()''​ din rutinele de logging serial. Concatenările costisitoare au fost înlocuite cu apeluri succesive, bazate pe text constant, folosind ''​Serial.print()''​. În plus, printarea datelor de diagnoză a fost mutată strict în interiorul blocului condiționat de flag-ul Timerului 1. 
 +  ​ 
 +  * **De ce:** Alocarea și dezalocarea dinamică repetată la viteze mari ducea la fragmentarea rapidă a memoriei SRAM. Această epuizare a resurselor bloca procesorul într-o buclă de așteptare, provocând "​înghețarea"​ sistemului. 
 +  ​
   * **Unde:** În funcțiile ''​loop()''​ și ''​procesare_date_senzor()''​.   * **Unde:** În funcțiile ''​loop()''​ și ''​procesare_date_senzor()''​.
  
 **2. Filtru digital de netezire (Low-Pass Filter / Exponential Moving Average)** **2. Filtru digital de netezire (Low-Pass Filter / Exponential Moving Average)**
-  ​* **Cum:** A fost implementat un filtru matematic software pe eșantioanele ADC citite de senzor. A fost utilizată o variabilă locală ''​static''​ pentru a reține starea istorică a citirilor între apelurile funcțieiaplicând ​următoarea ecuație ​de mediere exponențială:+ 
 +  ​* **Cum:** A fost implementat un filtru matematic software pe eșantioanele ADC citite de senzor, ​folosind ​următoarea ecuație:
  
 <​code>​ <​code>​
Line 92: Line 109:
 </​code>​ </​code>​
  
-  * **De ce:** Senzorul MQ-3 are o reacție termochimică ​extrem de violentă la contactul cu surse concentrate de vapori ​(precum alcoolul sanitar folosit în demonstrații),​ generând o creștere instantanee tip treaptă a semnalului. Acest șoc ar fi forțat mașina de stări să sară direct de la "​OK"​ la starea critică "​DECEDAT"​. Filtrul implementat absoarbe doar 20% din valoarea nouă la fiecare iterație (500ms), netezind curba de răspuns. Acest lucru atenuează șocul chimic ​și permite ​trecerea fluidă și secvențială prin toate stările de alarmă (Atenție -> Interzis ​-> Decedat), validând logic funcționalitatea completă a sistemului multimedia pentru demonstrația din laborator+  * **De ce:** Senzorul MQ-3 are o reacție termochimică violentă la contactul cu surse concentrate de vapori. Filtrul implementat absoarbe doar 20% din valoarea nouă la fiecare iterație (500ms), netezind curba de răspuns și permițând ​trecerea fluidă prin stările de alarmă (Atenție -> Interzis). 
-  * **Unde:** La începutul funcției ​''​procesare_date_senzor()''​, imediat după preluarea valorii brute de la hardware-ul ADC.+  ​ 
 +  * **Unde:** La fiecare bătaie a Timerului 1 în ''​loop()''​.
  
 ===== Stadiul actual al implementării și Testare Hardware ===== ===== Stadiul actual al implementării și Testare Hardware =====
  
 {{ :​pm:​prj2026:​vlad.radulescu2901:​poza_proiect_.jpeg?​300 |}} {{ :​pm:​prj2026:​vlad.radulescu2901:​poza_proiect_.jpeg?​300 |}}
- 
  
 {{ :​pm:​prj2026:​vlad.radulescu2901:​valori_shell.jpeg?​300 |}} {{ :​pm:​prj2026:​vlad.radulescu2901:​valori_shell.jpeg?​300 |}}
-În imaginile de mai sus este prezentat montajul fizic preliminar pe breadboard. Pentru a valida conexiunile și funcționalitatea,​ a fost realizat un test independent al senzorului de alcool MQ-3.  
  
-Prin intermediul unei interfețe shell de test, comanda ''​analogread A1'' ​demonstrează capacitatea microcontrolerului de a prelua date analogice corecte de la senzor. Acest lucru validează atât alimentarea senzorului ​(parcurgerea cu succes a fazei de încălzire), cât și integritatea magistralei ADC interne a microcontrolerului.+Sistemul SafeDrive este complet funcțional. Montajul final integrează stabil modulele pe breadboard, iar schema electrică este proiectată și validată. Testele efectuate demonstrează capacitatea sistemului de a prelua date analogice corecte de la senzor și de a reacționa în timp real la pragurile de alcool setate. 
 + 
 +Prin intermediul unei interfețe shell de test, comanda ''​analogread A1''​ validează atât alimentarea senzorului ​MQ-3, cât și integritatea magistralei ADC interne a microcontrolerului.
  
 ===== Motivarea alegerii bibliotecilor ===== ===== Motivarea alegerii bibliotecilor =====
  
-Pentru a menține codul curat și a abstractiza protocoalele de comunicație complexe, au fost utilizate ​următoarele ​biblioteci ​externe+Pentru a menține codul modular ​și eficient, au fost utilizate ​atât biblioteci ​native AVR, cât și implementări software custom: 
-  * ''<​Wire.h>''​ și ''<​LiquidCrystal_I2C.h>'': ​Necesare ​pentru ​comunicarea cu display-ul LCD 1602 prin protocolul I2C. Această abordare reduce drastic numărul de pini utilizați de la 6 la doar 2 (SDA și SCL)+ 
-  * ''<​SoftwareSerial.h>'':​ Utilizată ​pentru a emula o interfață UART hardware ​pe pinii D10 (RX) și D11 (TX)Astfel, magistrala Serială hardware nativă (pinii D0/D1) a mas complet liberă ​pentru ​diagnoză, calibrare ​și debugging via PC+  * ''<​avr/io.h>''​ și ''<​avr/​interrupt.h>'': ​Biblioteci native AVR utilizate ​pentru ​manipularea directă a registrelor ​și gestionarea întreruperilor hardware. 
-  * ''<​DFRobotDFPlayerMini.h>'': ​Abstractizează trimiterea pachetelor de date hexazecimale specifice protocolului modulului MP3permițând redarea melodiilor și controlul volumului prin funcții simple (ex. ''​playerAudio.play(1)''​)+  ​ 
-  * ''<​avr/​io.h>''​ și ''<​avr/​interrupt.h>'': ​Biblioteci native AVR folosite ​pentru ​manipularea directă a regiștrilor ​și gestionarea vectorilor de întrerupere,​ esențiale pentru conceptele de laborator integrate.+  * ''<​util/delay.h>'':​ Utilizată ​exclusiv în secvențele critice de inițializare ​hardware ​unde sunt necesare întârzieri precise. 
 +   
 +  * **Driver I2C Custom:** Comunicarea cu LCD-ul prin PCF8574 este realizată fără biblioteca ''​Wire.h'',​ folosind control direct asupra perifericului TWI pentru ​performanță și înțelegere low-level completă. 
 +  ​ 
 +  * ''<​SoftwareSerial.h>'': ​Folosită pentru emularea unei interfețe UART dedicate DFPlayer Minipăstrând UART-ul hardware liber pentru debugging. 
 +  ​ 
 +  * ''<​DFRobotDFPlayerMini.h>'': ​Simplifică trimiterea comenzilor seriale către DFPlayer ​pentru ​controlul redării audio și al volumului.
  
 ===== Elementul de noutate al proiectului ===== ===== Elementul de noutate al proiectului =====
  
-Elementul de noutate constă în integrarea unui sistem de alertă multi-senzorial, ​treptat ​și imersivadaptat nivelului ​de pericol. Spre deosebire de etilotestele ​clasice ​comerciale ​cu un singur prag (Admis/​Respins), SafeDrive ​scalează nivelul de avertizarede la mesaje text și culori specifice pe LCD/​LED-uri,​ la redarea de instrucțiuni vocale sau audio dedicate fiecărui stadiu. Punctul culminant al sistemului este "​Alarma EKG", o alertă acustică continuă generată din buzzer ​pentru a semnaliza nivelurile letale de alcool. Această precizie vizuală și sonoră este susținută matematic de un filtru digital software de tip Low-Passaplicat în timp real pe semnalele analogice pentru a oferi fluiditate stărilor.+Elementul de noutate constă în integrarea unui sistem de alertă multi-senzorial, ​adaptiv ​și complet asincroncapabil să combine feedback-ul vizual, auditiv și vocal într-o singură arhitectură embedded ​de dimensiuni reduse. 
 + 
 +Spre deosebire de etilotestele comerciale ​clasice bazate exclusiv pe praguri fixe, SafeDrive ​implementează: 
 +  * filtrare digitală software în timp real; 
 +  * analiză Peak-Hold pe fereastră temporală
 +  * feedback vocal prin DFPlayer; 
 +  * semnalizare EKG prin buzzer ​asincron; 
 +  * arhitectură complet event-driven bazată pe întreruperi ​și FSM. 
 + 
 +Aceste funcționalități permit o experiență mult mai realistă și robustă, apropiată de sistemele embedded automotive moderne.
  
 ===== Justificarea utilizării funcționalităților din laborator ===== ===== Justificarea utilizării funcționalităților din laborator =====
  
-Proiectul integrează masiv elemente de low-level studiate la laborator ​pentru a garanta performanța pe un microcontroler cu resurse limitate+Proiectul integrează masiv conceptele ​low-level studiate la laborator: 
-  * **Laboratorul I/O (Operații pe biți):​** ​În locul funcțiilor standard Arduino (precum ''​digitalWrite''​),​ au fost manipulați direct ​regiștrii de direcție ​''​DDRx''​ și de date ''​PORTx'' ​prin bitmasking ​(ex: ''​PORTD |= (1 << PD2)''​) pentru controlul instantaneu al LED-urilor și buzzer-ului+ 
-  * **Laboratorul ADC (Convertor Analog-Digital):** Funcția blocantă ''​analogRead()''​ a fost eliminată. Conversia datelor de la senzorul ​MQ-3 se realizează prin setarea manuală a regiștrilor ​''​ADMUX''​ și ''​ADCSRA'', ​configurând la nivel hardware tensiunea de referință și prescaler-ul optim de 128+  * **Laboratorul I/O (Operații pe biți):​** ​LED-urile șbuzzer-ul sunt controlate prin manipularea ​directă a registrelor ​''​DDRx''​ și ''​PORTx'' ​folosind ​bitmasking. 
-  * **Laboratorul Timere și Întreruperi:​** Pentru a evita blocarea microcontrolerului cu pauze tip ''​delay()'',​ a fost configurat ​**Timer-ul 1** (timer pe 16 biți) ​în modul **CTC (Clear Timer on Compare Match)**. Acesta generează o întrerupere hardware (ISR) recurentă, setată cu precizie matematică la fiecare 500ms.+  ​ 
 +  * **Laboratorul ADC:​** ​Conversia analog-digitală pentru ​MQ-3 este configurată manual ​prin registrele ​''​ADMUX''​ și ''​ADCSRA'', ​eliminând funcția ''​analogRead()''​. 
 +  ​ 
 +  * **Laboratorul Timere și Întreruperi:​** Timer-ul 1 este configurat ​în modul CTC pentru generarea unei baze de timp precise și complet non-blocante. 
 +   
 +  ​* **Laboratorul UART:** Comunicarea serială cu DFPlayer Mini utilizează UART software pentru transmisia comenzilor audio. 
 +   
 +  * **Laboratorul I2C/TWI:** Comunicarea ​cu LCD-ul prin expandorul PCF8574 este realizată prin control direct al magistralei TWI hardware.
  
 ===== Explicarea scheletului proiectului și Validarea ===== ===== Explicarea scheletului proiectului și Validarea =====
  
 **Arhitectura interacțiunii:​** **Arhitectura interacțiunii:​**
-Scheletul se bazează pe o execuție fluidă, bazată pe evenimente (event-driven). În funcția ''​setup()'',​ pe lângă inițializarea pinilor și a modulelor I2C/UART, se pornește Timer-ul 1. Bucla principală ''​loop()''​ rămâne complet inactivă până când Timer-ul declanșează o întrerupere (la 500ms) și ridică un flag software (''​flag_actualizare''​). ​ 
-În acel moment, este apelată funcția de procesare: ​ 
-  - Convertorul ADC preia valoarea brută a senzorului de pe placa de dezvoltare. 
-  - Filtrul matematic netezește valoarea pentru a elimina fluctuațiile chimice și o convertește în concentrație BAC (%). 
-  - Mașina de stări compară BAC-ul cu cele 4 limite prestabilite. 
-  - Dacă se detectează o tranziție către o stare nouă, ecranul LCD, setul de LED-uri RGB, buzzer-ul și player-ul MP3 sunt actualizate corespunzător. 
-La finalul rutinei, flag-ul este resetat, iar procesorul este eliberat pentru alte sarcini până la următoarea întrerupere. 
  
 +Scheletul aplicației este complet event-driven. În funcția ''​setup()''​ sunt inițializate perifericele hardware, magistralele de comunicație și Timer-ul 1.
 +
 +Funcția principală ''​loop()''​ rămâne permanent non-blocantă și execută doar sarcini dependente de flag-uri software ridicate de ISR-uri.
 +
 +Fluxul de execuție:
 +  - Utilizatorul apasă butonul de contact.
 +  - ISR-ul asociat INT1 declanșează secvența de testare.
 +  - Timer-ul 1 generează tick-uri periodice la 500ms.
 +  - ADC-ul citește valoarea senzorului MQ-3.
 +  - Filtrul EMA netezește semnalul analogic.
 +  - Algoritmul Peak-Hold reține valoarea maximă pe durata ferestrei de 7 secunde.
 +  - FSM-ul decide starea sistemului.
 +  - LCD-ul, LED-urile, DFPlayer-ul și buzzer-ul sunt actualizate asincron.
 +
 +Această arhitectură permite funcționarea simultană a tuturor modulelor fără utilizarea funcțiilor blocante de tip ''​delay()''​.
  
 ===== Concluzii ===== ===== Concluzii =====
  
-<note tip> +Dezvoltarea proiectului SafeDrive a reprezentat ​provocare inginerească complexă, fiind o tranziție reușită de la utilizarea librăriilor generice la controlul hardware ​de nivel scăzut
-Aici va fi adăugată ​revizuire cuprinzătoare a proiectului,​ concentrându-se pe principalele provocări inginerești întâmpinate (cum ar fi gestionarea limitărilor stricte ​de SRAM la citirea cardului SD) și pe conceptele de arhitectură AVR de nivel scăzut ​stăpânite ​în timpul dezvoltării+ 
-</​note>​+Principala dificultate a fost gestionarea resurselor limitate de memorie și atenuarea zgomotului indus de comutația perifericelor în semnalul audio, problemă rezolvată prin optimizarea rutinei de redare și prin separarea logică a task-urilor asincrone. 
 + 
 +În final, proiectul a consolidat competențele de: 
 +  * programare AVR low-level;​ 
 +  * utilizare registre hardware; 
 +  * configurare Timere ​în mod CTC; 
 +  * dezvoltare FSM; 
 +  * programare interrupt-driven;​ 
 +  * filtrare digitală software; 
 +  * integrare multi-periferic într-un sistem embedded real-time
 + 
 +SafeDrive demonstrează succesul integrării unui sistem multi-senzorial robust, capabil să ia decizii critice în timp real fără a necesita un sistem de operare dedicat.
  
 ===== Download ===== ===== Download =====
  
-<note warning>​ +**Cod Sursă (GitHub):** [[https://​github.com/​DimiConstantin/​SafeDrive-System.git]]
-O arhivă (sau mai multe dacă este cazulcu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). +
-Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :​pm:​prj20??:​c?​ sau :​pm:​prj20??:​c?:​nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :​pm:​prj2009:​cc:​dumitru_alin. +
-</​note>​+
  
-**Cod Sursă (GitHub):** [[Introdu_linkul_tau_de_GitHub_aici|SafeDrive Public Repository]]+===== Videoclip Demo ===== 
 +https://​drive.google.com/​file/​d/​1NgjwWxK3g2bzu4fEecLFvrpopXJ86x9d/​view?​usp=drive_link
  
 ===== Jurnal ===== ===== Jurnal =====
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
 +  * **Săptămâna 1-2:** Documentare,​ configurare toolchain PlatformIO și testare hardware minimă (LED + Buton).
 +  ​
 +  * **Săptămâna 3-4:** Implementare driver I2C custom pentru LCD și integrare senzor MQ-3 (calibrare baseline).
 +  ​
 +  * **Săptămâna 5-6:** Dezvoltare mașină de stări (FSM) și implementare logică bazată pe Timer 1 (asincronism).
 +  ​
 +  * **Săptămâna 7-8:** Integrare module audio (DFPlayer + Amplificator) și debug pe partea de zgomot digital / ground loops.
 +  ​
 +  * **Săptămâna 9-10:** Finalizare schemă electrică EasyEDA, optimizare SRAM și redactare documentație finală.
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
-<​note>​ + 
-Listă ​cu documentedatasheet-uri,​ resurse Internet folosite, eventual grupate pe Resurse Software şResurse Hardware. +  * Microchip ATmega328P - Official 8-bit AVR Microcontroller Datasheet. 
-</​note>​+  * DFRobot DFPlayer Mini MP3 Module Application Manual & Specification. 
 +  * WaveShare PCF8574 I2C Expander Core Documentation. 
 +  * Datasheet LM386 Low Voltage Audio Power Amplifier. 
 +  * Note de curs și laborator - Proiectarea ​cu Microcontrolere (PM)Facultatea de Automatică șCalculatoare,​ UPB.
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
pm/prj2026/vlad.radulescu2901/dimitrie.constantin.1779650925.txt.gz · Last modified: 2026/05/24 22:28 by dimitrie.constantin
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