Der DS18b20 ist ein 12Bit Temperatursensor mit 1Wirebus. Im Gegenteil zu anderen wie z.B LM35 kann aus ihm die gemessene Temperatur direkt ausgelesen werden. Zusätzlich speichert er die min. und die max. Temperatur sowie hat eine programmirbare Alarmfunktion. Die Spannungsversorgung erfolg über die Datenleitung kann aber auch über den 3. Anschluß erfolgen, Im 1Wirebus ist es möglich mehrere Sensoren an einem Bus getrennt von eienander auszulesen. Ideal für Haussteuerungen.
Mit dem 18b20 kann die Temperatur mit 9 - 12 Bit ausgewertet werden was 0,0625°C enstpricht. Der in vielen Beiträgen beschriebene DS18S20 kann nur 9Bit was nur 0,5°C entspricht. Hier wird viel von den Authoren im Internet verwechselt und auch falsch beschrieben.
Sollen mehr als nur ein Sensor angeschlossen werden so geschieht das parallel zum 1. Sensor . Weitere Widerstände sind dann nicht mehr erforderlich. Die einzelenen Sensoren werden dann anhand der Seriennummern identifiziert.
Der 1Wire Bus lässt sich als Bus, Stern oder auch Baumstruktur Installiern.
Als Bus sind 300m mögkich, anders sind es immer noch 100m.
Termometerprogramm als Beispiel.
Auf den genauen Ablauf des 1Wire Bus gehe nicht ein. Die Funktion ist in Wikipedia und im Datenblatt beschrieben.
Dim Sc(9) As Byte
Dim Temperatur As Integer
Dim Celsius As Single
Print "------------------------- Start ---------------------"
Do
1wreset
1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
1wwrite &H44 'messen
Waitms 1000
1wreset
1wwrite &HCC
1wwrite &HBE ' Start Daten lesen
Sc(1) = 1wread(9) ' Gelesene Daten ins Array
Waitms 500
Temperatur = Makeint(sc(1) , Sc(2)) ' Die oberen und unteren 8Bit in eine 16Bit Integer Variable speichern
Print Bin(sc(1)) ; Bin(sc(2))
Celsius = Temperatur / 16 ' Bei 12Bit Auflösung (default Einstellung) durch 16 dividieren oder mit 0,0625 multiplizieren
Print "Temp:" ; Celsius
Print "------------------------"
Print
Loop
End
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40
Baud = 9600
' Achtung Hier den Pin auswählen
Config 1wire = Portc.5 'use this pin
Dim Ar(8) As Byte ' Array für SerienNr.
Dim Sp(9) As Byte 'Array für Scratchpack
Dim Temp As Integer
Dim Celsius As Single
Dim I As Byte
Dim W As Word
Print
Print "1-Wire"
W = 1wirecount() ' Anzahl der gefundener Sensoren
Waitms 500
Print "Anzahl " ; W
Do
Ar(1) = 1wsearchfirst()
' Sensor vorhanden ?
If Err = 0 Then
Do
Print "Found Nr.: ";
' Ausgabe der SerienNr.
For I = 1 To 8
Print Hex(ar(i));
Print " ";
Next
Print
Gosub Messen
' Nach weiterem Gerät suchen
Ar(1) = 1wsearchnext()
Loop Until Err = 1 ' solange bis sich kein weiterer Sensor mehr meldet.
End If
Print "Fertig"
Loop
End
Messen:
1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar() auswählen
' Gerät vorhanden
If Err = 0 Then
1wwrite &H44 ' Temperaturmessung anstoßen
Waitms 1500 ' warten bis Messung fertig
1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar() auswählen
1wwrite &HBE ' Temperatur auslesen
Sp(1) = 1wread(9) ' Daten in ein Array lesen
Print "Temp Register MSB+LSB " ; Bin(sp(2)) ; Bin(sp(1))
Temp = Makeint(sp(1) , Sp(2))
Celsius = Temp / 16
Print "Temperatur : " ; Celsius ; "C"
Print
Else
Print "Fehler"
End If
Wait 1
Return
Das erste Listing ist ganz einfach. Die Selektierung der Romadressen wird übersprungen. Die 1Wire-Befehle habe ich kommentiert.
Nochmal zu Bascom: Integer Variablen haben 16 Bit und einen 64k Umfang der aber von -32768 bis + 32768 reicht. Single Variablen können auch negative Werte darstellen zusätzlich haben Sie eine Gleitkommafunktion.
Man könnte das Ergebnis in der Variable Celsius runden und in eine String Varible laden und dann formatiert ausgeben.
Im 2. Listing wird die Azahl der Sensoren ermittlet, die Seriennumern aus dem Rombereich ausgelesen. Die Sensoren werden zum messen und geziehlt adressiert.
Es fällt auf das, das erste Byte immer gleich ist. Es ahndelt sich hier um die HerstellerID.
Damit lassen sich DS18B20, 18S20 und der ältere 1820 von ein ander unterscheiden. In den Programmen kann dann in verschiedene Auswertroutinen gesprungen werden.