This is an old revision of the document!
SafeDrive este un sistem embedded de siguranță conceput pentru a simula funcționalitatea dispozitivelor comerciale de tip Alcolock. Obiectivul său principal este de a evalua concentrația de alcool din aerul expirat de șofer și de a preveni activ pornirea motorului vehiculului dacă limita legală este depășită.
Motivația din spatele acestui proiect este construirea unei aplicații tangibile, menite să salveze vieți, care face legătura între senzorii hardware de bază și sistemele de siguranță activă. Prin renunțarea la mediul standard Arduino, acest proiect servește drept un exercițiu complex de programare AVR. Acesta provoacă dezvoltatorul să orchestreze perfect multiple periferice hardware — cum ar fi ADC pentru procesarea semnalelor analogice, SPI pentru gestionarea sistemului de fișiere, I2C pentru afișarea datelor și Timerele hardware pentru generarea semnalului audio digital — într-o singură aplicație unitară, bazată pe întreruperi.
Întregul flux operațional este orchestrat de microcontrolerul ATmega328P. Arhitectura sistemului este împărțită în patru blocuri logice principale:
Tabelul de mai jos detaliaază componentele necesare pentru a construi prototipul SafeDrive:
| Nr. | Nume Componentă | Cant. | Rol Tehnic & Detalii |
|---|---|---|---|
| 1 | ATmega328P Xplained Mini | 1 | Unitatea centrală de procesare care gestionează toată logica, întreruperile și timpii de execuție. |
| 2 | Modul Senzor de Gaz MQ-3 | 1 | Detectează concentrația de alcool; oferă un semnal analogic (0-5V). |
| 3 | Display LCD 1602 + I2C | 1 | Oferă feedback vizual. Modulul PCF8574 atașat reduce cablarea la doar pinii SDA și SCL. |
| 4 | Adaptor Card MicroSD | 1 | Acționează ca unitate de stocare pentru fișierele audio; comunică prin magistrala SPI. |
| 5 | Difuzor 8Ω 0.5W | 1 | Convertește semnalele electrice PWM în avertizări sonore/vocale. |
| 6 | Tranzistor NPN 2N2222 | 1 | Acționează ca un amplificator pentru difuzor, comandat de pinul PWM al microcontrolerului (include o rezistență de bază de 1kΩ). |
| 7 | Buton tactil (Push Button) | 1 | Simulează contactul mașinii, fiind conectat la un pin de întrerupere externă. |
| 8 | LED-uri de Status (R, G, V) | 3 | Indică starea simulată a motorului (Blocat/Avertisment/Deblocat). |
| 9 | Breadboard 830 puncte | 1 | Platforma principală de prototipare pentru rutarea alimentării și a semnalelor. |
| 10 | Fire conexiune DuPont | 1 set | Folosite pentru interconectarea modulelor cu placa Xplained Mini. |
Alocarea pinilor nu a fost aleatorie, ci a respectat strict arhitectura internă a microcontrolerului ATmega328P:
Firmware-ul pentru SafeDrive este scris integral în C, manipulând direct regiștrii AVR pentru a asigura o performanță maximă și un consum minim de memorie (SRAM).
Calibrarea senzorului analogic de gaz MQ-3 (bazat pe dioxid de staniu - SnO2) a necesitat o abordare empirică, divizată în două etape esențiale datorită naturii termochimice a componentei:
prag_aer_curat). Pentru a obține o estimare a concentrației de alcool, sistemul calculează diferența dintre valoarea curentă citită și acest prag de repaus, aplicând ulterior un factor de atenuare și o conversie liniară empirică:BAC(%) = (Valoare_ADC - Prag_AerCurat) * 0.00025
Orice valoare a senzorului care fluctuează sub pragul de bază este ignorată, fiind forțată la 0.00% pentru a preveni declanșările accidentale din cauza zgomotului termic sau a fluctuațiilor de tensiune.
Pentru a asigura rularea stabilă a proiectului pe un microcontroler cu resurse limitate (ATmega328P dispune de doar 2KB SRAM), au fost implementate două optimizări majore:
1. Optimizarea memoriei dinamice (Prevenirea Memory Leaks / Heap Fragmentation)
String() (ex. String(valoare_bruta)) din rutinele de logging serial. Concatenările costisitoare au fost înlocuite cu apeluri succesive, bazate pe text constant, folosind Serial.print(). În plus, printarea datelor de diagnoză a fost mutată strict în interiorul blocului condiționat de flag-ul Timerului 1.loop()) ducea la fragmentarea rapidă a memoriei SRAM. Această epuizare a resurselor bloca procesorul într-o buclă de așteptare, provocând “înghețarea” sistemului exact la momentul trecerii prin pragurile superioare de alertă sau la comunicarea UART cu modulul DFPlayer.loop() și procesare_date_senzor().2. Filtru digital de netezire (Low-Pass Filter / Exponential Moving Average)
static pentru a reține starea istorică a citirilor între apelurile funcției, aplicând următoarea ecuație de mediere exponențială:V_filtrat = (V_vechi * 0.8) + (V_nou * 0.2)
procesare_date_senzor(), imediat după preluarea valorii brute de la hardware-ul ADC.
În imaginile de mai sus este prezentat montajul fizic preliminar pe breadboard. Pentru a valida conexiunile și funcționalitatea, a fost realizat un test independent al senzorului de alcool MQ-3.
Prin intermediul unei interfețe shell de test, comanda analogread A1 demonstrează capacitatea microcontrolerului de a prelua date analogice corecte de la senzor. Acest lucru validează atât alimentarea senzorului (parcurgerea cu succes a fazei de încălzire), cât și integritatea magistralei ADC interne a microcontrolerului.
Pentru a menține codul curat și a abstractiza protocoalele de comunicație complexe, au fost utilizate următoarele biblioteci externe:
<Wire.h> și <LiquidCrystal_I2C.h>: Necesare pentru comunicarea cu display-ul LCD 1602 prin protocolul I2C. Această abordare reduce drastic numărul de pini utilizați de la 6 la doar 2 (SDA și SCL).<SoftwareSerial.h>: Utilizată pentru a emula o interfață UART hardware pe pinii D10 (RX) și D11 (TX). Astfel, magistrala Serială hardware nativă (pinii D0/D1) a rămas complet liberă pentru diagnoză, calibrare și debugging via PC.<DFRobotDFPlayerMini.h>: Abstractizează trimiterea pachetelor de date hexazecimale specifice protocolului modulului MP3, permițând redarea melodiilor și controlul volumului prin funcții simple (ex. playerAudio.play(1)).<avr/io.h> și <avr/interrupt.h>: Biblioteci native AVR folosite pentru manipularea directă a regiștrilor și gestionarea vectorilor de întrerupere, esențiale pentru conceptele de laborator integrate.Elementul de noutate constă în integrarea unui sistem de alertă multi-senzorial, treptat și imersiv, adaptat nivelului de pericol. Spre deosebire de etilotestele clasice comerciale cu un singur prag (Admis/Respins), SafeDrive scalează nivelul de avertizare: de la mesaje text și culori specifice pe LCD/LED-uri, la redarea de instrucțiuni vocale sau audio dedicate fiecărui stadiu. Punctul culminant al sistemului este “Alarma EKG”, o alertă acustică continuă generată din buzzer pentru a semnaliza nivelurile letale de alcool. Această precizie vizuală și sonoră este susținută matematic de un filtru digital software de tip Low-Pass, aplicat în timp real pe semnalele analogice pentru a oferi fluiditate stărilor.
Proiectul integrează masiv elemente de low-level studiate la laborator pentru a garanta performanța pe un microcontroler cu resurse limitate:
digitalWrite), au fost manipulați direct regiștrii de direcție DDRx și de date PORTx prin bitmasking (ex: PORTD |= (1 « PD2)) pentru controlul instantaneu al LED-urilor și buzzer-ului.analogRead() a fost eliminată. Conversia datelor de la senzorul MQ-3 se realizează prin setarea manuală a regiștrilor ADMUX și ADCSRA, configurând la nivel hardware tensiunea de referință și prescaler-ul optim de 128.delay(), a fost configurat Timer-ul 1 (timer pe 16 biți) în modul CTC (Clear Timer on Compare Match). Acesta generează o întrerupere hardware (ISR) recurentă, setată cu precizie matematică la fiecare 500ms.
Arhitectura interacțiunii:
Scheletul se bazează pe o execuție fluidă, bazată pe evenimente (event-driven). În funcția setup(), pe lângă inițializarea pinilor și a modulelor I2C/UART, se pornește Timer-ul 1. Bucla principală loop() rămâne complet inactivă până când Timer-ul declanșează o întrerupere (la 500ms) și ridică un flag software (flag_actualizare).
În acel moment, este apelată funcția de procesare:
La finalul rutinei, flag-ul este resetat, iar procesorul este eliberat pentru alte sarcini până la următoarea întrerupere.
Cod Sursă (GitHub): SafeDrive Public Repository