In questo progetto vedremo come costruire un semplice etilometro con Arduino. Cosa serve: – Scheda Arduino Uno – Sensore di alcool etilico MT-3 – 9 Diodi Led – 9 Resistenze da 330 ohm – 2 Resistenze da 10 Kohm – Batteria da 9 volt con relativo connettore – Foglio di PVC o compensato per la realizzazione della scatola di contenimento – Piccola basetta mille-fori per il fissaggio dei componenti elettronici – Saldatore e stagno – Taglierino – Attack o colla a caldo – Colore ad acqua e pennello
Come funziona:
Il sensore analogico MQ-3 rileva la concentrazione di alcool etilico presente nell’ aria. Collegandolo ad un’ingresso analogico, nel nostro caso l’ingresso A0 è possibile rilevare una valore da 0 a 1023 direttamente proporzionale alla concentrazione di alcool rilevata. Facendo alcuni test di taratura è possibile realizzare uno strumento attendibile e preciso. I 9 led sono necessari per creare una barra luminosa graduale che indica il valore di alcool. Più led si accendono, più la concentrazione di alcool sarà elevata. In questo tutorial sono stati calcolati 9 intervalli di valori corrispondenti ad una quantità d’alcool che va da 0,16 grammi/litro (1 led acceso) a 1,44 gramm/litro (9 led accesi). L’accensione dei primi 3 led indica il raggiungimento del livello massimo consentito per legge oltre il quale scatta la sanzione per stato d’ ebbrezza (0,5 grammi/litro).
Schema di collegamento del sensore
Le resistenze da 330 ohm sono necessarie per limitare il valore di corrente transitante nei diodi LED. Il polo positivo del LED (piedino più lungo) va collegato direttamente agli ingressi digitali, mentre il polo negativo va alla resistenza da 330 ohm e successivamente a massa.
Le due resistenze da 10 Kohm (messe in parallelo) sono necessarie per tarare il sensore MQ-3. Per ridurre o aumentare la sua sensibilità potrei optare anche per un potenziometro regolabile ma in questo caso ho voluto fissare il valore e impostare la taratura direttamente nello sketch.
Il sensore di alcool etilico MQ-3 va collegato secondo lo schema sopra. Guardando il sensore girato nel senso dei piedini:
- i 3 piedini a sinistra vanno collegati insieme tra loro e con un’ unico cavo mi collego a 5 Volt;
- il primo piedino in alto a sinistra va collegato all’ ingresso analogico A0;
- il piedino centrale va a massa (GND);
- il piedino in basso a sinistra va collegato alla Rt (Resistenza di taratura). Nel mio caso ho impostato a 5 Kohm utilizzando 2 resistenze da 10 Kohm in parallelo.
Per rendere portatile lo strumento ho deciso di utilizzare una semplice batteria da 9 volt. Se lo lascio in macchina potrei anche decidere di utilizzare un piccolo alimentatore auto con connettore USB da collegare direttamente alla batteria auto.
Il problema di Arduino spesso è l’ottimizzazione del progetto per garantire un affidabile e facile utilizzo. In commercio esistono scatole già pronte, ma per realizzare un contenitore completamente personalizzato adattato alle proprie esigenze per me è consigliabile perdere un pò di tempo ritagliando i pezzi per l’assemblaggio di una scatola su misura.
Foto delle fasi del progetto:
saldati i led sulla basetta millefori
saldati i componenti
fissata la scheda componenti ad Arduino
scatola etilometro
risultato finale
Video di test del sensore:
Sketch del programma:
Per facilità realizzativa abbiamo collegato i led partendo dal piedino digitale 5 e arrivando fino al 13.
Etilometro
by www.fragolebio.it
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
/* Etilometro Collego il sensore MQ-3 all' ingresso analogico A0. Collego 9 led agli ingressi digitali partendo dal 5 arrivando fino al 13. Il diodo led va collegato con il piedino più lungo al più all' ingresso digitale e il piedino più corto al meno ad una resistenza da 330 ohm che poi va collegata a massa. Per calcolra il valore di corrente (mA) circolante nel led basta che faccio: V=R*I I=V/R L'ingresso digitale ha una tensione di 5 V, la caduta di tensione sul diodo è di 2 V quindi la caduta di tensione sulla resistenza sarà di 3V quindi I=3V/330ohm= 10 mA circa è la corrente circolante nel diodo LED Per tarare il sensore si dovrebbe usare un potenziometro ma in questo caso ho eseguito una taratura utilizzando una resistenza fissa ( 2 resistenze da 10 Kohm al 5% messe in parallelo) Per lo schema di collegamento vedere il file immagine nella cartella del progetto */ const unsigned int PIN = 0; // pin a cui sarà collegato il sensore MT-03 const unsigned int BAUD_RATE = 9600; // definiamo il boud rate della porta seriale unsigned int valore = 0; // variabile intera non negativa per il valore rilevato dal sensore const int numeroled=9; // numero di led utilizzati per la barra etilometro int ledpins[]={ 0,1,2,3,4,5,6,7,8}; // array per inizializzare le uscite digitali dei led unsigned int taratura=0; void setup() { delay(30000); Serial.begin(BAUD_RATE); // apriamo la porta seriale USB e la inizializziamo a 9600 bps. taratura = analogRead(PIN); for (int led=0; led < numeroled; led++) { pinMode (ledpins[led], OUTPUT); } digitalWrite(7, HIGH); digitalWrite(8, HIGH); delay(2000); digitalWrite(7, LOW); digitalWrite(8, LOW); pinMode(PIN,INPUT); // dichiaro come ingresso il pin analogico A0 nel quale collegherò il sensore di alcool etilico MT-03 } void loop() { valore = analogRead(PIN); //in valore memorizzo la lettura proveniente da PIN che è il valore del sensore MT-3 Serial.println(valore); // stampiamo sulla Serial monitor "valore" if (valore > taratura+44 & valore < taratura+88) // si accende il primo led verde equivalente a 0,16 gr/litro di indice alcolemico { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) } else if (valore > taratura+88 & valore < taratura+132) // si accendono i 2 led verdi equivalenti a 0,33 gr/litro di indice alcolemico { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH); // turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW } else if (valore > taratura+132 & valore < taratura+176) // si accendono 3 led verdi limite alcolemico 0.5 grammi di alcool/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); } else if (valore > taratura+176 & valore < taratura+220) // si accendono 4 led (3 verdi e 1 arancione) 0,66 gr/litro (valore > 176+200 & valore < taratura+220) { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); } else if (valore > taratura+220 & valore < taratura+264) // si accendono 5 led (3 verdi e 2 arancione) 0.83 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); } else if (valore > taratura+264 & valore < taratura+308) // si accendono 6 led (3 verdi e 3 arancione) 0,99 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); } else if (valore > taratura+308 & valore < taratura+352) // si accendono 7 led (3 verdi, 3 arancione, 1 rosso) 1,16 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); } else if (valore > taratura+352 & valore < taratura+396) // si accendono 8 led (3 verdi, 3 arancione, 2 rosso) 1,32 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } else if (valore > taratura+396 & valore < taratura+440) // si accendono 9 led (3 verdi, 3 arancione, 3 rosso) 1,5 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } else if (valore > 440+taratura) // si accendono 9 led (3 verdi, 3 arancione, 3 rosso) 1,5 gr/litro { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH);// turn the LED on (HIGH is the voltage level) //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } else { digitalWrite(0, LOW); // turn the LED off by making the voltage LOW digitalWrite(1, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(2, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(3, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(5, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(6, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(7, LOW); // turn the LED on (HIGH is the voltage level) digitalWrite(8, LOW); // turn the LED on (HIGH is the voltage level) } delay(1000); // aggiungiamo un ritardo tra le letture successive di un secondo } |
Il sito è protetto da copia, se ti interessa ricevere gratuitamente lo sketch clicca qui per passare alla pagina libera da protezione. Se vuoi scrivermi utilizza il form commenti sotto, cercherò di risponderti appena possibile.
Se ti fa piacere condividi il mio articolo cliccando il bottone facebook sotto oppure il tuo social preferito, grazie.
Vai alla pagina bioarduino lab progetti con Arduino
Luca Serafini
fragolebio
Ciao,
intanto bellissimo tutorial.
Poi io avrei due domandina da farti su questo progetto. Io utilizzo, solo per disponibilità, il sensore TGS2620…questo è uguale a quello che utilizzi tu? E poi sto diventando matto per capire come fare per passare dalla tensione che su preleva con l’analog read e il valore in g/L…tu come hai fatto a calcolarti quel 62+44 o 62+88 e via dicendo? Infine non ho ancora capito per che cosa s’intende la taratura del sistema?
Grazie mille!
Ancora complimenti!
Ciao Nicolò, dando una rapida occhiata alle caratteristiche del sensore TGS2620 dovrebbe andar bene per realizzare l’etilometro. Lo hai già connesso ad Arduino facendo dei test per capire se rileva la variazione di concentrazione di alcool nell’ aria? I valori 62+44 etc corrispondono alle tarature per fare accendere i led in base alla concentrazione d’alcool gr/litro. Per tarare lo strumento ho utilizzato semplicemente la tabella degli indici alcolemici che puoi vedere appesa nei bar, la puoi scaricare dal seguente link: http://www.salute.gov.it/imgs/C_17_normativa_1861_ulterioriallegati_ulterioreallegato_1_alleg.pdf. Ho fatto un test bevendomi una birra leggera 33 cl considerando che ero a stomaco vuoto e che il mio peso è di circa 70 Kg l’indice alcolemico indicativo dopo circa 15 min dall’assunzione riscontrato dal sensore per me era di 0,18 gr/litro come specificato dalla tabella. (1 led acceso). Considerato che il valore di alcool varia in modo lineare mi sono calcolato gli altri valori per accendere i led sommando di volta in volta 44 agli intervalli successivi. Spero di esserti stato d’aiuto
Ciao a presto
Luca
Grazie mille per la risposta! Allora se ho capito bene i valori da analog Read a g/L gli hai calcolati sperimentalmente, cioè tu hai detto (per esempio): il valore che mi misura l’analog read è X e corrisponde a Y g/L…in base a questo hai trovato la quantità unitaria per multipli di grammi litro…giusto?
Grazie mille!
Perfetto, proprio cosi. Nel mio caso quindi ho definito 44 come valore che incremento di volta in volta per definire gli intervalli alcolemici e far accendere i led corrispondenti
Ciao! scusa il disturbo, io ho collegato tutto come hai mostrato tu e funziona. Solo però che all’aumentare del tempo, e quindi all’aumentare della temperatura del sensore, i valori di ppm continuano a decrescere. I tuoi dati sono inerenti a quale tempo di riscaldamento?
grazie, Federico
Ciao Federico, si io di solito lascio scaldare il sensore per qualche minuto prima di utilizzarlo.
Salve,
durnte la compilazione mi dice che la variabile ‘lt’ non è definita.
Come posso risolvere il problema?
Grazie Andrea
Ciao Andrea, che IDE usi per compilare? Forse una versione vecchia? Il sito ė protetto da copia, se mi scrivi all’ indirizzo lucaserafini@fragolebio.it ti rispondo mandandoti lo skatch direttamente cosi provi ciao Luca
ciao. avevo una domanda, essendo ignorante su questo campo volevo sapere se c’è differenza tra un modulo con sensore mq-3 e un sensore senza modulo, dal punto di vista della programmazione
grazie
Ciao Adam, dal punto di vista della programmazione non ci dovrebbero essere particolari variazioni. Se mi mandi il link del modulo con sensore visto posso essere più preciso. Ciao
Ciao, solo una domanda: il datasheet dell arduino dice che l assorbimento max totale deve essere di 200mA. Nel tuo progetto solo i 9 led assorbono circa 136 mA se sono tutti accesi, l mq-3assorbe circa 140mA più 10mA circa dell ATmega….cone fa a reggere tutto la scheda?