Proiectul constă în realizarea unui Etilotest Digital inteligent, capabil să măsoare concentrația de alcool din aerul expirat și să transmită automat aceste date către o platformă Cloud pentru monitorizare.
| Modul Hardware | Descriere Tehnică | Interacțiune / Protocol |
|---|---|---|
| Arduino UNO R3 (ATmega328p + ATmega16u2) | Unitatea centrală de procesare. Gestionează logica locală și calculele. | Master-ul sistemului; coordonează toate perifericele și trimite date către gateway. |
| Senzor MQ-3 | Senzor chimic pentru detectarea vaporilor de etanol (alcool). | Analog (ADC): Trimite semnal variabil (0-5V) către pinul A0 al ATmega328P. |
| RPi Pico 2WH | Gateway Wi-Fi bazat pe arhitectură ARM. | UART: Primește date seriale de la ATmega și le transmite în Cloud prin Wi-Fi. |
| LCD 1602 | Ecran pentru afișarea în timp real a rezultatelor. | I2C: Primește comenzi de afișare pe 2 fire (SDA/SCL) de la ATmega328P. |
| Buzzer Pasiv | Componentă pentru avertizare sonoră. | PWM: Generare tonuri de frecvențe diferite în funcție de concentrație (Pin D9). |
| Componentă | Pin Componentă | Destinație (Placă/Pin) | Detalii |
|---|---|---|---|
| Senzor MQ-3 | VCC | Arduino 5V | Necesită preîncălzire pentru precizie |
| GND | Arduino GND | ||
| AO | Arduino A0 | Citire concentrație alcool | |
| LCD I2C | VCC | Arduino 5V | |
| GND | Arduino GND | ||
| SDA | Arduino A4 | Conexiune Date I2C | |
| SCL | Arduino A5 | Conexiune Ceas I2C | |
| Buzzer Pasiv | VCC | Arduino 5V | |
| GND | Arduino GND | ||
| S | Arduino D9 | Generare alerte sonore | |
| LED Debug | Anod (A) | Arduino D13 | Serie cu rezistență 220Ω |
| Catod (C) | Arduino GND | ||
| Pico 2WH | VSYS | Arduino 5V | Intrare alimentare stabilizată |
| GND | Arduino GND | Masa comună | |
| GP0 (TX) | Arduino D0 (RX) | Transmisie date către Arduino | |
| GP1 (RX) | Divizor Tensiune | Recepție date protejată (3.3V) | |
| Divizor Tensiune | In (R 1k) | Arduino D1 (TX) | Punct intrare semnal 5V |
| Out (1k/2.2k) | Pico GP1 (RX) | Punct ieșire semnal ~3.4V | |
| GND (R 2.2k) | Pico GND | Masă comună |
Pentru realizarea sistemului etilotest s-au utilizat trei medii de dezvoltare complementare:
Sistemul se bazează pe următoarele biblioteci software externe pentru asigurarea comunicării și abstractizarea hardware-ului:
| Librărie / Modul | Platformă | Rol în Proiect |
| Wire.h | Arduino | Permite comunicarea pe magistrala I2C (protocol nativ). |
| LiquidCrystal_I2C.h | Arduino | Gestionarea ecranului LCD 16×2 prin modulul adaptor I2C PCF8574. |
| network | Pico | Modul nativ MicroPython pentru controlul cipului Wi-Fi integrat pe Pico 2WH. |
| urequests | Pico | Versiunea optimizată de MicroPython a librăriei requests, folosită pentru trimiterea cererilor HTTP POST către server. |
| json | Pico / Flask | Serializarea datelor sub formă de pachete JSON transmise prin rețea. |
| flask | Server | Framework web lightweight în Python utilizat pentru ridicarea endpoint-ului HTTP și rutarea paginilor. |
La pornirea sistemului, senzorul MQ-3 necesită o fază de stabilizare. Algoritmul citește valoarea analogică de $20$ ori la un interval de $100\text{ ms}$ (timp total de $2\text{ secunde}$) și calculează o medie aritmetică stocată în variabila baseline. Acest „zero matematic” este scăzut din toate citirile ulterioare pentru a elimina variațiile de temperatură și zgomotul de fond din cameră.
Pentru a asigura o măsurătoare corectă, sistemul nu trimite prima valoare citită, ci așteaptă ca utilizatorul să termine de suflat. Algoritmul monitorizează în timp real valoarea BAC. Cât timp valoarea crește, ea este salvată în maxBAC. În momentul în care respirația se oprește, iar valoarea curentă scade cu un prag fixat de safety ($\Delta = 0.05\text{ g/L}$) sub maxBAC, algoritmul marchează starea peakReached = true și blochează valoarea maximă pentru procesare.
Pe server, datele transmise sunt salvate într-un fișier persistent (istoric.txt) sub formă de linii CSV (Timestamp, Valoare). La fiecare accesare a paginii ghindea.pythoneverywhere.com/grafic, serverul citește fișierul de la coadă la capăt și păstrează doar ultimele 20 de înregistrări într-o listă de dicționare Python (implementare similară unui *Queue* cu dimensiune fixă), asigurând fluiditatea randării graficului din Chart.js.
Sistemul funcționează pe baza unei mașini de stări distribuite între cele două plăcuțe și server. Mai jos este descris flow-ul logic cap-la-coadă:
1. Inițializare & Calibrare (Arduino + Pico):
2. Starea de Repaus (Idle):
3. Faza de Testare (Sampling):
4. Procesare Locală (Alerte):
5. Sincronizare Cloud (UART → HTTP):
6. Validare și Confirmare (Server → Hardware):
7. Finalizare Ciclu:
Proiectul a demonstrat realizarea cu succes a unui sistem IoT complet de monitorizare și avertizare a alcoolemiei (Etilotest Cloud), acoperind toate cele trei straturi fundamentale: hardware/embedded local, comunicație inter-plăcuțe și infrastructură server/web.
Prin implementarea acestui sistem, am obținut următoarele rezultate și competențe:
1. Saturația și Calibrarea Senzorului: Inițial, senzorul MQ-3 genera valori reziduale mari în aer curat. Problema a fost rezolvată prin scrierea unei rutine de eșantionare în `setup()` care calculează un `baseline` la fiecare pornire.
2. Erori de Parsare pe Server (Eroarea HTTP 400): Criptarea URL-encoded realizată automat de anumite tipuri de request-uri din MicroPython bloca split-ul de caractere pe server. Trecerea la un pachet de date formatat explicit ca JSON standardizat (`application/json`) a rezolvat definitiv problemele de compatibilitate dintre Pico și endpoint-ul Flask.