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.
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 .
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.
Prototip implementat in Tinkercad:
La nivel de implementare a codului, am folosit Arduino IDE Designul circuitului (pana sa ajunga piesele), si schema electrica au fost realizate in Tinkercad
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.
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
2. I2C
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ă.
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
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.
Codul se gaseste in fisierul .ino din arhiva de mai jos:
Senzor MQ3 Datasheet: https://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf
Ecran LCD cu modul I2C: http://www.handsontec.com/dataspecs/module/I2C_1602_LCD.pdf
Datasheet microcontroller: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf