Etilotest Smart

Student: Dinca Mihai Flaviu
Grupa: 335CA

Introducere

Proiectul meu consta intr-un etilotest cu mai multe functii. Afiseaza pe ecranul LCD alcoolemia si aprinde un bec rosu in cazul in care ai depasit limita legala, ori verde in cazul in care esti sub limita. De asemenea va afisa pe ecran cantitatea de alcool pur ingerata cat si un timer care iti va spune in cat timp alcoolemia ta va scadea sub limita legala si vei putea urca la volan.
Ideea de proiect a venit din faptul ca mi-am pus de foarte multe ori intrebarea, “oare care este alcoolemia mea dupa ce am baut in seara asta” sau “oare daca beau o bere, ma pot urca la volan in 3-4 ore?”. Pentru mine proiectul este unul pe care cu siguranta o sa il folosesc pentru a-mi satisface curiozitatea si imi va raspunde la multe intrebari si de altfel va face serile la bere cu prietenii mult mai interesante. Nu il voi folosi pentru a decide daca ma pot urca la volan sau nu, dar este un test interesant.

Descriere generală

Dupa ce pornim proiectul, acesta va afisa pe ecran un timer de 40 secunde sub forma de procent ce va da timp senzorului sa se incalzeasca, astfel avand o acuratete mult mai buna. Dupa aceea, vom fi rugati sa apasam pe buton pentru a incepe citirea datelor de la senzor. Un led albastru se va aprinde pe durata de 10 secunde, in care va face 10 citiri de la senzor. Dupa ce citirea a luat sfarsit, led-ul albastru se va inchide, se va aprinde un LED rosu sau verde, daca limita penala a fost atinsa(40mg/L aer respirat) si se va afisa pe LCD datele urmatoare: Particule de alcool / 10^6 particule de aer, alcoolemia in respiratie, alcoolemia in sange, cantitatea aproximata de alcool pur din sange si timpul aproximat in care alcoolul va fi complet eliminat din corp pentru un barbat de 70kg.

Hardware Design

Lista componente:

  • Arduino Uno
  • Breadboard
  • Ecran LCD Nokia 5110
  • Resistente
  • Senzor de etil
  • 3 LED-uri
  • Fire
  • Buton

Pentru partea hardware, am parcurs etapele:

  1. Am legat LCD-ul la placa cu ajutorul breadboard-ului si am incercat sa afisez orice fel de text. A fost partea cea mai dificila deoarece afisajul disparea in mod aleator, fiind necesare multe ore pentru a imi da seama ca ecranul nu este ars. Am ales sa nu folosesc cabluri pentru a pune LCD-ul pe breadboard, ci l-am pus direct, deoarece se tot intrerupea conexiunea si se stergea textul.
  2. Am legat LED-urile la placa cu rezistente de 330 ohmi.
  3. Senzorul l-am montat cu ajutorul unor fire tata-mama
  4. Am montat butonul pe breadboad, care va da start citirii de la senzor.

Software Design

Partea de software am realizat-o in Arduino IDE. Sursa de inspiratie au fost exemplele oferite de biblioteca Adafruit_PCD8544, pe care am si folosit-o pentru a afisa valorile pe LCD, dupa care am implementat restul de functiuni.

Cod Arduino

Cod Arduino

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#define MQ3pin 0
unsigned long time;
float temp = 0;
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
float sensorValue = 0;
const int LED_PIN1 =  11;
const int LED_PIN2 =  8;
const int BUTTON_PIN = 9;
const int LED_PIN =  10; 
int buttonState = 0;
float aer;
int citit = 0;
void setup() {
  aer = analogRead(MQ3pin);
   pinMode(LED_PIN, OUTPUT);
   pinMode(LED_PIN1, OUTPUT);
   pinMode(LED_PIN2, OUTPUT);
   pinMode(BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(9600);
  display.begin();
  display.setContrast(56);

}
void loop(){
  buttonState = digitalRead(BUTTON_PIN);
  time = millis()/1000;
  
  if(time <= 20){
   int progress_time =  map(time, 0, 20, 0, 100);
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("The sensor is warming up!");
  display.setCursor(0,20);
  display.println("Have patience.");
  display.setCursor(30,30);
  display.println(progress_time);
  display.setCursor(48,30);
  display.println("%");
  display.display();
  display.clearDisplay();
  } else {
      if(citit == 0){
        digitalWrite(LED_PIN1, LOW);
        digitalWrite(LED_PIN2, LOW);
      display.clearDisplay();
      display.setCursor(0,0);
      display.println("Press the button and breathe while the blue light is on...");
      display.display();
      }
     if(buttonState == LOW){
 
        citit = 1;       
         for (int i = 0; i < 10; i++) {
          delay(1000);
          temp = analogRead(MQ3pin) - aer;
          display.clearDisplay();
          display.setCursor(0,0);
          display.println("Reading...");
          display.setCursor(0,20);
          display.println(temp);
          display.display();
          display.clearDisplay();
          digitalWrite(LED_PIN, HIGH);
          
           sensorValue = sensorValue + temp;

          }
        sensorValue = sensorValue / 10;
        digitalWrite(LED_PIN, LOW); 
      
  }
      if(citit == 1){
            
        float val_aer = sensorValue / 550;
         float val_sange = val_aer * 2.1;
          if(val_aer >= (float)0.4){
            digitalWrite(LED_PIN1, LOW);
            digitalWrite(LED_PIN2, HIGH);
            } else {
            digitalWrite(LED_PIN1, HIGH);
            digitalWrite(LED_PIN2,LOW);
              }
        display.clearDisplay();
        display.setCursor(0,0);
        display.println("PPM:");
        display.setCursor(25,0);
        display.println(sensorValue);
         
         
        display.setCursor(0,10);
        display.println("Aer: ");
        display.setCursor(25,10);
        display.println(val_aer);
        display.setCursor(50,10);
        display.println("mg/L");
        display.setCursor(0,20);
        display.println("Sange: ");
        display.setCursor(35,20);
        display.println(val_sange);
        display.setCursor(60,20);
        display.println("g/L");
        display.setCursor(0,30);
        display.println("Alcool Pur:");
        display.setCursor(65,30);
        float x = val_aer * (float)100;
        display.println((int)x);
        display.setCursor(0,40);
        display.println("Timp:");
        display.setCursor(35,40);
        display.println(x / 12.5);
        display.setCursor(60,40);
        display.println("ore");
        display.display();
        delay(10000);
        citit = 0;
        }
     }
  }

Rezultate Obtinute

Proiectul a iesit asa cum imi doream si am implementat cam tot ce mi-am dorit de la el.
Demo: https://youtu.be/qiokoZVNMRw

Concluzie

Acest proiect mi s-a parut cel mai fun lucru pe care l-am facut in facultate. Am petrecut mult mai multe ore decat ma asteptam, dar au fost ore pe care nu le consider pierdute, am testat multe lucruri, m-am jucat mult cu piesele si pot sa zic ca am invatat super multe. Partea buna este ca am comandat foarte multe componente care mi-au ramas si mai am inca cateva idei nice cu care sa ma joc in viitorul apropiat.

Bibliografie

pm/prj2021/alazar/etilotest_smart.txt · Last modified: 2021/06/02 21:05 by mihai_flaviu.dinca
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