Schema elettrico:
Circuito
di Condizionamento

Interfaccia
Centronics
Elenco componenti
Amplificatore
Operazionale TL081, Sensore di temperatura AD 590, Convertitore ADC
0804. Connettore Centronics.
Per l’acquisizione
della temperatura si fa uso del sensore AD590 che fornisce una corrente
IS proporzionale alla temperatura ambiente T espressa in
gradi Kelvin.
La risposta del sensore
è lineare con: IS
= K·T e K = 1µA/°K.
L’amplificatore
operazionale, connesso come convertitore corrente/tensione, consente di
produrre in uscita una tensione variabile tra 0 e 5V quando la
temperatura ambiente varia tra 0°C e 50°C.
Il potenziometro da
100K deve essere regolato fino ad ottenere il valore:
R1 = 43.95
K.
Si avrà che :
·
Per t = 0°C si ha: T = 273°K ; IS = 273µA. I1
= VCC/R1= 273µA.
In tal caso I2 =
IS – I1 = 0 e quindi: VO =R2·I2
=0.
·
Per t = 50°C si ha: T = 323°K ; IS = 323µA.
I2 = IS – I1 = 50µA.
per cui: VO = R2·I2
= 5 V.
Il convertitore ADC
0804, configurato in free-running mode, converte in digitale la
tensione VO fornendo un numero binario variabile tra 0 e 255.
Gli otto bit di uscita
dell’ADC sono collegati ai corrispondenti bit DATA IN
dell’interfaccia Centronics.
Il software acquisisce
ad intervalli regolari il codice di uscita dell’ADC.
Nella seguente figura
si mostra la schermata relativa al form utilizzato per la
realizzazione del programma.

