Etilometro

Foto

In questa guida vi illustreremo come creare il vostro etilometro tascabile!

Cosa ci serve?

1   x   DFRduino Nano (cod. DF-DFR0010) – Arduino in miniatura con uscite a 5V e 3.3V

DFRNano

1   x   Analog Gas Sensor(MQ3) (cod. DF-SEN0128) – Sensore di gas alimentato a 5V

MQ3

1   x   Display OLED 128 X 64 (cod. IM-130625003) – Display con risoluzione 128 x 64, alimentato a 3,3V

OLED

1   x   Robot Jumper Wire Kit (cod. RD-JumperMix) – Set di jumper

COLLEGAMENTI

 

Cominciamo collegando l’ Analog Gas Sensor(MQ3) al DFRduino Nano.

I tre pin del sensore (SEN, VCC e GND)

MQ3

vanno collegati nel seguente modo

DFR_MQ3

PIN SENSORE PIN SCHEDA
SEN A0
VCC 5V
GND GND

Conclusa questa operazione procediamo con il collegamento del Display OLED 128 X 64 

PIN OLED PIN SCHEDA
VCC 3.3V
GND GND
RES D4
SDA A4
SCL A5

Come risultato dovremmo ottenere questo:

ETIL

CODICE

Il seguente codice è solo una delle tante cose che si possono fare con questi componenti… Ovviamente il mio consiglio è quello di spaziare da questo, e di creare il vostro proprio codice!

#include <SPI.h> 
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
int WARMUP = 2000; //Tempo di riscaldamento del sensore 
unsigned long time;

int analogPin = 0;
int val = 0;
float x;

Adafruit_SSD1306 display(OLED_RESET); 

void setup()   {                

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //per default viene impostata una tensione interna di 3.3V
 display.clearDisplay(); //puliamo in display
}

void loop() {  
  
  delay(100);

  val = readAlcohol(); 
  x = getGL();
  printTitle();
  printWarming();
  
  time = millis()/10;
  
   if(time <= WARMUP)
  {
    time = map(time, 0, WARMUP, 0, 100);
    display.drawRect(10, 23, 110, 9, WHITE); //Barra vuota
    display.fillRect(10, 23, time,9,WHITE); //Riempimento 
  }
  
  else
  {
     printTitle();
     printAlcohol(x);
     printAlcoholLevel(val);  
  }
  
  display.display(); // abilitiamo il display alla visualizzazione  
}

void printTitle() //Stampa del nome del nostro dispositivo
{
  display.clearDisplay();
  display.setTextSize(1); //Impostiamo la grandezza del testo
  display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE)
  display.setCursor(35,0); //Posizioniamo il cursore (in questo caso "x: 35" e "y: 0") 
  display.println("Etilometro");
}

void printWarming() //Stampa della scritta di caricamento
{
  display.setTextSize(2); //Impostiamo la grandezza del testo
  display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE)
  display.setCursor(30,8); //Posizioniamo il cursore (in questo caso "x: 30" e "y: 8")
  display.println("Carica");
}

void printAlcohol(float value) //Stampare sul display il valore decimale raccolto dal sensore
{
  display.setTextSize(2); //Impostiamo la grandezza del testo
  display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE)
  display.setCursor(45,9); //Posizioniamo il cursore (in questo caso "x: 45" e "y: 9")
  display.println(x);
}

void printAlcoholLevel(int value) //Cambiare informazione display al variare del valore raccolto dal sensore
{
  display.setTextSize(1); //Impostiamo la grandezza del testo
  display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE)
  display.setCursor(20,24); //Posizioniamo il cursore (in questo caso "x: 20" e "y: 24")
  
  if(value<180)
  {
      display.println("Sei OK.");
  }
  if (value>=180 && value<=200)
  {
      display.println("Entro i limiti.");
  }
  if (value>200 && value<=400)
  {
      display.println("Non guidare.");
  }
  if (value>400 && value <=750)
  {
      display.println("Oltre il limite!");
  }
  if(value>750)
  {
     display.println("Sei ubriaco!");
  }
 }
 
 int readAlcohol() //Funzione per determinare la media tra tre valori raccolti dal sensore
 {
  int val = 0;
  int val1;
  int val2;
  int val3; 
  
  display.clearDisplay();
  val1 = analogRead(analogPin); 
  delay(10);
  val2 = analogRead(analogPin); 
  delay(10);
  val3 = analogRead(analogPin);
  
  val = (val1+val2+val3)/3;
  return val;
 }
 
float getGL() //Funzione per ricavare il decimale dal valore letto dal sensore
{
  float x;
  float x1;
  
  x1 = (val * 0.4);
  x = x1/200;

  return x;
}

Per calibrare il sensore mi sono basato sui dati del produttore, che indica come punto di riferimento il valore 200ppm (rilevato dal sensore) corrispondente a 0,4 g/l circa.

Ci tengo a specificare che il prodotto finito non garantisce una precisione tale da essere certi che il valore raccolto rappresenti effettivamente la quantità di alcool studiata e/o ingerita. Vi chiedo quindi di non fare affidamento al 100% a questo dispositivo.

… E ricorda di bere responsabilmente!

The following two tabs change content below.

Ultimi post di andreac (vedi tutti)

2 pensieri su “Etilometro”

  1. Gentile utente,
    per ricavare il dato decimale ci siamo basati sulle informazioni fornite dal produttore, che assegna al valore 200 rilevato dal sensore una corrispondenza col decimale 0,4.
    Esempio:
    se il sensore rilevasse un valore di 350, e sapendo che il valore 200 corrisponde allo 0,4 otterremmo che il valore che corrisponde a 350 è il decimale 0,7.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *