Bygg din egen termometer
Förord
Visst skulle det vara kul att koppla en termometer till datorn? Du skulle kunna mäta temperaturen inne, ute, i datorn, i serverrummet, ja var som helst faktiskt! (nåja, nästan i alla fall). Tillhör du även dom som tycker det är extra roligt att ha gjort något själv? Då är detta artikeln för dej! I artikeln ska jag först gå igenom hur man kopplar in en temperaturgivare till datorn och sedan hur man bygger ett enkelt program för att läsa av temperaturen.Innehåll
»Komponenter
Detta behöver du:
Komponent | Produktnummer hos Elfa | Pris hos Elfa (exkl moms) |
SMARTEC SMT 160-30 | 73-088-69 | 52:80 |
D-Sub 25-polig hane | 44-055-77 | 12:70 |
Kåpa till D-Sub 25-polig | 44-093-71 | 15:00 |
Kabel, minst 3 ledare |
SMARTEC-kapseln är alltså en temperatursensor med inbyggd pulsbreddsmodulator, det innebär att pulserna som kretsen ger ifrån sig bli längre ju varmare det är. Se produktens
Inkoppling
Kablarna ansluts lämpligen genom lödning. Var noggrann och kontrollera att det blir ordentlig kontakt och att inget ledande ligger mot något annat ledande. Fötterna på SMT160-30-kapseln bör isoleras med krympslag eller tejp.
Som bilden visar finns matningsspänning på stift 1 och GND på stift 25. Stiftens numrering finns oftast på kontakten, om de inte gör det så har den övre raden stift 13 – 1 och den nedre raden 25 – 14 om man ser kontakten från sidan man löder på. Utsignalen från kapsel ska anslutas på pinne 2-13 eller 15, du kan alltså ha upp till 13 enheter anslutna samtidigt.
Drivrutin
För att kunna kommunicera med sensorn som sitter på parallellporten måste man ha en drivrutin. En bra sådan är Port I/O Driver från
Programexempel
För att underlätta avläsning av temperaturen har jag skrivit en klass, cTempSensor, för detta, den kan du hämta här.
Option Explicit
Private Declare Function DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte
Private Declare Sub DlPortWritePortUchar Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Byte)
Public Enum enumPort
LPT1 = &H378
LPT2 = &H278
LPT3 = &H3BC
End Enum
Public Enum enumPin
Pin2
Pin3
Pin4
Pin5
Pin6
Pin7
Pin8
Pin9
Pin10
Pin11
Pin12
Pin13
Pin15
End Enum
Public Function GetTemp(ByVal Port As enumPort, ByVal Pin As enumPin, Optional ByVal SampTime As Double = 0.5) As Double
Dim lngNumOfHigh As Long
Dim NumOfSamp As Long
Dim StartTime As Double
Dim bteSamp As Byte
Dim bteMask As Byte
Dim lngActSamp As Long
Dim lngPortAdr As Long
lngPortAdr = Port
Select Case Pin
Case Pin2
bteMask = 1
Case Pin3
bteMask = 2
Case Pin4
bteMask = 4
Case Pin5
bteMask = 8
Case Pin6
bteMask = 16
Case Pin7
bteMask = 32
Case Pin8
bteMask = 64
Case Pin9
bteMask = 128
Case Pin10
bteMask = 64
Case Pin11
bteMask = 128
Case Pin12
bteMask = 32
Case Pin13
bteMask = 16
Case Pin15
bteMask = 8
End Select
If Pin >= Pin10 Then
lngPortAdr = lngPortAdr + 1
Else
DlPortWritePortUchar Port + 2, DlPortReadPortUchar(Port + 2) Or 32
End If
StartTime = Timer
Do Until Timer - StartTime > SampTime
If Timer < StartTime Then StartTime = 0
bteSamp = DlPortReadPortUchar(lngPortAdr)
NumOfSamp = NumOfSamp + 1
If bteSamp And bteMask Then lngNumOfHigh = lngNumOfHigh + 1
Loop
If Pin = Pin11 Then lngNumOfHigh = NumOfSamp - lngNumOfHigh
GetTemp = (lngNumOfHigh / NumOfSamp - 0.32) / 0.0047
End Function
Klassen adderar du till ditt projekt genom att välja menyn Project>Add Class Module och där välja Existing.
När du sedan vill läsa av temperaturen gör du såhär:
Dim Sensor As New cTempSensor
MsgBox "Det är " & Sensor.GetTemp(LPT1, Pin10, 0.5) & " grader C"
Om du har flera sensorer anropar du bara GetTemp() flera gånger.
Dim Sensor As New cTempSensor
MsgBox "Det är " & Sensor.GetTemp(LPT1, Pin10, 0.5) & " grader C"
MsgBox "Det är " & Sensor.GetTemp(LPT1, Pin11, 0.5) & " grader C"
GetTemp
Funktionen har tre argument.
GetTemp(ByVal Port As enumPort, ByVal Pin As enumPin, Optional ByVal SampTime As Double = 0.5) As Double
Port
Anger vilken LPT-port du vill använda, har porten på din dator någon annan adress än standard får du redigera klassen så det stämmer in.
Pin
Anger vilken pinne på porten du har anslutit sensorn till.
SampTime
Anger under hur många sekunder samplingar ska göras. Ju längre tid/fler samplingar, desto noggrannare blir det. 0.5 s ska nog fungera om du går med på att värdet varierar några tiondels grader, men det verkar vara olika från dator till dator.
För att hitta ett bra värde får du testa dej fram, du kan göra ett program som ser ut såhär för att testa:
Dim Sensor As New cTempSensor
Dim Matning As Integer
For Matning = 1 To 10
Debug.Print Sensor.GetTemp(LPT1, Pin10, 0.5)
Next
Du kommer märka att ju längre tid du samplar, desto stabilare värde får du. Vid sampling i 5 sekunder blir värdet riktigt bra!
Nu är det bara att kämpa på med din egen termometer! Jag är helt övertygad om att du kan komma på betydligt fler användningsområden.
Fredrik Hansson
Fungerar klockrent! Tar en dag att få sakerna från Elfa, och sen sätter man ihop allt på några minuter. Nästa steg för mig är att löda ihop allt och ta bort tejpen ;)
Sammy Johannesson
Bra artikel! Jag byggde ett eget program som skickade värdet till en Microsoft SQL Databas som jag senare hämtar ut via webbläsaren och visar på en ASP sida...