Î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.
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:
Schemă bloc:
Î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 |
Î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.
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:
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:
Î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.
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.
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):
i2c_init(), i2c_start(), i2c_write(), i2c_stop() manipulează direct hardware-ul intern pentru a stabili protocolul de comunicație la 100 kHz.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.setup_adc() și citire_senzor() configurează convertorul analog-digital și implementează o buclă de tip polling (ADSC) pentru obținerea datelor brute.setup_buzzer(), porneste_alarma(ton) și pachetul de profile Arcade abstractizează hardware-ul timerului pentru a genera frecvențe dinamice.Logica principală a programului funcționează ca o Mașină de Stări (Finite State Machine) adaptivă:
0.00mg/L (READY).valoare_maxima), implementând simultan un „tic-tac” sonor.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:
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.
Proiectul bifează și demonstrează înțelegerea următoarelor concepte din programa de laborator:
DDRB |= (1 « PB1)) pentru controlul hardware al buzzer-ului.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.WGM12) pentru generarea semnalului audio asincron. Ieșirea comută automat starea pinului OC1A (COM1A0), degrevând procesorul (Hardware PWM).TWSR, TWBR, TWCR). Confirmările (ACK) sunt monitorizate prin flag-ul TWINT.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.Î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:
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ă.
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.
Feedback Vizual (LCD 16×2 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.
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.
Un rezultat major al fazei finale l-a constituit trecerea de la stadiul de prototip de masă la un produs final portabil:
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.
Ce i-am mai putea adăuga pe viitor (Idei de dezvoltare): Dacă am vrea să îi facem un update (v2.0), aparatul ar putea fi îmbunătățit cu:
Pentru documentarea și realizarea acestui proiect, am consultat următoarele resurse tehnice și bibliografii:
Resurse utilizate pentru implementarea driverelor și înțelegerea arhitecturii microcontrolerului:
Documentația tehnică oficială a componentelor utilizate: