Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Fisica - Circuiti Elettrici , Partitore di Tensione, Semiconduttori
Scienze - Metabolismo alcohol
N
1 (4.3)
x
x̄ = i
N i=1
∑
N
1 (4.4)
ȳ = y i
N i=1
Calcolo della varianza
Se indichiamo con ∑
N
1 − 2
2
Var(X) (4.5)
= σ = (x x̄) ,
i
XX N i=1
∑
N
1 − 2
2
Var(Y (4.6)
) = σ = (y ȳ) ,
i
Y Y N i=1
le varianze delle variabili rispettivamente, queste ci forniranno un indice della
x, y
dispersione dei dati rispetto al valore medio. Inoltre si definisce covarianza la quantità
∑ ∑
N N
1 − −
Var(X, (4.7)
Y ) = σ = (x x̄) (y ȳ) ,
XY i i
N i=1 i=1
e costituisce un indice di relazione tra le variabili.
• Se Var(X, l’aumento di una variabile corrisponde all’aumento dell’altra;
Y ) > 0 40
Misura del Tasso Alcolico con Arduino pennestri.me
• Se Var(X, l’aumento di una variabile corrisponde alla diminuzione
Y ) < 0
dell’altra.
Le deviazioni standard delle due variabili misurate sono:
v
u
u ∑
√ N
1
t − 2
Sd(X) Var(X) (4.8)
= = (x x̄)
i
N i=1
v
u
u ∑
√ N
1
t − 2
Sd(Y Var(Y (4.9)
) = ) = (y ȳ)
i
N i=1
4.4 Regressione Lineare
Per procedere all’interpretazione dei dati rilevati dal sensore è necessario determinare
una relazione analitica tra le variabili (concentrazione di alcol nel sangue) e
x y
(segnale elettrico del sensore). La relazione ipotizzata per semplicità è quella lineare.
Tale ipotesi verrà comunque sottoposta ad una verifica.
Ammettendo tale ipotesi, i dati saranno legati dalla relazione: (4.10)
y = β x + β + ε (i = 1, 2, . . . , N )
i 1 i 0 i
in cui
• , sono i coefficienti incogniti della retta;
β β
0 1
• è l’errore commesso nell’approssimazione adottata.
ε
i
I suddetti coefficienti dovranno essere calcolati in maniera tale che l’errore sia il più
piccolo possibile. Si utilizzerà a tal fine il criterio dei minimi quadrati.
Per illustrare il metodo, senza perdita di generalità, assumiamo Il nostro
N = 3.
compito sarà quindi quello di calcolare i coefficienti della retta, in modo tale che la
sua distanza da tre dati punti del piano sia minima.
La quantità da minimizzare è quindi la funzione a due variabili
∑
3 − 2 (4.11)
F (β , β ) = [y (β x + β )]
0 1 i 1 i 0
i=1
21 22 23 (4.12)
= ε + ε + ε ,
41
Misura del Tasso Alcolico con Arduino pennestri.me
ovvero dF (4.13a)
=0
dβ
0
dF (4.13b)
=0
dβ
1
Le condizioni (4.13) formano un sistema lineare di equazioni la cui soluzione
fornisce i valori e incogniti. Gli sviluppi algebrici sono per brevità qui omessi,
β β
0 1
ma riportati nel programma riportato nel paragrafo 5.4 di pag. 51. Da tale
Maxima
programma otteniamo i seguenti risultati
∑
3 − −
(x x)(y y)
i
i
i=1 (4.14)
β =
1 ∑
3 − 2
(x x)
i
i=1
viste le (4.5) e (4.7), l’equazione (4.14) può essere riscritta in maniera più generale
come σ
XY (4.15a)
β =
1 2
σ
XX
− (4.15b)
β = y β x
0 1
42
Misura del Tasso Alcolico con Arduino pennestri.me
4.5 Applicazione Numerica
Il metodo di calcolo descritto nel paragrafo 4.4, è stato applicato grazie alla disponibi-
lità della procedura della libreria matematica in linguaggio
curve_Dist fit python
La libreria è disponibile alla pagina web:
scipy.
http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.
I dati sperimentali riassunti nella Tabella 4.1 mettono in relazione
curve_fit.html.
differenza di potenziale generata dal sensore e concentrazione di alcohol nel sangue,
provengono dai grafici delle Figure 4.4 - 4.9.
Tabella 4.1: Dati Sperimentali per Calibrazione attraverso Regressione Lineare
Differenza Concentrazione
Potenziale (V) (g/l)
2.92 0.50
3.15 0.75
3.29 1.10
3.50 1.50
3.81 1.90
Con i dati a disposizione, la retta di regressione ha equazione (4.16)
y = 0.59843 x + 2.64581 .
4.10 riporta, per un confronto, sia i dati sperimentali, che la curva di
La Figura
calibrazione. 43
Misura del Tasso Alcolico con Arduino pennestri.me
Lineare
Sperimentali 2.00
Regressione Ethilometer
Valori 1.75
1.50 Smart
(g/l) dello
Alcohol
1.25
Calibrazione Calibrazione
Concentrazione
1.00 di
di Curva
Curva 0.75 4.10:
Figura
0.50
0.25
4.00 3.75 3.50 3.25 3.00
(V) Volt
44
Capitolo 5
Programmi Sviluppati
In questo capitolo vengono riportati tutti i codici da me sviluppati nell’ambito del
progetto .
Smart Ethilometer
Possiamo individuare due categorie di programmi:
• quelli destinati all’acquisizione e all’elaborazione dei dati;
• quelli relativi alla gestione della scheda Arduino.
5.1 Codice Arduino per Calibrazione del Sensore
/*
1 Author : Pietro Pennestri '
Mail: pietro . pennestri@gmail .com
3 Website : http :// www. pennestri .me
Date: May 2nd 2015
5 Description :
7 Calibration of an MQ3 shield on arduino board .
The voltage is displayed when the sensor is exposed at a known
9 alcohol concentration .
Temperature is also recorded for future adjustments .
*/
11 int mq3 _analogPin = A5; // connected to the output pin of MQ3
13 int val;
int tempPin = 1;
15 45
Misura del Tasso Alcolico con Arduino pennestri.me
unsigned long time;
unsigned long time_in_second ;
17 void setup (){
Serial . begin (9600); // open serial at 9600 bps
19 }
21 void loop ()
{
23 // give ample warmup time for readings to stabilize
float arduino_voltage = 5 ;
25 int mq3 _value = analogRead (mq3 _analogPin );
float voltage = mq3 _value * ( arduino_voltage / 1023 .0 );
27 // get temperature
29 val = analogRead ( tempPin );
float mv = ( val/1024 .0 )*5000;
31 float temperature = mv/10; // celsius
33 // tieme
time = millis ();
35 time_in_second = time/1000 ;
37 // Serial .print (" Voltage =");
Serial . print ( voltage );
39 Serial . print ("*");
// Serial .print (" Temperature (C): ");
41 Serial . print ( temperature );
Serial . print ("*");
43 // Serial .print (" Time(S): ");
Serial . print ( time_in_second );
45 Serial . print ("\n");
47 delay (1000); // slow down output
}
49 46
Misura del Tasso Alcolico con Arduino pennestri.me
5.2 Acquisizione Dati Attraverso
Porta Seriale
Il codice di seguito riportato, sviluppato per un PC con sistema operativo
Python
Microsoft, permette di acquisire, decodificare e memorizzare su file le stringhe di
dati inviate dalla scheda Arduino, programmata in con il codice già
Processing,
illustrato nel paragrafo 5.1. Le acquisizione eseguite sono 60, che corrispondono ad
un intervallo di tempo di circa 60 secondi.
"""
1 Created on Sat May 02 16:09:30 2015
3 @Author : Pietro Pennestri '
@mail : pietro . pennestri@gmail .com
5 @website : http :// www. pennestri .me
"""
7 import serial
import numpy as np
9 import matplotlib . pyplot as plt
plt.close ("all")
11 output_file_name ='res.dat '
13 val_max = 60 # define maximum number of aquision lines
com_port ='COM9 ' # define COM port
15 baud_rate =9600 # define baud rate speed (same as Arduino board )
17 ser = serial . Serial (com_port , baud_rate , timeout =40) # define COM
Port
i=0
19 volt_array = np. array ([])
21 # temperature_array = np.array ([])
temperature_array = np. array ([])
23 time_array = np. array ([])
25 text_file = open ( output_file_name , 'w') # create dat file
27 while i < val_max :
line = ser. readline ()
29 voltage , temperature , time = line.split ('*')
47
Misura del Tasso Alcolico con Arduino pennestri.me
31 #np. concatenate (( volt_array , float ( voltage )),axis =0)
volt_array =np. append ( volt_array , [ float ( voltage )])
33 temperature_array = np. append ( temperature_array ,[ float (
temperature )])
time_array = np. append (time_array ,[ float (time)])
35 # write in res.dat
37 text_file . write ( voltage + ' ')
text_file . write ( temperature + ' ')
39 text_file . write (time)
41 i = i + 1
print voltage , temperature , time
43 print volt_array
print time_array
45 ser.close () # close COM port
text_file . close () # close file
47 plt. figure ()
49 plt.plot( time_array , volt_array , linewidth =2.0)
plt.plot( time_array , volt_array ,'ro ')
51 plt. xlabel ('Time (s)')
plt. ylabel ('Voltage (V)')
53 plt.grid ()
plt.show ()
55 48
Misura del Tasso Alcolico con Arduino pennestri.me
5.3 Curva di Calibrazione
# -*- coding : utf -8 -*-
1 """
Created on Thu May 28 18:24:59 2015
3 @author : pietro
5 @website :http :// pennestri .me
@mail : pietro . pennestri@gmail .com
7 """
9 import matplotlib . pyplot as plt
import numpy as np
11 import math
from scipy . optimize import curve_fit
13 plt.close ("all")
15 ydata = np.array ([0.5 ,0.75 ,1.1 ,1.5 ,1.9])
xdata = np.array ([2.92 ,3.15 ,3.29 ,3.5 ,3.81])
17 num_elements =len( xdata )
19 def func(x, a, b):
return a*x+ b
21 #
# curve_fit : Math procedure of the scipy math library
23 # popt:
# Optimal values for the parameters so
25 #that the sum of the squared error of
# (func - ydata )^2 is minimized
27 # pcov:
# The diagonals of pcov provide the variance
29 # of the parameter estimate
31 popt , pcov = curve_fit (func , xdata , ydata )
print popt
33 a=popt [0]
35 b=popt [1]
37 # error 49
Misura del Tasso Alcolico con Arduino pennestri.me
k=0
39 s=0
for x in xdata :
41 y=func(x,a,b)
s=s+(y-ydata [k]) **2
43 k=k+1
s=math.sqrt(s/ num_elements )
45 print " Square root of sum of squares of residuals =",s
47 print '------'
print pcov
49 plt. figure ()
plt.plot(xdata , ydata , 'ko ', label =" Original Data")
51 plt.plot(xdata , func(xdata , *popt), 'r-', label =" Fitted Curve ")
plt. xlabel ('Arduino voltage (V)')
53 plt. ylabel ('Alcohol concentration (mg/l)')
plt.grid ()