etilometro

ciao a tutti, tra poco un mio amico si laurea e per la festa volevo costruire un etilometro con arduino ]:D. ho comprato l'MQ-3 http://www.robot-italy.com/product_info.php?cPath=15_162&products_id=1818 (questo è il datasheet: http://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf). il mio problema è che, pur avendo cercato in internet con vari esempi ecc, non riesco a capire come devo interpretare il dato che mi arriva in lettura sul pin analogico. volevo chiedere a qualcuno che ha realizzato qualche progetto con simili sensori di darmi una mano! :)

grazie :)

sulla pagina che hai linkato sta questa guida in portoghese, http://lusorobotica.com/index.php/topic,111.0.html puo esserti utile... c'è qualcosa in inglese http://www.danielandrade.net/2010/03/07/building-an-breathalyzer-with-mq-3-and-arduino/

80 mg di etanolo per 100 ml di sangue producono 35 µg/100ml di etanolo nell'aria espirata [1].

La concentrazione alcoolemica viene indicata in g/l, in modo da determinare il superamento dei limiti fissati dal codice della strada attualmente pari a 0,5 g/l

^-- fonte wikipedia http://it.wikipedia.org/wiki/Etilometro

quelle guide le ho lette tutte!:) il mio problema non è nè nei collegamenti nè per quanto riguarda la lettura sul pin analogico. il mio problema è quello di correlare il range dei valori analogici letti ai valori di concentrazione dell'alcool nel sangue in quanto poi vorrei visualizzarli su 2 display a sette segmenti!

Nella pagina di Robot-Italy hai 2 link a 2 etilometri che portano a progetti tanto di schemi e codice...

ma gli esempi che ci sono in quella pagina prendono la tensione letta sul pin analogico che va da 0 a 1023 e basta! io vorrei capire come quella tensione possa essere corrisposta alla concetrazione di alcool nel fiato! forse non mi so spiegare tanto bene e non è chiaro ciò che chiedo, scusate :blush: !

E’ scritto nel datasheet. Il sensore agisce come una resistenza variabile il cui valore è legato alla concentrazione di alcool che lo investe. Il partitore di tensione modifica la tensione in base alle resistenze che lo compongono: siccome queste sono 2, una viene messa fissa e l’altra è il sensore. Leggendo la tensione in mezzo alle 2 resistenze tramite un pin analogico, hai un valore dipendente dalla resistenza del sensore, che a sua volta dipende dall’alcool letto. Fai 2 conti e trovi la concentrazione di alcool.

e quali sarebbero questi due conti scuami? non ne ho porprio idea! porta pazienza è tipo il mio primo "progetto" :)

Fai il rapporto fra la tensione minima e massima che puoi leggere sul pin ed estrapoli la concentrazione, hai i valori sul datasheet. Se segui gli esempi linkati trovi tutto il codice, devi solo ricopiarlo.

Oppure fai un test da sobrio e uno da ubriaco... ;) E così capisci tutto :D ]:)

Non è obiettivo, perché uno può andare in coma etilico con 1/2 litro di vino ed un altro scolarsi il classico boccale di birra tipo "Oktober Fest" senza piegarsi in 2 :stuck_out_tongue_closed_eyes:

Forse poi testarlo durante il debug potrebbe essere un po' difficile, una sera ho provato a fare a gara "chi e' messo peggio" con l'etilometro di un amico, e abbiamo verificato che con uso ripetuto i valori non erano attendibili, e tra una misurazione e l'altra per qualche motivo dovevi attendere del tempo... F

secondo me dovevi attendere perche doveva evaporare l' alcool che rimaneva sul sensore, suppongo che se misura 1024, l' aria sia al 100% alcol(prova mettendoci una gocciolina sopra e vedi che ti misura,e poi fai i dovuti rapporti

si ma poi come fai a sapere la quantità di alcol presente nel sangue dalla concntrazione di quello nell'alito?

1) Invita 3 amici 2) Falli bere in 3 modi diversi 3) Misura con un alcol test i 3 valori 4) Comparali con quelli di arduino 5) Dovresti riuscire a ottenere un grafico spero direttamente proporzionale

