[1/2]
http://www.gruppodab.it/public/press-area/libretto-musei-V04-def.pdf
Protezione di Opere d’arte
Videosorveglianza
all’aperto ed aree archeologiche
Anti
intrusione
Sistema di
Sistema di
Controllo
rivelazione e
visitatori
spegnimento
incendio
060610
Sistema di
Monitoraggio
ambientale
Antifurto
Sistema di supervisione
degli impianti tecnologici
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
Controllo
accessi
1
[2/2]
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
2
PROBLEMA:
PROBLEMA Monitorare una grandezza fisica.
 Perchè?
...necessita’ concreta
 Cosa serve?
...idea semplice
 Come?
...strumenti H/W e S/W
Idea
S/W
Problema
Problema
H/W
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
3
Cosa serve? ...idea semplice
1. Trasduttore da Grandezza Fisica a Grandezza Elettrica
per la misura della G.F.
2. Dispositivo di Conversione
da Grandezza Analogica a Grandezza Digitale (A.D.C.)
3. Calibrazione tra G.D. e G.F.
4. Circuito Digitale per la lettura
dei valori misurati e convertiti in digitale da ADC
5. Trasferire in un PC i Valori digitali misurati
6. Ad ogni valore misurato va associato l’istante di misura t
7. Salvare in memoria
tutti i valori misurati ed il relativo istante di misura in un File
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
4
Principio base di un sistema di controllo
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
5
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
6
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
7
...idea semplice per monitorare la temperatura
H/W:
Sensore di temperatura
Multimetro Digitale
PC
S/W:
S/W
1. Inviare i comandi attraverso la linea seriale
2. Ricevere i dati misurati attraverso la linea seriale
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
8
Multimetro Digitale: FLUKE45
Sensore di temperatura: LM35
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
9
Vario il duty-cycle del segnale pilota
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
10
Possibile approccio per monitorare in automatico la Temp.
senza richiedere l’intervento diretto dell’uomo per ogni singolo passo:
1. Inviare il comando attraverso la linea seriale
2. Ricevere il dato misurato attraverso la linea seriale
3. Registrare il dato misurato
 utilizzo di un software (insieme di linee di comando )
