Torna al Thread
Public Class Form1
Dim tcom As Single ' Dato proveniente della seriale
Dim temp As Integer ' Dato convertito da mostrare sulla ProgressBar
Dim cont As Integer ' Contatore
Dim tref As Single ' Temperatura di riferimento (utilizzata nel codice di calcolo della temperatura da mostrare)
Dim vtemp(0 To 15) As Single ' Vettore contenente 16 misurazioni di temperatura, da cui verrà estratta la temp media
Dim app As Single ' Variabile ausiliaria, utilizzata per l'ordinamento del vettore
Dim scal As String ' Scala di misurazione (°C, °F o °K)
Dim dato As String ' dato letto dalla COM
Dim Rx$ ' Stringa utilizzata x la lettura dei dati
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Termometro.Minimum = 0 ' Valore minimo di default della ProgressBar
Termometro.Maximum = 500 ' Valore di fondo scala di default (100°C * 5, in modo da visualizzare anche valori frazionari)
Termometro.Value = 0 ' Inizializzazione della temperatura mostrata sul termometro
SerialPort1.PortName = "COM1"
SerialPort1.BaudRate = 1200 ' Dati inviati con uno standard RS-232 1200 baud, 8 bit, 1 bit di stop, nessuna parità
SerialPort1.Open()
cont = 0 ' Inizializzazione contatore
End Sub
Private Sub Celsius_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Celsius.Click ' Radio Button "Celsius" cliccato:
Out_Res.Text = "set" ' Aggiornamento label della temperatura indicata
Termometro.Minimum = 0 ' Valore minimo di scala
Termometro.Maximum = 500 ' Valore di fondo scala * 5
scal = "°C" ' Unità di misura da visualizzare
temp = tcom * 5 ' Temperatura da visualizzare sulla ProgressBar (0 - 100 °C)
Termometro.Value = temp ' Aggiornamento termometro
Out_Res.Text = tcom & scal ' Aggiornamento label di temperatura
End Sub
Private Sub Fahrenheit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Fahrenheit.CheckedChanged
Out_Res.Text = "set"
Termometro.Minimum = 32 * 5
Termometro.Maximum = 212 * 5
scal = "°F"
temp = ((tcom * 1.8) + 32) * 5 ' Conversione del dato in Fahrenheit
Termometro.Value = temp
Out_Res.Text = ((tcom * 1.8) + 32) & scal
End Sub
Private Sub Kelvin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Kelvin.CheckedChanged
Out_Res.Text = "set"
scal = "°K"
temp = (tcom + 273.15) * 5
Out_Res.Text = tcom + 237.15 & scal ' conversione del dato in Kelvin
Termometro.Minimum = 273.15 * 5
Termometro.Maximum = 373 * 5
Termometro.Value = temp
End Sub
' Ogni secondo, un timer controlla la COM, leggendone i dati presenti ed aggiornando il form
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Rx$ = SerialPort1.ReadChar ' Legge un dato dalla COM - Genera un errore IOException non gestito.
If Len(Rx$) Then ' Se ci sono dati letti...
dato = Rx$ ' Copia il carattere letto...
If dato = "" Then GoTo Fine ' e, se non ci sono stati errori nel frattempo...
dato = Val(Asc(dato)) ' Trasforma il carattere letto nel corrispondente valore ASCII e ne assegna il numero alla variabile Dato
tcom = dato * 0.0195 * 20 ' Calcola la temperatura (i valori sono legati alla natura del circuito)
If cont < 16 Then ' Se il contatore è < 16...
vtemp(cont) = tcom ' Mette nell'array delle temperature il nuovo valore arrivato...
cont += 1 ' ed incrementa il contatore.
End If
If cont = 16 Then ' Se il contatore è 16 (l'array è pieno)...
For k = 0 To 14
For j = (k + 1) To 15
If vtemp(k) > vtemp(j) Then ' Ordino l'array, disponendo le temperature in ordine crescente
app = vtemp(k)
vtemp(k) = vtemp(j)
vtemp(j) = app
End If
Next j
Next k
cont = 17 ' Incremento ancora il contatore
End If
tref = vtemp(8) ' Prendo come temperatura di riferimento, il valore medio misurato
If cont = 17 Then ' Se il contatore è 17...
If tcom >= (tref + 2) Or tcom <= (tref - 2) Then ' Controlla che l'attuale valore misurato non sia troppo distante dal valore di riferimento
GoTo Fine ' Se non è troppo distante, tiene il valore medio ed esce dalla subroutine
Else
tref = tcom ' Altrimenti prende il nuovo valore misurato come temperatura da visualizzare e prosegue
End If
End If
If Celsius.Checked Then ' Controlla la scala selezionata e setta l'unità di misura di conseguenza; poi converte il dato.
scal = "°C"
temp = tcom
ElseIf Fahrenheit.Checked Then
scal = "°F"
temp = ((tcom * 1.8) + 32)
Else
scal = "°K"
temp = (tcom + 273.15)
End If
Out_Res.Text = temp & scal ' Scrive temperatura e scala sul label...
Termometro.Value = temp * 5 ' Aggiorna la ProgressBar ed esce dalla subroutine
End If
Fine:
End Sub
End Class