This is an old revision of the document!
Etilotest Inteligent
Introducere
Îndoiala din dimineața de după o petrecere sau o ieșire cu prietenii este o problemă cât se poate de comună. De multe ori te trezești, te simți apt să conduci, dar nu ai o certitudine clară că alcoolul a fost eliminat complet din organism. Să te bazezi pur și simplu pe intuiție sau pe „mă simt bine” este o decizie riscantă, care te poate costa permisul auto sau poate pune în pericol siguranța celor din jur. Plecând de la această nevoie practică – înlocuirea presupunerilor cu date concrete – am decis să construiesc un dispozitiv de verificare accesibil și rapid.
Proiectul meu este un Etilotest Inteligent, sistem capabil să măsoare concentrația vaporilor de alcool din aerul expirat și să ofere un feedback imediat și fără echivoc, atât vizual, cât și sonor.
Ce face: Sistemul citește datele analogice de la un senzor de gaze/alcool, le procesează și afișează concentrația în timp real pe un ecran LCD. În funcție de valoarea citită, un buzzer pasiv emite semnale sonore de avertizare (un sunet de intensitate redusă pentru starea de pregătire/standby și o alarmă puternică, cu frecvență ridicată, în cazul depășirii pragului de siguranță).
Scopul lui: Scopul principal este implementarea practică a interfețelor de bază ale unui microcontroler (ADC, I2C, Timere/PWM) într-un sistem util, de tip embedded, care interacționează direct cu mediul înconjurător.
Ideea de pornire: Ideea a pornit de la necesitatea de a construi un proiect “echilibrat”, care să îmbine perfect achiziția de date analogice din lumea reală cu generarea de feedback digital (text și sunet controlat).
Utilitate: Proiectul este util atât din punct de vedere educațional (pentru aprofundarea noțiunilor de PM), cât și practic, ilustrând modul de funcționare a unui dispozitiv de siguranță rutieră și personală.
Descriere generală
Arhitectura proiectului este structurată în jurul microcontrolerului ATmega328P, care acționează ca unitate centrală de procesare. Sistemul este împărțit în trei module principale care interacționează constant:
Modulul de Achiziție (Intrare): Reprezentat de senzorul MQ-3. Acesta funcționează ca un divizor de tensiune variabil. Pe măsură ce concentrația de alcool din aer crește, rezistența senzorului scade, trimițând o tensiune variabilă către microcontroler. ATmega328P preia acest semnal folosind convertorul analog-digital (ADC).
Modulul de Procesare (Unitatea Centrală): Microcontrolerul preia valoarea numerică obținută de la ADC și o compară cu un prag de siguranță predefinit în cod (firmware). În funcție de rezultatul comparației, dictează comportamentul modulelor de ieșire.
Modulele de Ieșire (Feedback):
Feedback Vizual: Microcontrolerul împachetează datele și le trimite prin magistrala I2C către modulul adaptor de pe spatele ecranului LCD 1602, afișând starea sistemului (ex: “Pregatire…”, “Testare…”, “Alarma!”).
Feedback Sonor: Folosind Timerele și modul PWM, microcontrolerul generează un semnal oscilant către buzzer-ul pasiv. Modificând factorul de umplere (duty cycle) și frecvența, sistemul alternează între un sunet discret de notificare și o sirenă de alarmă stridentă.
Schemă bloc:
Hardware Design
În această etapă, lista de componente hardware necesare pentru realizarea proiectului este următoarea:
| Nr. Crt. | Componentă | Cantitate | Rol în proiect | Modul / Interfață folosită |
| 1. | Placă de dezvoltare cu ATmega328P (tip Arduino UNO) | 1 buc. | Unitatea centrală de procesare a datelor. | Toate |
| 2. | Modul Senzor de gaz/alcool MQ-3 | 1 buc. | Detectarea vaporilor de alcool din respirație. | Analog-to-Digital Converter (ADC) |
| 3. | Display LCD 1602 cu modul I2C | 1 buc. | Afișarea stării și a rezultatului testului. | Comunicație I2C (SDA, SCL) |
| 4. | Modul Buzzer Pasiv KY-006 | 1 buc. | Emiterea semnalelor sonore (volum și ton variabile). | Timere / Pulse Width Modulation (PWM) |
| 5. | Breadboard 400 puncte | 1 buc. | Crearea conexiunilor și distribuirea alimentării. | N/A |
| 6. | Set fire Dupont Tată-Tată (20cm) | 1 set | Conexiuni pe breadboard. | N/A |
| 7. | Set fire Dupont Tată-Mamă (20cm) | 1 set | Conectarea modulelor externe (Senzor, LCD) la placă. | N/A |
Stadiul actual al implementării hardware
În stadiul curent, arhitectura hardware a proiectului este complet finalizată și asamblată pe breadboard. Toate modulele periferice (senzorul de gaz, ecranul LCD și buzzer-ul) au fost interfațate fizic cu microcontrolerul ATmega328P și sunt alimentate corespunzător. Conexiunile au fost realizate și testate individual pentru a asigura integritatea și stabilitatea semnalelor electrice.
Componentele folosite și rolul
Placă de dezvoltare cu ATmega328P: Reprezintă unitatea centrală de procesare (creierul proiectului). Rolul ei este să citească tensiunea analogică de la senzor, să o convertească digital, să o compare cu un prag prestabilit și să comande perifericele de output (display-ul și buzzer-ul).
Modul Senzor de gaz MQ-3: Este componenta de input primar. Rolul său este să detecteze vaporii de alcool din aer (respirație) și să ofere o tensiune proporțională cu concentrația acestora.
Display LCD 1602 (cu modul I2C): Este interfața vizuală (Human-Machine Interface). Afișează stadiul curent al dispozitivului și valoarea numerică brută citită de pe senzor.
Modul Buzzer Pasiv (KY-006): Oferă feedback acustic. Va genera tonuri de avertizare și alarme complexe prin intermediul semnalelor pulsatorii atunci când este detectată o concentrație de alcool peste limita admisă.
Descrierea pinilor folosiți
Alegerea pinilor nu a fost aleatoare, ci s-a bazat strict pe arhitectura internă a microcontrolerului ATmega328P, folosind perifericele hardware dedicate pentru a eficientiza codul:
Pinul PC0 (conectat la ieșirea Analog A0 a senzorului MQ-3): Corespunde canalului ADC0 (Analog-to-Digital Converter). Deoarece senzorul oferă o tensiune continuă variabilă (între 0V și 5V) în funcție de nivelul de alcool, era necesar un pin capabil să convertească această tensiune într-o valoare digitală pe 10 biți (0-1023), citind regiștrii interne (ADMUX și ADCSRA).
Pinul PB1 (conectat la pinul de Semnal al Buzzer-ului pasiv): Corespunde fizic ieșirii OC1A (Timer/Counter1 Output Compare Match A). Acest pin este utilizat pentru a genera frecvențe audio exacte folosind Timer-ul 1 hardware în modul CTC (Clear Timer on Compare Match). Astfel, generarea sunetului se face pur la nivel hardware, fără a bloca procesorul.
Pinii PC4 și PC5 (conectați la SDA, respectiv SCL de pe modulul I2C al LCD-ului): În arhitectura ATmega328P, PC4 și PC5 sunt pinii hardware dedicați pentru perifericul TWI (Two-Wire Interface / I2C). PC4 acționează ca linia de date (SDA - Serial Data), iar PC5 ca linia de ceas (SCL - Serial Clock), permițând comunicarea rapidă cu ecranul.
Schema electrică și explicații
Schema de mai sus a fost realizată pentru a evidenția conexiunile logice, de semnal și de alimentare dintre microcontrolerul ATmega328P și modulele periferice.
Logica de alimentare:
Alimentarea întregului circuit se realizează prin intermediul portului USB al plăcii de dezvoltare (5V). Bara de plus (roșie) și minus (albastră) de pe breadboard distribuie curentul (VCC la 5V și GND la masă) către toate perifericele, asigurând un nivel de tensiune stabil pentru logica TTL.
Conexiunile de semnal:
Senzor MQ-3: VCC la 5V, GND la masă, iar ieșirea analogică (A0) este conectată la pinul PC0.
Display LCD I2C: VCC la 5V, GND la masă, pinul SDA conectat la pinul PC4, iar pinul SCL la pinul PC5.
Buzzer KY-006: Pinul de masă (-) conectat la GND, iar pinul de Semnal (S) la pinul PB1 (echivalent cu pinul digital 9 pe placa din schemă).
Vedere de ansamblu a hardware-ului
În imaginea de mai sus se observă setup-ul fizic complet, asamblat pe breadboard. Toate cele trei periferice (Senzor MQ-3, LCD, Buzzer) sunt conectate la pinii corespunzători ai plăcii de dezvoltare.
Software Design
Mediu de dezvoltare
Proiectul a fost dezvoltat în mediul Visual Studio Code (VS Code) utilizând extensia PlatformIO și toolchain-ul AVR-GCC. Arhitectura software este de tip „bare-metal” — nu au fost utilizate biblioteci third-party (precum framework-ul Arduino sau librării pre-scrise pentru I2C/LCD din exterior). Tot codul a fost implementat de la zero, interacționând direct cu regiștrii hardware ai microcontrolerului ATmega328P. Această abordare a fost aleasă deliberat pentru a garanta controlul absolut asupra timing-ului, pentru a optimiza consumul de memorie și pentru a demonstra înțelegerea profundă a arhitecturii microprocesorului.
Deoarece proiectul nu folosește librării externe, au fost incluse exclusiv bibliotecile standard din suita AVR Libc:
<avr/io.h> — definește adresele regiștrilor hardware ai microcontrolerului ATmega328P (ex: TWCR, ADCSRA, TCCR1A, PORTB). Este vitală pentru toate funcțiile de configurare și control.
<util/delay.h> — oferă funcțiile _delay_ms() și _delay_us() pentru crearea pauzelor precise necesare în algoritmul de inițializare al ecranului LCD și în temporizarea interfeței (numărătoarea inversă, generarea notelor muzicale).
<stdio.h> — utilizată strict pentru funcția sprintf(), necesară pentru formatarea dinamică a textului și a valorilor numerice (ex: combinarea părții întregi cu partea zecimală) înainte de a fi trimise către ecranul LCD.
Structura proiectului și Modularizarea
Deși întregul cod rezidă în fișierul main.c pentru o compilare monolitică eficientă, el este structurat logic în module independente, cu funcții dedicate (etapa 3):
Driverul TWI (I2C): Funcțiile i2c_init(), i2c_start(), i2c_write(), i2c_stop() manipulează direct hardware-ul intern pentru a stabili protocolul de comunicație la 100 kHz.
Driverul LCD (PCF8574): Funcțiile lcd_send_nibble(), lcd_send_byte(), lcd_init() abstractizează comunicația pe 4 biți și controlează pinii de Enable/RS prin expandorul de porturi I2C.
Driverul ADC (Senzor MQ-3): Funcțiile setup_adc() și citire_senzor() configurează convertorul analog-digital și implementează o buclă de tip polling (ADSC) pentru obținerea datelor brute.
Driverul Audio (Timer 1): Funcțiile setup_buzzer(), porneste_alarma(ton) și pachetul de profile Arcade abstractizează hardware-ul timerului pentru a genera frecvențe dinamice.
Algoritmi, Structuri de Date și Mașina de Stări
Logica principală a programului funcționează ca o Mașină de Stări (Finite State Machine) adaptivă:
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 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 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.
Justificarea funcționalităților din laborator
Proiectul bifează și demonstrează înțelegerea următoarelor concepte din programa de laborator:
GPIO: Configurarea direcției pinilor de I/O la nivel de bit (ex: DDRB |= (1 « PB1)) pentru controlul hardware al buzzer-ului.
Convertorul Analog-Digital (ADC): Configurarea registrului ADMUX folosind AVCC ca referință (REFS0) și setarea prescaler-ului la 128 prin ADCSRA pentru a citi variațiile fine de tensiune analogică generate de senzorul de gaz pe pinul PC0.
Timere Hardware: Folosirea Timer-ului 1 (pe 16 biți) în modul CTC (Clear Timer on Compare Match, WGM12) pentru generarea semnalului audio asincron. Ieșirea comută automat starea pinului OC1A (COM1A0), degrevând procesorul (Hardware PWM).
Comunicații Seriale (I2C/TWI): Implementarea comunicației sincrone cu ecranul LCD prin manipularea manuală a registrilor TWI (TWSR, TWBR, TWCR). Confirmările (ACK) sunt monitorizate prin flag-ul TWINT.
Optimizări și Elementul de Noutate
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.
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.
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.
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
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Concluzii
Download
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ă

.
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.
Jurnal
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
Bibliografie/Resurse
Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.
Export to PDF