Breathalyzer cu Mecanism de Blocare pentru Chei Auto

Introducere

Proiectul constă în realizarea unui dispozitiv etilotest digital portabil, care detectează nivelul de alcool din aerul expirat utilizând senzorul MQ-3. Pe lângă afișarea rezultatelor pe un displayși oferirea de feedback vizual și sonor, proiectul include un mecanism de siguranță suplimentar: un motor acționează un sistem de blocare care restricționează accesul la cheile mașinii în cazul unui nivel ridicat de alcool. Astfel, dispozitivul nu doar informează utilizatorul, ci contribuie activ la prevenirea luării unor decizii periculoase în trafic.

Scopul Proiectului

Scopul principal al acestui proiect este de a crea un sistem accesibil și eficient care să permită utilizatorilor să evalueze rapid nivelul de alcool din respirație înainte de a decide dacă sunt apți pentru a conduce.

===== Mod de funcționare =====

După inițializare și încălzirea senzorului MQ-3, utilizatorul poate porni testul prin apăsarea butonului. Timp de aproximativ 7 secunde, senzorul captează nivelul de alcool din aerul expirat. Datele sunt analizate de către microcontrollerul Arduino, care determină în ce categorie de risc se încadrează utilizatorul.

Rezultatul este afișat pe ecran și este însoțit de un semnal sonor distinct. Dacă nivelul este sigur, motorul acționează un mecanism ce eliberează cheile mașinii. În caz contrar, acestea rămân blocate. Astfel, sistemul oferă o reacție imediată, clară și preventivă, orientată spre siguranța utilizatorului.

Descriere Generală

Dispozitivul este alcătuit din următoarele componente principale:

  • Senzorul MQ-3: Acesta este un senzor de alcool care detectează concentrația de alcool din aer. După ce butonul este apăsat, senzorul începe să înregistreze datele pentru un interval de timp prestabilit. Valorile măsurate sunt transmise către microcontroller pentru procesare.
  • Arduino UNO: Reprezintă unitatea centrală de control a sistemului. Primește datele de la senzorul MQ-3, le procesează și declanșează acțiuni corespunzătoare (afișare, semnalizare LED/buzzer și control motor).
  • Display-ul: Afișează mesaje de status, instrucțiuni pentru utilizator și rezultatul final al testului. Este interfața principală vizuală a dispozitivului.
  • LED's: Oferă feedback vizual privind rezultatul testului. Culorile semnifică: verde pentru nivel sigur, galben pentru nivel intermediar și roșu pentru nivel periculos.
  • Buzzer: Produce semnale sonore diferite în funcție de nivelul detectat de alcool. De exemplu, un sunet scurt pentru nivel sigur și un sunet lung sau intermitent pentru niveluri periculoase.
  • Butonul de inițiere: Permite utilizatorului să pornească testul de respirație. Declanșează procesul de citire a valorilor de la senzor pentru o durată fixă.
  • Motorul (servo/DC): Controlează un mecanism de blocare fizică. Dacă rezultatul testului indică un nivel scăzut de alcool, motorul acționează pentru a debloca accesul la cheile mașinii. În caz contrar, blocarea se menține.

Toate aceste componente funcționează împreună pentru a oferi un sistem complet, care nu doar evaluează nivelul de alcool, ci și acționează asupra unui element fizic de control — blocarea cheilor auto.

Hardware Design

Lista de piese:

Conexiuni pini

Pin Arduino Tip Conectat la Descriere
D2 Digital / INT0 Buton Buton pentru inițiere test / închidere ușă, folosește întrerupere externă INT0 cu debounce.
D4 Digital Buzzer activ HND-2312 Emitere semnal sonor pentru avertizare sau confirmare.
D7 Digital LED verde Aprins când utilizatorul este apt de condus.
D6 Digital LED galben Aprins când nivelul necesită așteptare (valoare medie).
D8 Digital LED roșu Aprins când nivelul de alcool este periculos.
D9 (OC1A) PWM hardware Servo motor SG90 Controlează servo-ul care eliberează sau blochează cheia. PWM generat de Timer1.
A0 Analog input Senzor MQ-3 Citește nivelul de alcool prin conversie analog-digital (ADC).
A4 (SDA) I2C data line LCD1602 I2C Comunicare I2C cu modulul de afișaj LCD (date).
A5 (SCL) I2C clock line LCD1602 I2C Comunicare I2C cu modulul de afișaj LCD (clock).
GND Power Masă comună Conexiune de masă pentru toate componentele (comună cu bateriile și senzorul).
5V Power LCD, senzor MQ-3, LED-uri Tensiune stabilă furnizată de Arduino pentru alimentarea componentelor cu consum mic.

Software Design

