Table of Contents

Etilotest Digital cu Stocare Cloud

Introducere

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.

Descriere generală

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).

Hardware Design

Descriere componente

Tabel Conexiuni Hardware

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ă

Schema electrica

Rezultate

Software Design

Mediul de Dezvoltare

Pentru realizarea sistemului etilotest s-au utilizat trei medii de dezvoltare complementare:

Librării și Surse 3rd-Party

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.

Algoritmi și Structuri de Date Implementate

A. Algoritmul de Calibrare Dinamică (Baseline Calibration)

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ă.

B. Algoritmul de Detecție a Vârfului (Peak Detection)

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.

C. Structura de Date pentru Istoric (Buffer Circular Virtual)

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.

Fluxul Programului

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:

Rezultate

Concluzii

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:

Dificultăți întâmpinate și soluții

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.

Source

Github repo

Export to PDF