Sul form sono
presenti:
·
Sei CommandButton con proprietà Name posta come:
cmdStart, cmdStop, cmdCalcola, cmdUscita, cmdSalvaFile e cmdLeggiFile.
La proprietà Caption vale rispettivamente: Start, Stop,
Calcola, Uscita, Salva Dati e Leggi Dati.
·
Due ListBox con proprietà Name poste come:
lstDataOra e lstLetture.. Sopra le due ListBox sono inserire 2 Label
denominate: lblDataOra e lblLetture con proprietà captino
rispettivamente poste a Data e ora di Acquisizione e Lettura
Temperature.
·
Un Frame con Caption = Risultati entro cui
sono inserite 3 Label vuote di colore bianco denominate lblMinima,
lblMassima e lblMedia dove depositare i risultati delle elaborazioni.
Sulla sinistra di tali Label sono poste altre 3 Label di commento.
·
Una Label denominata lblConta con proprietà Caption
= 0 è posta tra i pulsanti ed ha il compito di indicare il numero di
letture che si devono ancora effettuare per terminare l’acquisizione.
·
Un Timer, denominato Timer1, con proprietà Interval =
1000 Tale valore può essere variato alla partenza del programma.
Il programma si
compone di 8 subroutine.
·
Form_Load. Si attiva al caricamento del programma e
consente di definire l’inizializzazione dei vari oggetti presenti sul
form. In particolare
disabilita il Timer e azzera la lista della data e quella dei dati di
lettura.
·
cmdStart. E’
richiamata con un click sul pulsante di Start. Imposta i parametri di due Input Box
che richiedono l’immissione dell’intervallo di tempo tra due
acquisizioni e il numero totale di acquisizioni. Inoltre viene abilitato
l’evento Timer e azzerate le liste e le Label.
·
cmdStop. E’ richiamata con un click sul pulsante
di Stop. Disabilita il Timer e pone num = i
in modo da poter effettuare correttamente i calcoli relativi alla
temperatura minima massima e media.
·
cmdUscita. Un click sul pulsante Uscita
termina l’esecuzione del programma.
·
Timer1_Timer(). Scatena
l’evento Timer ad intervalli di tempo regolari. Il dato numerico
relativo alla temperatura acquisita e l’istante di acquisizione sono
memorizzati in due liste. Al termine dell’acquisizione il Timer viene
disabilitato.
·
CmdCalcola. E’ richiamata con un click sul
pulsante di Calcola. Consente di calcolare il valore relativo
alla temperatura minima e massima acquisita e il valore medio,
·
cmdSalvaFile. Genera un file sequenziale nella
cartella Documenti di nome Temperatura.txt entro cui vengono salvati i
dati di temperatura acquisiti.
·
cmdLeggiFile. Cancella le liste e legge i
valori memorizzati nel file Temperatura.txt. Inoltre effettua dei
controlli su eventuali errori.
Listato del
programma in Visual Basic
‘Dichiarazioni generali
Option Explicit
Dim num, i, Risposta As Integer
Private Sub Form_Load()
lblLetture.Caption = "Lettura
Temperature"
lblDataOra.Caption = "Data e
Ora di Acquisizione"
Timer1.Enabled = False
lstLetture.Clear
lstDataOra.Clear
End Sub
Private Sub cmdStart_Click()
lblLetture.Caption = "Lettura
Temperature"
Dim Titolo1, Domanda1,
Tempo_Proposto As String
Dim Titolo2, Domanda2,
Numero_Letture_Proposte As String
Dim Tempo As Single
Titolo1 = "Intervallo di
campionamento della temperatura"
Domanda1 = "Iserire il tempo
di campionamento in sec."
Tempo_Proposto = "1"
Tempo = Val(InputBox(Domanda1,
Titolo1, Tempo_Proposto))
Titolo2 = "Numero di
letture"
Domanda2 = "Inserire il numero
di letture"
Numero_Letture_Proposte =
"10"
num = Val(InputBox(Domanda2,
Titolo2, Numero_Letture_Proposte))
i = 0
lstLetture.Clear
lstDataOra.Clear
lblMedia.Caption = ""
lblMassima.Caption = ""
lblMinima.Caption = ""
Timer1.Interval = Tempo * 1000
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
'Abilita Centronics come Input
Out (890), 32
i = i + 1
lblConta.Caption = num - i
'Trasforma i dati numerici
acquisiti 0-255 nell'intervallo 0 - 50°C
lstLetture.AddItem Format$(Inp(888) * 50 / 255, "Fixed")
lstDataOra.AddItem Now()
If i = num Then
Timer1.Enabled = False
Risposta = MsgBox("Sono stati
acquisiti " & i & " valori", vbInformation +
vbOKOnly, "Fine Acquisizione")
End If
End Sub
Private Sub cmdStop_Click()
Timer1.Enabled = False
num = i
Risposta = MsgBox("Sono stati
acquisiti " & i & " valori", vbInformation +
vbOKOnly, "Fine Acquisizione")
End Sub
Private Sub cmdCalcola_Click()
Dim somma, media, massima, minima
As Single
somma = 0
massima = 0
minima = 50
i = 0
Do While i < num
somma = somma + CSng(lstLetture.List(i))
If CSng(lstLetture.List(i))
> massima Then massima = CSng(lstLetture.List(i))
If CSng(lstLetture.List(i))
< minima Then minima = CSng(lstLetture.List(i))
i = i + 1
Loop
media = somma / num
lblMedia.Caption = Format$(media,
"Fixed")
lblMassima.Caption = Format$(massima,
"Fixed")
lblMinima.Caption = Format(minima,
"Fixed")
End Sub
Private Sub CmdUscita_Click()
Risposta = MsgBox("Sei Sicuro?
", vbOKCancel,
"Uscita")
If Risposta = vbOK Then End
End Sub
Private Sub cmdSalvaFile_Click()
Open "C:\Documenti\Temperatura.txt" For Output As #1
For i = 0 To
num - 1
Write #1, lstDataOra.List(i), CSng(lstLetture.List(i))
Next i
Close #1
Risposta = MsgBox("Dati
salvati correttamente", vbOKOnly, "Salvataggio")
End Sub
Private Sub cmdLeggiFile_Click()
Dim Temperatura As Single
Dim Tempo As String
On Error GoTo Errore
lstLetture.Clear
lstDataOra.Clear
lblLetture.Caption = "Lettura
Dati da File"
Open "C:\Documenti\Temperatura.txt" For Input As #1
i = 0
Do While Not
EOF(1)
i
= i + 1
Input #1, Tempo,
Temperatura
lstDataOra.AddItem Tempo
lstLetture.AddItem Format$(Temperatura, "Fixed")
Loop
num = i
Close #1
Risposta = MsgBox("Dati letti
correttamente", vbOKOnly, "Lettura File")
Exit Sub
Errore:
Risposta = MsgBox("Errore
n." & Err.Number & Chr(13) & Err.Description, vbOKOnly
+ vbCritical, "Attenzione")
End Sub
Si riporta la schermata
del programma in esecuzione.

Per concludere, si
vuole ricordare che, come già descritto nel Cap.IX, affinché il
programma funzioni correttamente è necessario caricare nella cartella
C:\Windows\System il file inpout32.dll e inserire nel progetto
Visual Basic il modulo Inpout.bas di seguito riportato:
Public Declare Function Inp Lib "inpout32.dll" _
Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" _
Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As
Integer)
Per costruire il modulo
è sufficiente scrivere il precedente codice con un editor di testi,
come il Blocco Note di Windows, e salvare il file con il nome Inpout.bas
Per questo particolare
progetto il programma in VB è costituito da un solo form per cui
non è indispensabile generare il modulo Inpout.bas ma è sufficiente
inserire nelle dichiarazioni generali del form il precedente
codice con l’accortezza di dichiarare le funzioni private, come di
seguito riportato.
Private Declare Function Inp Lib "inpout32.dll" _
Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" _
Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As
Integer)
Nel caso in cui si
opera in ambiente Windows 2000, 2000XP o NT è necessario utilizzare
degli opportuni componenti. Tali componenti sono disponibile
gratuitamente sul sito Internet www.driverlinx.com. Attivando il
download si può scaricare il file Windows 95NT PortI/O driver
che consente di caricare il file port95nt.exe che istalla
automaticamente diversi file tra cui:
·
DLPortIO.DLL
-- Win32 DLL hardware I/O functions
·
DLPortIO.BAS
-- Visual Basic interface to DLPortIO.DLL
·
DLPortIO.SYS
-- Kernel mode driver for WinNT
(non necessario per
Win95)
In questo caso nel
progetto VB si deve inserire il modulo DLPortIO.BAS
e le istruzione di Input e Output devono avere il seguente
formato:
·
Value =
DlPortReadPortUchar(Addr)
·
DlPortWritePortUchar
(Addr), Value
Dove Addr è
l’indirizzo della porta, ad esempio 888, e Value è il valore
in decimale in lettura o in scrittura.