6) Fatti una birra x il lavoro svolto :grin:

C'è TUTTO nel datasheet. C'è la resistenza fornita dal sensore in base al tasso alcoolemico (da 0,05 a 10 mg/L per una variazione da 1 a 8 Mohm), c'è il valore della resistenza da usare (200K), c'è come collegarlo. ;)

ho finito l’etilometro xò vista la mia inesperienza dopo poco son saltate le saldature =( e quindi ho dovuto riprendere tutto in mano. visto che di programmazione ne so pochetto colgo l’occasione per chiedere se il mio codice può essere migliorato quindi posto il codice e attendo consigli :slight_smile: molte grazie!

// pin che controllano i transistor
const int pin_disp1 = 11;
const int pin_disp2 = 10;

// pin che rileva il sensore
const int pin_val = A0;

// pin che controllano i display
const int pin_a  = 8; 
const int pin_b  = 9; 
const int pin_c  = 4;
const int pin_d  = 5;
const int pin_e  = 6;
const int pin_f  = 7; 
const int pin_g  = 2; 
const int pin_dp = 3; 
const int led_pin = 13;
int pins[] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp, led_pin, pin_disp1, pin_disp2};

int sensor;
int val;
int val_disp1;
int val_disp2;

void setup()
{
  digitalWrite(led_pin,HIGH);
  pinMode(pin_val,INPUT);
  for(int i = 0; i < sizeof(pins); i++)
  {
    pinMode(pins[i],OUTPUT);
  }
  delay(3000);   // aspetta all'accensione
}

void loop()
{ 
  sensor = analogRead(pin_val);
  val = map(sensor,500,1023,1,101);
  val_disp1 = (val-1)/10;
  val_disp2 = ((val-1)-(val_disp1*10));
  if (val_disp1 < 0)
  {
    val_disp1 = 0;
  }
  if (val_disp2 < 0)
  {
    val_disp2 = 0;
  }
  disp1_on();
  visualizza_numero(val_disp1);
  tutto_low();
  disp2_on();
  visualizza_numero(val_disp2);
  tutto_low();
}

// funzioni richiamate nel main loop

void tutto_low()
{
  for (int j = 0; j < sizeof(pins); j++)
  {
    digitalWrite(pins[j],LOW);
  }
}

void disp1_on()
{ 
  digitalWrite(pin_disp2,LOW);
  digitalWrite(pin_disp1, HIGH);
  digitalWrite(pin_dp,HIGH);
}


void disp2_on()
{ 
  digitalWrite(pin_disp1,LOW);
  digitalWrite(pin_disp2,HIGH);
}

void visualizza_numero(int number)
{ 
  switch(number)
  {
    case 0:
    zero();
    break;
    
    case 1:
    one();
    break;
    
    case 2:
    two();
    break;
    
    case 3:
    three();
    break;
    
    case 4:
    four();
    break;
    
    case 5:
    five();
    break;
    
    case 6:
    six();
    break;
    
    case 7:
    seven();
    break;
    
    case 8:
    eight();
    break;
    
    case 9:
    nine();
    break;
    
  }
}

void zero()
{ 
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);
  digitalWrite(pin_e,HIGH);
  digitalWrite(pin_f,HIGH);
}

void one()
{ 
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_c,HIGH);
}

void two()
{ 
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_e,HIGH);
  digitalWrite(pin_d,HIGH);
}

void three()
{ 
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);  
}

void four()
{
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_f,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_c,HIGH);
}

void five()
{
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_f,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);
}

void six()
{
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_f,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);
  digitalWrite(pin_e,HIGH);
}

void seven()
{
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_c,HIGH);
}

