diese 3 Typen sind erhältlich und werden aber unterschiedlich angesprochen.
Es handelt sich um digitale Temperatursensoren der Firma Dallas / Maxim, die über die 1wire Schnittstelle ihre Daten hergeben.
In Bascom sind 1wire Routinen eingebaut, diese werden hier benutzt.
Es gibt 2 verschiedene Typen dieser Sensoren, unterschieden werden sie über den Familycode.
Die Software erkennt den Familycode und führt die korrekte Rechnung durch.
Die Auflösung beträgt 0,1°C
Alles anzeigen
Es handelt sich um digitale Temperatursensoren der Firma Dallas / Maxim, die über die 1wire Schnittstelle ihre Daten hergeben.
In Bascom sind 1wire Routinen eingebaut, diese werden hier benutzt.
Es gibt 2 verschiedene Typen dieser Sensoren, unterschieden werden sie über den Familycode.
Die Software erkennt den Familycode und führt die korrekte Rechnung durch.
Die Auflösung beträgt 0,1°C
BASCOM-Quellcode
- 'Auslesen digitaler Temperatursensor Maxim Dallas DS1820 DS18B20 DS18S20
- 'mit automatischer Erkennung des Familycodes
- ' Michael @ bascomforum . de 01/2017
- $regfile = "m16def.dat" 'Atmega8 CPU
- $crystal = 16000000 'Quarz 16Mhz
- $baud = 38400 'Übertragungsgeschwindigkeit RS232; 115200 Baud 8,N,1
- $hwstack = 80
- $swstack = 32
- $framesize = 64
- '$sim
- Config 1wire = Portd.7 'achtung, externer Pullup 4k7
- Led Alias Portb.0 'Debug
- Config Pinb.0 = Output
- Dim 1w_i As Byte
- Dim 1w_t1 As Integer
- Dim 1w_t As Integer
- Dim Spp(9) As Byte
- Dim T_integer As Integer
- Dim Temp As Byte
- Dim Tempi As Integer
- Declare Function Ds1820_get_temp_f10() As Integer
- Declare Function Ds1820_get_temp_f28() As Integer
- Declare Sub Temperatur_starten
- Declare Sub Temperatur_lesen
- Declare Sub Ausgabe
- Do
- Toggle Led
- Call Temperatur_starten
- Wait 1 'Wartezeit zum Wandeln
- Call Temperatur_lesen 'Sensor auslesen
- Call Ausgabe
- Loop
- End
- Function Ds1820_get_temp_f10() As Integer
- 'Rechnung für Family Code 0x10
- 1w_i = Spp(1) And 1
- If 1w_i = 1 Then Decr Spp(1)
- 1w_t = Makeint(spp(1) , Spp(2))
- 1w_t = 1w_t * 50
- 1w_t = 1w_t - 25
- 1w_t1 = Spp(8) - Spp(7)
- 1w_t1 = 1w_t1 * 100
- 1w_t1 = 1w_t1 / Spp(8)
- 1w_t = 1w_t + 1w_t1
- 1w_t = 1w_t / 10
- ' Temperatur in 0,1 Grad Schritten
- 1w_t1 = 1w_t / 10
- Ds1820_get_temp_f10 = 1w_t '/ 10
- End Function
- Function Ds1820_get_temp_f28() As Integer
- 'Rechnung für Family Code 0x28
- 1w_i = Spp(1) And 1
- If 1w_i = 1 Then Decr Spp(1)
- 1w_t = Makeint(spp(1) , Spp(2))
- 1w_t = 1w_t * 10
- 1w_t = 1w_t / 16
- Ds1820_get_temp_f28 = 1w_t '/ 10
- End Function
- Sub Temperatur_starten
- 1wreset
- 1wwrite &HCC 'Skip ROM Kommando
- 1wwrite &H44 'Convert Temperature Kommando
- End Sub
- Sub Temperatur_lesen
- 1wreset
- 1wwrite &H33 'Read ROM Kommando
- Temp = 1wread(1) '1.Stelle enthält den Familycode
- 1wreset
- 1wwrite &HCC 'Rom überspringen, nur 1 Sensor
- 1wwrite &HBE 'Temperatur auslesen
- Spp(1) = 1wread(9) 'Daten in ein Array lesen
- 'Beispieldaten zum Debuggen
- 'Temp = &H10
- '36004B46FFFF0110B4 = 27,6°
- 'Spp(1) = &H36
- 'Spp(2) = &H00
- 'Spp(3) = &H4B
- 'Spp(4) = &H46
- 'Spp(5) = &HFF
- 'Spp(6) = &HFF
- 'Spp(7) = &H01
- 'Spp(8) = &H10
- 'Spp(9) = &HB4
- If Temp = &H10 Then
- T_integer = Ds1820_get_temp_f10() 'Familycode 16
- Elseif Temp = &H28 Then
- T_integer = Ds1820_get_temp_f28() 'Familycode 40
- Else
- T_integer = Temp + 1500 'kein Sensor angeschlossen
- End If
- End Sub
- Sub Ausgabe
- Local I As Byte
- Print "Familycode " ; Hex(temp) ; " ";
- For I = 1 To 9
- Print Hex(spp(i));
- Next
- Print " ";
- If T_integer >= 1500 Then
- Print "kein Sensor angeschlossen"
- Else
- Print T_integer ; " ";
- Tempi = T_integer Mod 10 'Nachkommastelle
- T_integer = T_integer / 10 'Vorkommastellen
- Print T_integer ; "," ; Tempi ; "°C"
- End If
- End Sub