Option Explicit

'DS75-Ansteuerung von Christof Rueß, www.hobby-elektronik.de.vu
'Die Verwendung dieses Moduls ist kostenfrei, solange diese Zeilen erhalten bleiben.
'Fragen, Kritik und Anregungen an: hobbyelektronik@gmx.net

'Anschlussbelegung an den Parallelport (Sub-D):
'SCL an Pin 1
'SDA an Pin 14
'SDA über 470-Ohm-Widerstand an Pin 10
'Vcc an Pin 9
'GND an Pin 18-25

'Enum für die Auflösung des DS75
Public Enum enDS75_Resolution
  res09bit = 0  '0.5°C
  res10bit = 32 '0.25°C
  res11bit = 64 '0.125°C
  res12bit = 96 '0.0625°C
End Enum

'Die Temperatur auslesen. Der Wert wird immer in °C ausgegeben.
Function ReadTemp(ByVal I2C_Address As Long) As Double
Dim ByteA, ByteB As Long
Dim x As Long
Dim Temp As Double


I2C.Start
WriteByte 145 + I2C_Address * 2

ByteA = I2C.ReadByte(False)
ByteB = I2C.ReadByte(True)
I2C.Stopp
If ByteA > 127 Then
  Temp = ByteA - 256
Else
  Temp = ByteA
End If

For x = 1 To 4
  If ByteB And (2 ^ (8 - x)) Then
    Temp = Temp + 1 / (2 ^ x)
  End If
Next

ReadTemp = Temp
End Function

'Auflösung des Sensors festlegen. DS75_Resolution gibt die Auflösung zwischen 9 und 12 Bit wieder.
Function SetResolution(ByVal I2C_Address As Long, ByVal Resolution As enDS75_Resolution)

I2C.Start
I2C.WriteByte 144 + I2C_Address * 2 'das nächste Byte wird geschrieben
I2C.WriteByte 1 'Pointer auf Configure setzen
I2C.WriteByte Resolution 'Auflösung festlegen
I2C.Stopp

I2C.Start
I2C.WriteByte 144 + I2C_Address * 2 'das nächste Byte wird geschrieben
I2C.WriteByte 0 'Pointer auf Temp setzen
I2C.Stopp
End Function

Function CheckSensor(ByVal I2C_Address As Long) As Boolean
Dim RetVal As Boolean
I2C.Start
RetVal = I2C.WriteByte(145 + I2C_Address * 2) 'Beim Schreiben wird überprüft, ob ein ACK zurück kommt
I2C.ReadByte False 'Noch zwei Byte lesen, damit der DS75 nicht "verwirrt" wird
I2C.ReadByte True
I2C.Stopp 'Fertig!
CheckSensor = RetVal 'Noch den Wert zurückgeben
End Function