This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:antonio_mihai.sirbu [2026/05/24 13:49] antonio_mihai.sirbu [Software Design] |
pm:prj2026:atoader:antonio_mihai.sirbu [2026/05/24 15:27] (current) antonio_mihai.sirbu |
||
|---|---|---|---|
| Line 94: | Line 94: | ||
| * **Starea 1 (Standby):** Senzorul este citit o dată la 100ms. Ecranul afișează ''0.00mg/L (READY)''. | * **Starea 1 (Standby):** Senzorul este citit o dată la 100ms. Ecranul afișează ''0.00mg/L (READY)''. | ||
| * **Starea 2 (Eșantionare):** Când ADC-ul detectează un prag de peste 120, se declanșează o numărătoare inversă de 3 secunde. În acest timp, microcontrolerul citește senzorul la frecvență ridicată (10Hz) și reține doar valoarea maximă de vârf (''valoare_maxima''), implementând simultan un „tic-tac” sonor. | * **Starea 2 (Eșantionare):** Când ADC-ul detectează un prag de peste 120, se declanșează o numărătoare inversă de 3 secunde. În acest timp, microcontrolerul citește senzorul la frecvență ridicată (10Hz) și reține doar valoarea maximă de vârf (''valoare_maxima''), implementând simultan un „tic-tac” sonor. | ||
| - | * **Starea 3 (Verdict):** Valoarea maximă este mapată matematic în format standard ''mg/L''. Pe baza a 3 praguri predefinite, sistemul afișează un mesaj text clar și apelează o funcție audio specifică stării (sobru, amețit sau ebrietate avansată). | + | * **Starea 3 (Verdict):** Valoarea maximă este procesată matematic. Pe baza a 3 praguri predefinite, sistemul afișează un mesaj text clar și apelează o funcție audio specifică stării (sobru, amețit sau ebrietate avansată). |
| * **Starea 4 (Auto-Curățare):** Sistemul așteaptă până când nivelul senzorului scade în mod natural sub pragul de histerezis, protejând dispozitivul de re-declanșări false datorate vaporilor reziduali. | * **Starea 4 (Auto-Curățare):** Sistemul așteaptă până când nivelul senzorului scade în mod natural sub pragul de histerezis, protejând dispozitivul de re-declanșări false datorate vaporilor reziduali. | ||
| + | |||
| + | ==== Conversia Semnalului: ADC în mg/L ==== | ||
| + | Senzorul MQ-3 furnizează o tensiune analogică, măsurată de convertorul ADC pe 10 biți într-o valoare brută cuprinsă între 0 și 1023. Pentru a oferi utilizatorului o valoare standardizată (mg/L în aerul expirat), a fost implementat un algoritm de **mapare liniară (interpolare)**. Deși variația rezistenței interne a senzorului este teoretic logaritmică, calibrarea empirică a demonstrat că o scalare liniară este ideală pentru precizia vizată de acest proiect. | ||
| + | Valorile de referință stabilite la calibrare sunt: | ||
| + | * **Aer curat (Repaus):** Tensiunea de bază fluctuantă este ignorată. O valoare ADC de 115 reprezintă punctul de referință (0.00 mg/L). | ||
| + | * **Prag de saturație:** O valoare ADC de 350 a fost echivalată cu 0.85 mg/L. | ||
| + | Formula de calcul implementată în cod este: | ||
| + | Concentratie = ((ADC_citit - 115) * 0.85) / (350 - 115) | ||
| + | Orice citire ADC sub valoarea de 115 este considerată zgomot de fond și este forțată hardware la 0.00 mg/L, asigurând stabilitatea afișajului. | ||
| ==== Justificarea funcționalităților din laborator ==== | ==== Justificarea funcționalităților din laborator ==== | ||
| Line 107: | Line 116: | ||
| * **Spectacol Audio Dinamic (Arcade Style):** Spre deosebire de o alarmă binară, generarea sunetului exploatează Timerul 1 pentru a crea profile audio complexe, ascendente sau descendente, care simulează efecte de tip „Level Up” sau „Sirenă”. | * **Spectacol Audio Dinamic (Arcade Style):** Spre deosebire de o alarmă binară, generarea sunetului exploatează Timerul 1 pentru a crea profile audio complexe, ascendente sau descendente, care simulează efecte de tip „Level Up” sau „Sirenă”. | ||
| * **Histerezis Software:** Pentru a elimina bug-urile mecanice și electrice de tip „bouncing”, a fost implementată o bandă de histerezis de 20 de unități între pragul de start al testului și pragul de revenire în repaus. | * **Histerezis Software:** Pentru a elimina bug-urile mecanice și electrice de tip „bouncing”, a fost implementată o bandă de histerezis de 20 de unități între pragul de start al testului și pragul de revenire în repaus. | ||
| - | * **Optimizarea Memoriei pentru Float:** Funcția ''sprintf'' de pe AVR nu suportă formatarea numerelor cu virgulă mobilă din fabrică. Pentru a ocoli această limitare, logica matematică sparge valoarea de concentrație în două numere întregi distincte (partea întreagă și primele două zecimale), simulând o afișare de tip ''float'' eficientă computațional. | + | * **Optimizarea Memoriei pentru Float:** Funcția ''sprintf'' de pe AVR nu suportă formatarea numerelor cu virgulă mobilă din fabrică. Pentru a ocoli această limitare, logica matematică sparge valoarea de concentrație calculată în două numere întregi distincte (partea întreagă și primele două zecimale), simulând o afișare de tip ''float'' eficientă computațional. |
| ==== Validare ==== | ==== Validare ==== | ||
| * **Hardware:** S-a validat detecția corectă a adresei I2C (0x27) a modulului PCF8574. Tensiunea senzorului MQ-3 a fost măsurată fizic, confirmând comportamentul rezistenței de pre-încălzire. | * **Hardware:** S-a validat detecția corectă a adresei I2C (0x27) a modulului PCF8574. Tensiunea senzorului MQ-3 a fost măsurată fizic, confirmând comportamentul rezistenței de pre-încălzire. | ||
| * **Software:** Sistemul a fost calibrat empiric folosind surse externe cu concentrații diferite de alcool. Funcția de histerezis a fost testată și s-a dovedit stabilă, eliminând buclele infinite, iar feedback-ul audio rulează fluid, fără a bloca rutina de afișare pe LCD. | * **Software:** Sistemul a fost calibrat empiric folosind surse externe cu concentrații diferite de alcool. Funcția de histerezis a fost testată și s-a dovedit stabilă, eliminând buclele infinite, iar feedback-ul audio rulează fluid, fără a bloca rutina de afișare pe LCD. | ||
| - | ===== Rezultate Obţinute ===== | + | ===== Rezultate Obținute ===== |
| - | <note tip> | + | În urma implementării, asamblării și testării etilotestului digital, s-au obținut următoarele rezultate ce confirmă atingerea obiectivelor propuse și stabilitatea sistemului: |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | * **1. Achiziția și Procesarea Datelor (Senzorul MQ-3)** |
| + | Sistemul a demonstrat o citire stabilă a valorilor analogice provenite de la senzorul de gaz. Prin algoritmul de mapare liniară și filtrarea software a zgomotului de fond (ignorarea valorilor brute sub pragul de 115), aparatul convertește precis tensiunea în concentrație de alcool (mg/L), oferind valoarea 0.00 pentru o persoană perfect sobră. | ||
| + | |||
| + | * **2. Stabilitate Algoritmică (Histerezis și Auto-Curățare)** | ||
| + | A fost eliminat cu succes efectul de "bouncing" (re-declanșare falsă accidentală) prin implementarea unei benzi de histerezis. Dispozitivul intră automat într-o stare de ventilație (curățare senzor) și rămâne blocat acolo până când vaporii de alcool coboară sub pragul de siguranță, garantând corectitudinea testelor consecutive. | ||
| + | |||
| + | * **3. Feedback Multi-Senzorial Adaptiv** | ||
| + | **Feedback Vizual (LCD 16x2 I2C):** Interfața ghidează utilizatorul prin toate stările aparatului (Încălzire, Standby, Suflare, Curățare) și afișează instantaneu valoarea de vârf alături de un mesaj text corespunzător nivelului detectat (ex: "Drum bun!", "Nu urca la volan", "Esti praf!"). | ||
| + | **Feedback Acustic (Buzzer PWM):** Folosind Timer-ul 1 hardware, s-au generat profiluri audio dinamice, non-liniare (stil Arcade). Aparatul oferă un feedback imediat și intuitiv: un tril vesel pentru sobrietate, o sirenă descendentă (Wah-Wah) pentru starea de ebrietate ușoară și o alarmă foarte rapidă și agresivă pentru depășirea limitei legale. | ||
| + | |||
| + | * **4. Optimizarea Resurselor (Firmware)** | ||
| + | Codul sursă a fost scris „bare-metal”, manipulând direct regiștrii pentru protocolul I2C, ADC și Timer. S-a evitat complet utilizarea numerelor cu virgulă mobilă (float) în funcțiile de afișare, obținând un firmware extrem de rapid și stabil, care utilizează la maximum resursele limitate de memorie ale microcontrolerului ATmega328P. | ||
| + | |||
| + | * **5. Asamblare Hardware și Design Industrial** | ||
| + | Un rezultat major al fazei finale l-a constituit trecerea de la stadiul de prototip de masă la un produs final portabil: | ||
| + | * **Eliminarea Breadboard-ului:** Toate conexiunile au fost cositorite direct, creând un "wire harness" (mănunchi de cabluri) robust. Această decizie a redus la zero riscul firelor deconectate accidental și a îmbunătățit considerabil stabilitatea electrică a pinilor de alimentare (VCC și GND). | ||
| + | * **Carcasă Printată 3D:** Întregul sistem hardware a fost integrat într-o carcasă personalizată, printată 3D. Aceasta protejează placa Xplained Mini, oferă un decupaj perfect fixat pentru ecranul LCD și expune doar sita senzorului MQ-3, conferind proiectului un aspect ergonomic și 100% funcțional ca produs finit. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | ===== Download ===== | + | Proiectul „Etilotest Digital” a ieșit fix mi-am și funcționează fără probleme. Am reușit să realizez de la zero un aparat care citește corect vaporii de alcool, face calculele matematice în spate și îți oferă imediat un verdict pe ecran, acompaniat de un set de sunete sunete ca avertisment. |
| + | |||
| + | Partea cea mai utilă a fost decizia de a scrie codul „bare-metal”.Am aplicat exact ce am învățat la laboratoare: am configurat pinii manual, am implementat protocolul I2C pas cu pas pentru LCD, am setat Convertorul Analog-Digital (ADC) pentru senzorul MQ-3 și am folosit Timer-ul 1 hardware ca să generăm acele profiluri audio dinamice pe buzzer. | ||
| + | |||
| + | In implementare am avut si bug-uri. De exemplu, la un moment dat senzorul o lua razna și declanșa testul de mai multe ori la rând din cauza valorilor reziduale. Aici am văzut în practică de ce e esențială partea de software pentru a corecta hardware-ul — am rezolvat problema implementând o bandă de histerezis, ceea ce a stabilizat complet aparatul. | ||
| + | |||
| + | Pasul final a fost renunțarea la breadboard. Cositorirea firelor și integrarea întregului montaj într-o carcasă printată 3D au transformat proiectrul facandu-l mai estetic. | ||
| - | <note warning> | + | **Ce i-am mai putea adăuga pe viitor (Idei de dezvoltare):** |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | Dacă am vrea să îi facem un update (v2.0), aparatul ar putea fi îmbunătățit cu: |
| + | * **O baterie internă:** Să adăugăm un acumulator Li-Po de 3.7V și un modul de încărcare TP4056 ca să nu mai depindem deloc de cablul conectat la laptop. | ||
| + | * **Voce reală:** Să schimbăm buzzer-ul cu un modul MP3 (gen DFPlayer Mini) care să redea mesaje vocale amuzante sau avertizări înregistrate pe un card MicroSD. | ||
| + | * **Istoric măsurători:** Să ne folosim de memoria EEPROM a plăcii pentru a salva ultimele rezultate, ca să le poți vedea mai târziu dintr-un meniu pe ecran. | ||
| - | 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> | ||
| - | ===== Jurnal ===== | + | ===== Link-uri și Resurse ===== |
| - | <note tip> | + | Pentru documentarea și realizarea acestui proiect, am consultat următoarele resurse tehnice și bibliografii: |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | + | ==== Cod ==== |
| + | * **Repository GitHub:** [[https://github.com/Antonio012004/etilotest_inteligent|Etilotest Inteligent - Cod Sursă]] | ||
| - | <note> | + | ==== Laboratoare PM ==== |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | Resurse utilizate pentru implementarea driverelor și înțelegerea arhitecturii microcontrolerului: |
| - | </note> | + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024|Lab 3 - Timere Hardware]] |
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024|Lab 4 - Convertorul Analog-Digital (ADC)]] | ||
| + | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024|Lab 6 - Comunicații Seriale (I2C/TWI)]] | ||
| + | ==== Datasheet-uri Componente ==== | ||
| + | Documentația tehnică oficială a componentelor utilizate: | ||
| + | * **Microcontroler:** [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] | ||
| + | * **Senzor de Gaz:** [[https://cdn.sparkfun.com/assets/6/a/1/7/b/MQ-3.pdf|MQ-3 Gas Sensor Datasheet]] | ||
| + | * **Afișaj LCD:** [[https://www.handsontec.com/dataspecs/module/I2C_1602_LCD.pdf|I2C 1602 LCD Module Datasheet]] | ||
| + | * **Buzzer:** [[https://www.handsontec.com/dataspecs/module/passive%20buzzer.pdf|Passive Buzzer Datasheet]] | ||
| <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> | ||