etilotest.zip

Etilotest

Nume: Stan Stefan
Grupa: 333CB

Introducere

Prezentare

Proiectul consta intr-un etilotest, care se pune in functiune printr-un buton, care afiseaza pe un ecran LCD cantitatea de alcool si un mesaj sugestiv, iar in eventualitatea in care este depasit un prag, folosesc un buzzer care sa avertizeze utilizatorul ca ar trebui sa se opreasca din consumat alcool.

Ideea si Scopul proiectului

Toata lumea are curiozitatea de a vedea ce alcoolemie ai dupa ce consumi o bere, doua sau mai multe, o bomboana cu rom, etc. Cu acest etilotest, poti vedea daca merita sa te urci la volan sau nu dupa ce ai consumat un produs ce contine orice urma de alcool. Sau daca mai intra o bere daca esti la petrecere si urmatoarea zi ai examen =).

Descriere generală

Placuta de Arduino Uno va primi date de la senzorul de alcool MQ3. Pe ecranul LCD se va afisa cantitatea de alcool din aerul expirat, si un mesaj sugestiv, in functie de cantitatea de alcool determinata. La depasirea unui anumit prag, microcontrollerul va activa un buzzer, pentru a anunta utilizatorul ca s-a depasit un anumit prag.

Schema Bloc

Hardware Design

Prototip implementat in Tinkercad:

Schema electrica:

Implementare finala hardware: etilotest_hw_final.jpg

Software Design

Mediul de dezvoltare

La nivel de implementare a codului, am folosit Arduino IDE Designul circuitului (pana sa ajunga piesele), si schema electrica au fost realizate in Tinkercad

Biblioteci folosite

Am utilizat 'LiquidCrystal_I2C.h', care ofera un API pentru comunicarea prin protocolul I2C cu ecranul LCD ce are atasat pe spate un modul I2C.

Descriere functionalitate

La pornirea etilotestului, acesta initiaza comunicarea cu ecranul LCD, initiaza setupul pentru ADC, pentru senzorul de alcool gazos, prin functia setupADC(), si pinii unde vor fi transmise impulsuri electrice de la buton si catre buzzer. Apoi se va citi in loop, pinul pentru apasarea butonului. Daca acesta nu este apasat, nu se va intra pe fluxul in care se citesc datele de pe senzor si afisarea aferenta. Cand butonul este apasat, se citesc datele venite de la senzor folosind analogReadCustom().

In continuare, am interpretat datele de la senzor si am observat, prin multitudine de testari in conditii diferite, ca valorile date sub 500 corespund la alcool determinat 0 in aerul expirat. Ce sare de 500 inseamna ca exista alcool determinat in aerul expirat. Am pus in functie de anumite intervale sa se primeasca un mesaj diferit pe lcd si buzzerul sa scoata diverse sunete in functie de “gravitatea” alcoolemiei.

O sa detaliez acum putin despre notiunile din laborator folosite:

1. USART. Digital Debugging

  1. Am folosit debugging cu seriala pentru a afisa valorile primite de la senzorul de gaz, starea butonului afisat.

2. I2C

  1. Am folosit biblioteca 'LiquidCrystal_I2C.h' pentru a facilita comunicarea intre microcontroller si ecran.
  2. API-ul explicat pe scurt:
    1. init() → initializeaza comunicarea prin protocolul I2C.
    2. clear() → sterge tot continutul existent pe ecran.
    3. backlight() → aprinde ledurile din spatele ecranului;
    4. setCursor() → seteaza inceputul cursorului de scriere pe ecran
    5. print() → scrie o litera pe ecran, si deplaseaza cursorul o celula la dreapta

3. ADC

  setupADC() 
  - 1. se setează referința de tensiune a ADC la AVCC (tensiunea de referință a alimentării cu curent continuu).
  - 2.  se setează prescalerul ADC la 128. Prescalerul controlează frecvența la care funcționează ADC și divizează frecvența de bază a microcontrolerului.
  - 3. se activează ADC. Bitul ADEN (ADC Enable) din registru ADCSRA este setat la 1 pentru a activa modulul ADC.
  analogReadCustom(uint8_t pin) -
  
  - 1. "ADMUX = (ADMUX & 0xF0) | (pin & 0x0F);" Această linie de cod setează canalul ADC pentru a selecta pinul specific de pe care se va face citirea analogică. "ADMUX" este registru special care controlează setările ADC. În această linie de cod, se utilizează operația cu masti pentru a păstra valoarea existentă a registrelor ADMUX, cu excepția celor mai puțin semnificative 4 biți. Acești 4 biți sunt înlocuiți cu valorile celor mai puțin semnificative 4 biți ai variabilei "pin" pentru a selecta canalul ADC corespunzător.
  - 2. "ADCSRA |= (1 << ADSC);" inițiază conversia analog-digitală. Bitul ADSC (ADC Start Conversion) din registru ADCSRA este setat la 1 pentru a declanșa începerea conversiei ADC.
  - 3. "while (ADCSRA & (1 << ADSC));" așteaptă finalizarea conversiei analog-digitale. Se utilizează o buclă while pentru a verifica în mod continuu starea bitului ADSC din registru ADCSRA. Cât timp bitul ADSC este setat la 1 (conversia este în curs), bucla se execută continuu, ceea ce înseamnă că așteaptă finalizarea conversiei.
  - 4. "return ADC;" returnează valoarea digitală rezultată din conversia analog-digitală. 

Rezultate Obţinute

Am obtinut un etilotest care afiseaza un mesaj in functie de cantitatea de alcool determinata in aerul expirat, iar valoarea este afisata pe seriala. Pentru un demo vizual, intrati pe urmatorul link: https://drive.google.com/file/d/1jECQA-Zpb9RRyhnK6wZDqzt3-ZvT5yjN/view?usp=share_link

Concluzii

Mi se pare foarte nice ca am reusit sa fac un etilotest. Pe langa faptul ca mi-a facut mare placere sa lucrez la acest proiect, acum stiu si daca pot sa plec cu masina dupa ce am baut o bere sau nu, cel putin orientativ =)

Cel mai nice e ca e super rewarding sa vezi la final ca iti merge proiectul, si chiar e ceva functional.

Download

Codul se gaseste in fisierul .ino din arhiva de mai jos:

etilotest.zip

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Resurse Hardware

pm/prj2023/drtranca/stefan.stan.txt · Last modified: 2023/05/28 22:28 by stefan.stan2402
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