Der DS18B20 auf dem TM1637 




Der DS18B20 ist ein geeichter Temperaturfühler.

D.h. egal was kommt :  Feuersturm , Eiszeit , Weltuntergang , Aliens , .... er misst immer exakt die Temperatur.

Den DS18B20 gibt es in verschiedenen Ausführungen :

 

Ich bevorzuge die Kabelversion  :-)

Der DS18B20 arbeitet im sogenannten : 1-wire System
das heißt  , er brauch als Datenleitung nur 1 Kabel welches mit einem Pullup von 4,7K an Vcc betrieben wird.

Der Arbeitsbereich liegt bei :
Spannung : 3,3V  bis   5V
Temperatur : -55°  bis +125°C  in 0,5°C Schritten
wobei die genaueste Messung zwischen -10°C und 85°C liegt.

Angesprochen wird dieser ganz simple :

Einen Pin zu 1wire definieren .... und ein Array von 9 Datenbyte anlegen, da der DS18B20  neun Bytes liefert.

Config 1wire = Portc.0 

Dim Sep(9) As Byte

1wreset ' Initialisierung 
1wwrite &HCC ' überspringe ROM-Befehl 
1wwrite &H44 ' Temperaturmessung anstoßen 

Waitms 500 ' warten bis Messung fertig , kann aber auch weggelassen werden

1wreset ' Initialisierung 
1wwrite &HCC ' überspringe ROM-Befehl 
1wwrite &HBE ' Temperatur auslesen 
Sep(1) = 1wread(9) ' Daten in ein Array lesen, beschreibt Sep(1) bis Sep(9) 

Da man äußerst wenig Daten anzuzeigen hat , habe ich mich für den TM1637 als Anzeigegerät entschieden .
Wie dieser zu handhaben ist kann man in einem der anderen Beiträge lesen , drum gehe ich auf diesen
nicht weiter ein.

Natürlich auch hier der vollständige Code :


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portd.2 = Output
Config Portd.3 = Output
config 1WIRE = portc.0

Clk Alias Portd.2
Dout Alias Portd.3
Din Alias Pind.3

Dim Zaehler As Byte
Dim Str_Displaywert As String * 5
Dim Ascii As String * 1
Dim Messwert as word
Dim Data_(2) As Byte

Declare Sub Send_Display(byval Displaywert As Word)
Declare Sub I2C_write(byval Bdata As Byte)
Declare Sub I2C_on()
Declare Sub I2C_off()
Declare Sub I2C_start()
Declare Sub I2C_stop()
Declare Sub I2C_ack()

I2C_on

Do

 1wreset
 1wwrite &HCC
 1wwrite &H44
 1wreset
 1wwrite &HCC
 1wwrite &HBE
 Data_(1) = 1wread(2) ' für die Temperatur werden nur die 1. beiden Bytes eingelesen 

 Messwert=makeint(Data_(1),Data_(2))
 Messwert=Messwert /2
 Send_Display Messwert
 waitms 500

Loop
End


'=========================================================================
'
'     Subroutines
'
'========================================================================

Sub I2C_ack()
   Reset CLK
   Waitus 5
   Reset Dout
   Bitwait Din , Reset
   Set CLK
   Waitus 2
   Reset CLK
   Set Dout
End Sub


Sub I2C_off()
   I2C_start
   I2C_write &H80       
   I2C_ack
   I2C_stop
End Sub


Sub I2C_on()
   I2C_start
   I2C_write &H8E       
   I2C_ack
   I2C_stop
End Sub


Sub I2C_start()
   Set CLK
   Set Dout
   Waitus 2
   Reset Dout
End Sub


Sub I2C_stop()
   Reset CLK
   Waitus 2
   Reset Dout
   Waitus 2
   Set CLK
   Waitus 2
   Set Dout
End Sub

Sub I2C_write(byval Bdata As Byte)
   Local Bbitcounter As Byte

   For Bbitcounter = 0 To 7
      Reset CLK
      Dout = Bdata.bbitcounter
      Waitus 3
      Set CLK
      Waitus 3
   Next
End Sub

Sub Send_Display(byval Displaywert As Word)

   Str_Displaywert = Str(Displaywert)
   Str_Displaywert = Format(Str_Displaywert , "     ")

   I2C_start
   I2C_write &H40       
   I2C_ack
   I2C_stop
   I2C_start
   I2C_write &HC0       
   I2C_ack

   For Zaehler = 2 To 5
      Ascii = Mid(Str_Displaywert , Zaehler , 1)
         if Zaehler=4 then
            Select Case Ascii
                    Case "0" :I2C_write &B10111111
                    Case "1" :I2C_write &B10000110
                    Case "2" :I2C_write &B11011011
                    Case "3" :I2C_write &B11001111
                    Case "4" :I2C_write &B11100110
                    Case "5" :I2C_write &B11101101
                    Case "6" :I2C_write &B11111101
                    Case "7" :I2C_write &B10000111
                    Case "8" :I2C_write &B11111111
                    Case "9" :I2C_write &B11101111
                    Case Else:I2C_write &B10000000
            End Select
         else
            Select Case Ascii
                    Case "0" :I2C_write &B00111111
                    Case "1" :I2C_write &B00000110
                    Case "2" :I2C_write &B01011011
                    Case "3" :I2C_write &B01001111
                    Case "4" :I2C_write &B01100110
                    Case "5" :I2C_write &B01101101
                    Case "6" :I2C_write &B01111101
                    Case "7" :I2C_write &B00000111
                    Case "8" :I2C_write &B01111111
                    Case "9" :I2C_write &B01101111
                    Case Else:I2C_write &B00000000
           End Select
         endif
      I2C_ack
   Next
   I2C_stop
End Sub









zurück zur Beispiel-Übersicht