This shows you the differences between two versions of the page.
pm:prj2023:iotelea:alcoololmetru [2023/05/21 23:00] matei.staicu |
pm:prj2023:iotelea:alcoololmetru [2023/05/29 21:52] (current) matei.staicu |
||
---|---|---|---|
Line 23: | Line 23: | ||
- Rezistente | - Rezistente | ||
- Cabluri | - Cabluri | ||
+ | Ecranul este montat direct intr-un colt al breadboardului pentru ca este mai usor de urmarit daca este fix. Pe breadboard mai este montat buzzerul, butonul de reset (cel rosu), dar si cel utilizat pentru navigarea prin informatiile oferite de arduino pe ecran (cel verde). Potentiometrele sunt conectate la breadboard si arduino prin niste cabluri putin mai lungi, pentru ca fixarea acestora pe breadboard ar fi facut accesul la acestea, dar si la celelalte componente destul de dificil. Senzorul MQ-3 am ales sa il fixez tot pe breadboard pentru a fi cat mai stabil posibil, dar si o conexiune cat mai buna. Am incercat sa compensez utilizarea mai greoaie prin utilizarea unui cablu de conectare la laptop mai lung, dar si fixarea componentelor impreuna, pe cat posibil. In asamblarea componentelor, am utilizat o rezistenta de 220 Ohmi pentru ecranul LCD, dar si alte 3 rezistente pentru buzzer si cele doua butoane. | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | + | Pentru dezvoltarea codului am folosit Arduino IDE, versiunea 1.8.19.\\ | |
- | + | \\ | |
- | <note tip> | + | In prima parte a codului am importat biblioteca LiquidCrystal, utilizata pentru manipularea ecranului LCD. Ca o paranteza, acesta foloseste SPI, nu este varianta I2C. Tot in prima parte a codului sunt toate constantele pe care le-am folosit pe parcursul implementarii (am incercat sa evit pe cat posibil hardcodari pentru a fi cat mai usor de modificat), dar si cateva variabile globale.\\ |
- | Descrierea codului aplicaţiei (firmware): | + | In continuare, la setup, se vor apela doua functii. Prima functie este cea de warmup, care va permite etilotestului sa se incalzeasca pentru 30 de secunde (in special pentru a se stabiliza senzorul MQ-3) si va afisa un mesaj pe LCD. Cea de-a doua functie este cea de initialState(), care va afisa un mesaj cum ca etilotestul este gata.\\ |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | \\ |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | In functia de loop(), sunt implementate functionalitatile in functie de inputul de la butoane si potentiometre. Daca se apasa butonul de reset (cel rosu), se va apela functia de initialState(). Pentru celalalt buton, la prima apasare se va permite inputul pentru varsta si sex, cu ajutorul potentiometrelor (folosind ADC), in functia de measureInput(). La a doua apasare, se va masura concentratia de alcool cu ajutorul senzorului MQ-3, prin masurari succesive intr-un interval de 5 secunde, se va face media acestor masuratori si se va afisa pe ecran. In sfarsit, la urmatoarea apasare de buton, se vor calcula timpul pana cand utilizatorul se va putea urca in siguranta la volan, dar si riscul de a face un accident daca utilizatorul se urca la volan in acel moment. Daca concentratia este peste limita, buzzerul va fi activat. La urmatoarele apasari de buton, se va face switch intre concentratie si timpul necesar/riscul de accident. Am folosit un delay de 0.1 secunde in functia de loop() pentru a asigura precizia la trecerea prin meniuri si a nu sari din greseala peste unul dintre ele la o singura apasare de buton.\\ |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | \\ |
- | * (etapa 3) surse şi funcţii implementate | + | Au fost folosite mesaje prin interfata seriala, in scop de debug. |
- | </note> | + | Formulele folosite in cadrul proiectului pentru diversele calcule sunt aproximative si pot avea erori destul de mari, fiind multi factori implicati in masurarea concentratiei de alcool in aerul expirat, dar si precizia senzorului poate fi destul de mica.\\ |
+ | \\ | ||
+ | Concentratia = valoareMQ3 * (voltajReferinta / 1023) * senzitivitate * factorVarsta * factorGen, unde\\ | ||
+ | - valoareMQ3 = valoarea inregistrata de senzor | ||
+ | - voltajReferinta = 5 | ||
+ | - senzitivitate = 0.15 | ||
+ | - factorVarsta = 0.9, daca varsta este pana in 25 de ani | ||
+ | - factorGen = 0.95 pentru barbati si 1.05 pentru femei\\ | ||
+ | \\ | ||
+ | Timpul de asteptare = concentratie / rataEliminareAlcool, unde\\ | ||
+ | - rataEliminare = 0.16 pentru barbati si 0.12 pentru femei | ||
+ | \\ | ||
+ | Nota: Desi in legislatia din Romania nu este permisa o concentratie de alcool mai mare de 0, eu am folosit in implementare o limita de 0.2 mg/L, pentru ca senzorul si formula nu sunt foarte precise, dar exista si alte tari care au limita mai mare decat 0. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | + | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruWarmup.jpg?500 }} | |
- | <note tip> | + | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruReady.jpg?500 }} |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruInput.jpg?500 }} |
- | </note> | + | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruMeasuring.jpg?500 }} |
+ | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruConcentration.jpg?500 }} | ||
+ | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/AlcoololmetruTimeRisk.jpg?500 }} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Acesta a fost primul proiect Arduino facut de la 0 de mine. A fost foarte interesant si mult mai usor de realizat decat mi-am imaginat. Nu am intampinat probleme majore cu componentele, asamblarea fiind putin mai complicata pe alocuri, in special din cauza cablurilor care nu stateau conectate cum trebuie/nu faceau contact. Din pacate, singura dezamagire este faptul ca nu am reusit sa gasesc o formula suficient de precisa pentru calculul concentratiei, ce-i drept fiind si foarte multi factori implicati in aceasta masuratoare.\\ | ||
+ | Nota: nu s-a consumat alcool pentru testarea acestui proiect. :) | ||
===== Download ===== | ===== Download ===== | ||
+ | {{ https://ocw.cs.pub.ro/courses/_media/pm/prj2023/iotelea/alcoololmetrucode.zip}} | ||
- | <note warning> | ||
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | ||
- | |||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
- | + | 03.05.2023: Alegerea temei\\ | |
- | <note tip> | + | 05.05.2023: Crearea paginii pe ocw si adaugarea unei descrieri generale si a listei de componente necesare\\ |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | 16.05.2023: Sosirea pieselor\\ |
- | </note> | + | 20.05.2023: Conectarea pieselor\\ |
+ | 21.05.2023: Testarea componentelor si actualizarea paginii de ocw cu sectiunea Hardware Design\\ | ||
+ | 28.06.2023: Realizarea software-ului\\ | ||
+ | 29.06.2023: Finalizarea paginii de ocw si o testare finala | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab1-2022|Lab1]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023|Lab3]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab4-2022|Lab4]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab5-2022|Lab5]]\\ | ||
+ | https://lastminuteengineers.com/mq3-alcohol-sensor-arduino-tutorial/ | ||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </note> | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||