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)

Lascia un commento

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