Acquisizione della temperatura
Interfaccia Centronics
Software in Visual Basic 6
Amplificatore Operazionale TL081, Sensore di temperatura AD590, Convertitore ADC 0804. Connettore Centronics.
Descrizione
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.
Come interfaccia al Computer si suppone di utilizzare quella descritta nel paragrafo 7.4 del capitolo 9.
· 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 e trasforma il dato digitale D, compreso tra 0 e 255, in un numero variabile tra 0 e 50 applicando la formula: D·50/255.
Nella seguente figura si mostra la schermata relativa al form utilizzato per la realizzazione del programma.
Sul form sono presenti:
· 6 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.
· 2 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.
· 1 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.
· 1 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.
· 1 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 la variabile 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 = "Inserire 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 installa 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.
Proposta di lavoro. Modificare l’hardware e il software secondo le seguenti specifiche:
· Se la temperatura ambiente risulta inferiore a T = Tmin (ad esempio 8°C), la linea STROBE deve portarsi al livello alto ed attivare, tramite circuito di potenza a relè, un impianto di riscaldamento;
· Se la temperatura ambiente risulta superiore a T = Tmax ( ad esempio 28°C), la linea AF deve portarsi al livello alto ed attivare, tramite circuito di potenza a relè, un impianto di raffreddamento;
In condizioni normali entrambi gli impianti devono essere disattivati.
Si ricordi che STROBE e AF lavorano in logica negativa.