residente nel PC eseguito passo dopo passo
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
11
Il linguaggio PYTHON nasce nel 1990:
il padre e’ Guido van Rossum che all’epoca era un fan di
un gruppo di comici inglesi famosi sulla BBC per
“Monty Python's Flying Circus” .
Quindi, il nome non sta per PITONE...
Il sito ufficiale e’
http://www.python.org
Si tratta di un linguaggio interpretato anche se molte implementazioni
lo compilano per motivi di efficienza):
si puo` interagire con una macchina virtuale Python in maniera interattiva.
L'esecuzione avviene attraverso l'interprete python, di cui sono disponibili
pacchetti di istallazione per le varie distribuzioni di software esistenti.
Una caratteristica di Python e’ la sua Portabilita’ da una piattaforma con un
Sistema Operativo ad un altro diverso.
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
12
Cosa vuol dire linguaggio “interpretato”?
Un linguaggio interpretato è un linguaggio di programmazione i cui programmi
vengono eseguiti da un altro programma chiamato interprete.
A differenza di un interprete, un compilatore non esegue il programma che
riceve in ingresso, ma lo traduce in linguaggio macchina memorizzando su file il
codice oggetto pronto per l’esecuzione diretta da parte del processore.
L’interprete, che esegue ogni riga del nostro codice, varia a seconda del
processore nel computer, per cui ciò che noi scriviamo nel nostro programma
viene interpretato in base all'architettura.
In questo modo viene garantita la portabilità del codice, ovvero la
possibilità di poter far funzionare su tutti i computer che abbiano
installato l’interprete il nostro programma.
In generale, un linguaggio interpretato può presentare uno svantaggio: risultare
più lento del codice compilato, perchè viene interpretata ogni singola istruzione.
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
13
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
14
Prompt dell’interprete Python: >>>
Assegnazione: si usa l'operatore =
# questo carattere rappresenta l'inizio di un commento
Esempio: Python come calcolatrice
>>> 2+2
4
>>> 10 / 3 # divisione intera
3
>>> (50-5*6)/4 # a comment
5
>>> width = 20
>>> height = 5*9
>>> width * height
900
>>> x = y = z = 0 # Zero x, y and z
>>> # Floating point
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
15
In Python, non vengono utilizzati caratteri speciali per distinguere il
tipo di variabile!
…se si utilizza lo stesso nome per una nuova
variabile, viene sovrascritto il contenuto della
variabile precedente!
Il tipo di dato non deve essere dichiarato esplicitamente
Esempio: definizione di variabili...non serve dichiararle all’inizio
>>> pippo = 7
Viene creata una variabile pippo, di tipo intero, contenente il valore 7
>>> pippo = 5.5
pippo e` divenuta una variabile reale...
>>> a = b = c = 0
sia a che b che c assumono il valore 0
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
16
Esempio: stringhe e concatenazioni tra stringhe
Esempio: slice di una stringa
>>> messaggio = "aiuto! "
>>> x = "casa"
>>> “Al fuoco! ” + messaggio
Al fuoco! aiuto!
>>> messaggio * 7
'aiuto! aiuto! aiuto! aiuto! aiuto! aiuto! aiuto! '
>>> messaggio * 0
' ' # stringa vuota
>>> x[:2]
'ca'
>>> x[2:]
'sa'
| c| a| s| a|
| 0| 1| 2| 3| 4
|-4|-3|-2|-1|
>>> x[:]
'casa'
>>> x[-2] # anche all'indietro!
's'
>>> len(x) # lunghezza di una stringa
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
17
Una particolarita’ del linguaggio Python:
in generale un blocco e` delimitato
per mezzo della indentazione!
Si posso usare spazi o tab, basta che siano lo stesso numero.
Esempio: istruzione while
a, b = 0, 1
# assegnamento con tupla (detto multiplo)!
while b < 10:
print b, # "," serve ad evitare \n finale
a, b = b, a+b
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
18
Esempio: istruzione if
Esempio: istruzione if
if cond1:
x = 25
if x > 50:
y=1
elif x < 30:
y=2
else:
y=3
if x > 10: print 'OK'
else: print 'NO'
# cond1 vera
elif cond2:
# cond2 vera
elif cond3:
# cond3 vera
...
else :
# nemmeno una vera!
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
19
Esempio: istruzione for
>>> for x in (0,1,2):
print x**2
0
1
4
>>> range(3)
[0, 1, 2]
>>> for x in range(3):
print x**2
0
1
4
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
20
fluke45_IDN.py
print "..............................................."
import serial
fluke45=serial.Serial('COM7',9600)
fluke45.flush()
fluke45.write('*IDN?\r')
print fluke45.read(41)
print "................................................"
fluke45.close()
fluke45_VAL_mod.py
print "..............................................."
#
import serial
fluke45=serial.Serial('COM9', 9600)
j=1
#
while j<3:
Fluke45_VAL.py
fluke45.flush()
IDLE 1.2.1
fluke45.write('VAL?\r')
>>> import serial
x1 = fluke45.read(6)
>>> fluke45 = serial.Serial('com5',9600)
x2 = fluke45.read(8)
>>> fluke45.flush()
x3 = fluke45.read(2)
>>> fluke45.write('VAL?\r')
print x1, x2, x3
>>> print fluke45.read(9)
j=j+1
-1E+9
#
=>
print "..............................................."
>>>
fluke45.close()
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
21
uscita-su-finestra-da-prova_290510.txt
from datetime import date
print date.today()
import time
print time.ctime()
d = time.gmtime()
print d
print d.tm_min
2010-05-29
Sat May 29 19:44:09 2010
time.struct_time(tm_year=2010,
tm_mon=5, tm_mday=29,
tm_hour=17, tm_min=44,
tm_sec=9, tm_wday=5,
tm_yday=149, tm_isdst=0)
44
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
22
prova_010610.py
k=0
j=1
secondi0=0
while 1:
import serial
fluke45 = serial.Serial('COM4',9600)
fluke45.flush()
fluke45.write('VAL?\r')
x1=fluke45.read(10)
j=j+1
import time
'scegliere o localtime o gmtime'
d = time.localtime()
secondi = d.tm_sec
fluke45.close()
if (secondi - secondi0) == 1 :
k = k+1
print secondi , ";",k, ";",x1
secondi0 = secondi
if j == 100 :
break
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
23
prova2_010610.py
import time
'scegliere o localtime o gmtime'
d = time.localtime()
j=j+1
import time
'scegliere o localtime o gmtime'
d = time.localtime()
ora0 = d.tm_hour
minuti0 = d.tm_min
minuti0 = minuti0 + ora0*60
k=0
j=1
secondi0=0
while 1:
secondi = d.tm_sec
minuti = d.tm_min
ora = d.tm_hour
import serial
fluke45 = serial.Serial('COM4',9600)
fluke45.flush()
fluke45.write('VAL?\r')
x1=fluke45.read(10)
fluke45.close()
060610
if (secondi - secondi0) == 1 :
k = k+1
print secondi , ";",k, ";",x1
secondi0 = secondi
if ((minuti + ora*60)-minuti0) == 1 :
break
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
24
prova_020610.py
[1/2]
durata_daq = input("inserire durata totale acquisizione in minuti: ");
print durata_daq;
import time
'scegliere o localtime o gmtime'
d = time.localtime()
ora0 = d.tm_hour
minuti0 = d.tm_min
minuti0 = minuti0 + ora0*60
k=0
j=1
secondi0=0
while 1:
import serial
fluke45 = serial.Serial('COM5',9600)
fluke45.flush()
fluke45.write('VAL?\r')
x1=fluke45.read(10)
fluke45.close()
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
25
prova_020610.py
[2/2]
j=j+1
import time
'scegliere o localtime o gmtime'
d = time.localtime()
secondi = d.tm_sec
minuti = d.tm_min
ora = d.tm_hour
if (secondi - secondi0) == 1 :
k = k+1
print k, ";",x1
secondi0 = secondi
if ((minuti + ora*60)-minuti0) == durata_daq :
break
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
26
prova2_020610.py
[1/2]
durata_daq = input("inserire durata totale
acquisizione in minuti: ");
print durata_daq;
pluto = open('F:\misure.txt','w')
import time
'scegliere o localtime o gmtime'
d = time.localtime()
ora0 = d.tm_hour
minuti0 = d.tm_min
minuti0 = minuti0 + ora0*60
k=0
j=1
secondi0=0
while 1:
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
27
prova2_020610.py
[2/2]
import serial
fluke45 =
serial.Serial('COM5',9600)
fluke45.flush()
fluke45.write('VAL?\r')
x1=fluke45.read(10)
fluke45.close()
j=j+1
import time
'scegliere o localtime o gmtime'
d = time.localtime()
secondi = d.tm_sec
minuti = d.tm_min
ora = d.tm_hour
if (secondi - secondi0) == 1 :
k = k+1
print k, ";",x1
pluto.write(str(k)+';'+str(x1))
secondi0 = secondi
misura.txt
2;12345
3;12345
4;12345
5;12345
if ((minuti + ora*60)-minuti0) == durata_daq :
pluto.close()
break
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
28
F
L
U
K
E
4
5
+
R
S
2
3
2
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
29
[1
/
4]
FLUKE45 + USB/RS232
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
[2a/4]
30
FLUKE45 + USB/RS232
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
[2b/4]
31
FLUKE45 + USB/RS232 + Python
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
[3/4]
32
Python + SerialUSB/RS232
060610
Lab. Mis. An. Dati (LS in BB-CC)
AA209/2010
[4/4]
33
Scarica

(DAQ) per BB-CC