Laboratoare folosite

  • Laboratorul 0 – GPIO → folosit pentru configurarea pinilor pentru LED-uri, buton, buzzer și servomotor.
  • Laboratorul 1 – UART → folosit pentru a afișa informații de debug în consola serială (valori senzor, status ușă etc.).
  • Laboratorul 2 – Întreruperi → folosit pentru tratarea apasărilor de buton folosind întreruperea externă INT0 cu debouncing.
  • Laboratorul 3 – Timere / PWM
    • Timer0 (mod CTC) folosit pentru contorul de timp `systicks` (1 ms).
    • Timer1 (mod Fast PWM) folosit pentru controlul servomotorului SG90.
  • Laboratorul 4 – ADC → folosit pentru citirea valorilor analogice de la senzorul de alcool MQ-3 (pe pinul A0).
  • Laboratorul 6 – I2C → folosit pentru afișajul LCD 1602, prin comunicare I2C cu modulul PCF8574.

Implementarea logicii

Programul începe prin apelarea funcțiilor de inițializare:

  • `GPIO_init()` configurează LED-urile, butonul, buzzer-ul și pinul de control pentru servo.
  • `USART0_init()` și `USART0_use_stdio()` activează comunicația UART pentru debug.
  • `ADC0_init()` pregătește convertorul analog-digital pentru citirea senzorului MQ-3.
  • `TWI_init()` și `LCD_init()` configurează afișajul LCD 1602 via I2C.
  • `Timer0_init_systicks()` pornește un timer care incrementează variabila `systicks` la fiecare 1 ms.
  • `Timer1_init_servo_pwm()` configurează PWM-ul pentru controlul servomotorului.
  • `Button_interrupt_init()` setează întreruperea externă INT0 pentru detectarea apăsării butonului.

După inițializare, începe faza de încălzire a senzorului MQ-3, folosind variabila `systicks` pentru temporizare. Progresul este afișat pe LCD în procente.

După terminarea încălzirii:

  • Pe ecran apare un mesaj care invită utilizatorul să apese butonul.
  • La apăsarea butonului (detectată în `ISR(INT0_vect)`), se setează `button_pressed = 1`, iar în `main()` începe măsurarea:
    • Se setează `isMeasuring = 1` și `measurementStart = systicks`.
    • Timp de 7 secunde (`READ_TIME_MS`), în bucla principală se apelează `ADC0_read()` și se afișează valoarea pe LCD și în UART.
    • Ultima valoare citită este salvată în `alcoholValue`.

După finalizarea măsurării:

  • Se apelează `turn_off_leds()` pentru resetare.
  • Se compară valoarea și, în funcție de interval, se activează LED-ul corespunzător și se pornește `buzzer_beep()` sau ton constant.
  • Dacă valoarea este sub prag, se apelează `servo_set_angle(90)` pentru a „elibera cheia” și `door_is_open = 1`.

Dacă ușa este deschisă:

  • Programul intră într-o buclă care așteaptă o nouă apăsare de buton pentru a apela `servo_set_angle(0)` și a închide ușa.

În final:

  • Se activează o fază de stabilizare a senzorului, unde se monitorizează periodic `ADC0_read()` până ce valoarea scade sub 350 sau trec 60 de secunde.
  • Dacă senzorul s-a stabilizat, se revine la starea de așteptare pentru un nou test.

Funcții auxiliare

  • `buzzer_beep(uint8_t times, uint16_t duration_ms)`

Generează un număr specificat de beep-uri scurte, fiecare având o durată configurabilă în milisecunde. Este utilizată pentru avertizare (galben) sau confirmare (verde).

  • `ADC0_read()`

Inițiază o conversie analog–digitală pe pinul A0 și returnează valoarea digitală corespunzătoare nivelului de alcool detectat de senzorul MQ-3. Este apelată periodic în timpul măsurării și în faza de stabilizare.

  • `Button_interrupt_init()`

Configurează întreruperea externă INT0 pentru a detecta apăsarea butonului de test. Activează flancul descendent și permite reacția instantanee prin `ISR(INT0_vect)`.

  • `LCD_send_nibble(uint8_t nibble, uint8_t mode)`

Trimite 4 biți către LCD (în mod comandă sau date), împreună cu semnalul de strobe (`ENABLE`). Este parte din comunicația I2C la nivel de protocol LCD.

==== Nivele de citire ====

Valoare senzor MQ-3 LED Acțiune sistem
sub 500 Verde Se afișează “You can drive”, servo deschide cheia, 1 beep scurt
500 – 569 Galben Se afișează “Wait 1 hour”, 3 beep-uri, cheia rămâne blocată
570 – 649 Galben Se afișează “Wait few hours”, 3 beep-uri, cheia rămâne blocată
650 și peste Roșu Se afișează “DO NOT DRIVE!”, buzzer continuu, cheia blocată

Rezultate Obţinute

Concluzii

Sistemul clasifică nivelul de alcool detectat în patru intervale de risc, oferind un răspuns imediat și intuitiv prin afișaj, LED-uri, semnale sonore și controlul servo-motorului. Această abordare contribuie la creșterea siguranței utilizatorului și la prevenirea condusului sub influența alcoolului.

pm/prj2025/ajipa/paul.lavric.txt · Last modified: 2025/05/29 21:26 by paul.lavric
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0