void eight()
{
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);
  digitalWrite(pin_e,HIGH);
  digitalWrite(pin_f,HIGH);
  digitalWrite(pin_g,HIGH);
}

void nine()
{
  digitalWrite(pin_a,HIGH);
  digitalWrite(pin_b,HIGH);
  digitalWrite(pin_g,HIGH);
  digitalWrite(pin_f,HIGH);
  digitalWrite(pin_c,HIGH);
  digitalWrite(pin_d,HIGH);
}

Salve,

Ri-Uppo questo vecchio post perchè è l' unico risultato cercando "Etilometro".

Mi sono appena avvicinato al mondo Arduino e per l' esame avevo intenzione di realizzare appunto un etilometro.

Ho portato oggi il DataSheet al mio professore che però non è riuscito a capire molto, in particolare mi servirebbe sapere come si fà a calcolare ( ad esempio) che l' aumento di 1mg/l porta un aumento di TOT valore restituito dal sensore.

Il sensore è un MQ-3 Gas Sensor. DataSheet: http://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf

Ho letto la discussione e mi sembra di avere lo stesso problema dell' utente che l' ha aperta, ma non sono riuscito a capire come abbia fatto a risolvere.

Ho visto molti progetti uguali in giro e circuito e sorgente non sembrano molto complessi, in particolare il circuito è copmposto solo dai 3 fili del sensore.

Utilizzo Arduino UNO.

Se per favore potete spiegarmi "Terra-Terra" come interpretare i valori del sensore mi fareste un gran piacere.

Anticipatamente grazie,

Daniele.

I sensori della serie MQ sono in pratica delle resistenze a filo caldo con le quali creare un partitore resistivo con un'altra resistenza di valore specifico, indicato nel datasheet. Nel caso dell'MQ-3 devi usare una R da con valore da 200K. Il sensore affinché sia preciso deve essere tarato, ossia devi trovare il valore di resistenza La lettura del valore di alcool si ha collegando il sensore ad un ingresso analogico e leggendo il valore riportato.

Il sensore ha 2 grossi difetti, come tutti quelli della serie MQ, consuma un sacco di corrente (quindi non è adatto all'uso in sistemi a batteria) ed inoltre, per essere affidabile, necessita di un preriscaldamento di 24 ore.

Tieni inoltre presente che il sensore è sensibile, più o meno, anche ad altri gas ambientali.

Ok, perfetto !

Sto iniziando a capire :)

Domani riporto le informazioni al professore e vediamo che mi dice.

Per il fatto del riscaldamento sei sicuro delle 24H ? io avevo letto che si parlava di qualche minuto.

Il consumo non dovrebbe essere un problema perchè mi servirebbe solo per una decina di minuti e sarebbe alimentato da una Li-Po 5V da 2200mAH, ma se davvero deve scaldarsi 24H non va propio bene.

Sai cortesemente suggerirmi qualche sensore migliore sia nella sensibilità ( Magari sensibile solo ad Alcol) che nel riscaldamento?

Grazie per la cortese attenzione!

Dany_XIII: Ok, perfetto !

Sto iniziando a capire :)

Domani riporto le informazioni al professore e vediamo che mi dice.

Per il fatto del riscaldamento sei sicuro delle 24H ? io avevo letto che si parlava di qualche minuto.

Dipende da sensore a sensore. Secondo il datasheet che hai riportato tu, sono 24 ore:

Preheat time Over 24 hour

Il consumo non dovrebbe essere un problema perchè mi servirebbe solo per una decina di minuti e sarebbe alimentato da una Li-Po 5V da 2200mAH, ma se davvero deve scaldarsi 24H non va propio bene.

Sai cortesemente suggerirmi qualche sensore migliore sia nella sensibilità ( Magari sensibile solo ad Alcol) che nel riscaldamento?

Conosco gli MQx perché li ho usati ma non ne conosco altri.