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, I2C operat manual la nivel de regiștri pentru afișarea datelor, UART Software pentru multimedia și Timerele hardware pentru o arhitectură complet non-blocantă — î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 detaliază 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 20×4 + I2C | 1 | Oferă feedback vizual extins. Modulul PCF8574 atașat reduce cablarea la doar pinii SDA și SCL. |
| 4 | Modul Audio DFPlayer Mini | 1 | Acționează ca unitate de decodare și stocare (MicroSD) pentru fișierele audio de ghidare. |
| 5 | Modul Amplificator LM386 Mono | 1 | Prelucrează semnalul de nivel mic (DAC) din playerul audio pentru a ataca eficient difuzorul. |
| 6 | Difuzor 8Ω 0.5W | 1 | Convertește semnalele electrice amplificate în avertizări sonore/vocale. |
| 7 | Buton tactil (Push Button) | 1 | Simulează contactul mașinii, fiind conectat la un pin de întrerupere externă hardware. |
| 8 | LED-uri de Status (R, B, V) | 3 | Indică starea simulată a motorului (Blocat/Avertisment/Deblocat). |
| 9 | Buzzer Activ | 1 | Oferă semnalizare acustică suplimentară (chiuit EKG) la depășirea pragului critic. |
| 10 | Breadboard 830 puncte | 1 | Platforma principală de prototipare pentru rutarea alimentării și a semnalelor. |
| 11 | 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).
loop() complet non-blocantă.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() 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() și procesare_date_senzor().2. Filtru digital de netezire (Low-Pass Filter / Exponential Moving Average)
V_filtrat = (V_vechi * 0.8) + (V_nou * 0.2)
loop().Sistemul SafeDrive este complet funcțional. Montajul final integrează stabil modulele pe breadboard, iar schema electrică este proiectată și validată. Testele efectuate demonstrează capacitatea sistemului de a prelua date analogice corecte de la senzor și de a reacționa în timp real la pragurile de alcool setate.
Prin intermediul unei interfețe shell de test, comanda analogread A1 validează atât alimentarea senzorului MQ-3, cât și integritatea magistralei ADC interne a microcontrolerului.
Pentru a menține codul modular și eficient, au fost utilizate atât biblioteci native AVR, cât și implementări software custom:
<avr/io.h> și <avr/interrupt.h>: Biblioteci native AVR utilizate pentru manipularea directă a registrelor și gestionarea întreruperilor hardware.<util/delay.h>: Utilizată exclusiv în secvențele critice de inițializare hardware unde sunt necesare întârzieri precise.Wire.h, folosind control direct asupra perifericului TWI pentru performanță și înțelegere low-level completă.<SoftwareSerial.h>: Folosită pentru emularea unei interfețe UART dedicate DFPlayer Mini, păstrând UART-ul hardware liber pentru debugging.<DFRobotDFPlayerMini.h>: Simplifică trimiterea comenzilor seriale către DFPlayer pentru controlul redării audio și al volumului.Elementul de noutate constă în integrarea unui sistem de alertă multi-senzorial, adaptiv și complet asincron, capabil să combine feedback-ul vizual, auditiv și vocal într-o singură arhitectură embedded de dimensiuni reduse.
Spre deosebire de etilotestele comerciale clasice bazate exclusiv pe praguri fixe, SafeDrive implementează:
Aceste funcționalități permit o experiență mult mai realistă și robustă, apropiată de sistemele embedded automotive moderne.
Proiectul integrează masiv conceptele low-level studiate la laborator:
DDRx și PORTx folosind bitmasking.ADMUX și ADCSRA, eliminând funcția analogRead().Arhitectura interacțiunii:
Scheletul aplicației este complet event-driven. În funcția setup() sunt inițializate perifericele hardware, magistralele de comunicație și Timer-ul 1.
Funcția principală loop() rămâne permanent non-blocantă și execută doar sarcini dependente de flag-uri software ridicate de ISR-uri.
Fluxul de execuție:
Această arhitectură permite funcționarea simultană a tuturor modulelor fără utilizarea funcțiilor blocante de tip delay().
Dezvoltarea proiectului SafeDrive a reprezentat o provocare inginerească complexă, fiind o tranziție reușită de la utilizarea librăriilor generice la controlul hardware de nivel scăzut.
Principala dificultate a fost gestionarea resurselor limitate de memorie și atenuarea zgomotului indus de comutația perifericelor în semnalul audio, problemă rezolvată prin optimizarea rutinei de redare și prin separarea logică a task-urilor asincrone.
În final, proiectul a consolidat competențele de:
SafeDrive demonstrează succesul integrării unui sistem multi-senzorial robust, capabil să ia decizii critice în timp real fără a necesita un sistem de operare dedicat.
Cod Sursă (GitHub): https://github.com/DimiConstantin/SafeDrive-System.git