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.

DS18B20DS18b20anschluss

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.

scratch

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.