DS1820 DS18S20 DS18B20 Temperatursensor 1Wire

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • DS1820 DS18S20 DS18B20 Temperatursensor 1Wire

      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

      BASCOM-Quellcode

      1. 'Auslesen digitaler Temperatursensor Maxim Dallas DS1820 DS18B20 DS18S20
      2. 'mit automatischer Erkennung des Familycodes
      3. ' Michael @ bascomforum . de 01/2017
      4. $regfile = "m16def.dat" 'Atmega8 CPU
      5. $crystal = 16000000 'Quarz 16Mhz
      6. $baud = 38400 'Übertragungsgeschwindigkeit RS232; 115200 Baud 8,N,1
      7. $hwstack = 80
      8. $swstack = 32
      9. $framesize = 64
      10. '$sim
      11. Config 1wire = Portd.7 'achtung, externer Pullup 4k7
      12. Led Alias Portb.0 'Debug
      13. Config Pinb.0 = Output
      14. Dim 1w_i As Byte
      15. Dim 1w_t1 As Integer
      16. Dim 1w_t As Integer
      17. Dim Spp(9) As Byte
      18. Dim T_integer As Integer
      19. Dim Temp As Byte
      20. Dim Tempi As Integer
      21. Declare Function Ds1820_get_temp_f10() As Integer
      22. Declare Function Ds1820_get_temp_f28() As Integer
      23. Declare Sub Temperatur_starten
      24. Declare Sub Temperatur_lesen
      25. Declare Sub Ausgabe
      26. Do
      27. Toggle Led
      28. Call Temperatur_starten
      29. Wait 1 'Wartezeit zum Wandeln
      30. Call Temperatur_lesen 'Sensor auslesen
      31. Call Ausgabe
      32. Loop
      33. End
      34. Function Ds1820_get_temp_f10() As Integer
      35. 'Rechnung für Family Code 0x10
      36. 1w_i = Spp(1) And 1
      37. If 1w_i = 1 Then Decr Spp(1)
      38. 1w_t = Makeint(spp(1) , Spp(2))
      39. 1w_t = 1w_t * 50
      40. 1w_t = 1w_t - 25
      41. 1w_t1 = Spp(8) - Spp(7)
      42. 1w_t1 = 1w_t1 * 100
      43. 1w_t1 = 1w_t1 / Spp(8)
      44. 1w_t = 1w_t + 1w_t1
      45. 1w_t = 1w_t / 10
      46. ' Temperatur in 0,1 Grad Schritten
      47. 1w_t1 = 1w_t / 10
      48. Ds1820_get_temp_f10 = 1w_t '/ 10
      49. End Function
      50. Function Ds1820_get_temp_f28() As Integer
      51. 'Rechnung für Family Code 0x28
      52. 1w_i = Spp(1) And 1
      53. If 1w_i = 1 Then Decr Spp(1)
      54. 1w_t = Makeint(spp(1) , Spp(2))
      55. 1w_t = 1w_t * 10
      56. 1w_t = 1w_t / 16
      57. Ds1820_get_temp_f28 = 1w_t '/ 10
      58. End Function
      59. Sub Temperatur_starten
      60. 1wreset
      61. 1wwrite &HCC 'Skip ROM Kommando
      62. 1wwrite &H44 'Convert Temperature Kommando
      63. End Sub
      64. Sub Temperatur_lesen
      65. 1wreset
      66. 1wwrite &H33 'Read ROM Kommando
      67. Temp = 1wread(1) '1.Stelle enthält den Familycode
      68. 1wreset
      69. 1wwrite &HCC 'Rom überspringen, nur 1 Sensor
      70. 1wwrite &HBE 'Temperatur auslesen
      71. Spp(1) = 1wread(9) 'Daten in ein Array lesen
      72. 'Beispieldaten zum Debuggen
      73. 'Temp = &H10
      74. '36004B46FFFF0110B4 = 27,6°
      75. 'Spp(1) = &H36
      76. 'Spp(2) = &H00
      77. 'Spp(3) = &H4B
      78. 'Spp(4) = &H46
      79. 'Spp(5) = &HFF
      80. 'Spp(6) = &HFF
      81. 'Spp(7) = &H01
      82. 'Spp(8) = &H10
      83. 'Spp(9) = &HB4
      84. If Temp = &H10 Then
      85. T_integer = Ds1820_get_temp_f10() 'Familycode 16
      86. Elseif Temp = &H28 Then
      87. T_integer = Ds1820_get_temp_f28() 'Familycode 40
      88. Else
      89. T_integer = Temp + 1500 'kein Sensor angeschlossen
      90. End If
      91. End Sub
      92. Sub Ausgabe
      93. Local I As Byte
      94. Print "Familycode " ; Hex(temp) ; " ";
      95. For I = 1 To 9
      96. Print Hex(spp(i));
      97. Next
      98. Print " ";
      99. If T_integer >= 1500 Then
      100. Print "kein Sensor angeschlossen"
      101. Else
      102. Print T_integer ; " ";
      103. Tempi = T_integer Mod 10 'Nachkommastelle
      104. T_integer = T_integer / 10 'Vorkommastellen
      105. Print T_integer ; "," ; Tempi ; "°C"
      106. End If
      107. End Sub
      Alles anzeigen
    • Hallo Michael,
      hab grade mehr Zeit wegen Kurzarbeit... und wollte ein kleines Temperatur Projekt für die Heizungsanlage vorantreiben, da hab ich Deinen Code gefunden.

      Wie muss ich vorgehen wenn ich 3 oder mehr DS18B20 auslesen möchte, der Programmcode funktioniert einwandfrei mit einem Sensor...

      Bin halt noch blutiger Anfänger...


      Vielen Dank, Grüße Stefan
    • Tester2 schrieb:

      Wie muss ich vorgehen wenn ich 3 oder mehr DS18B20 auslesen möchte
      Ich würde für jeden Sensor eine ID-Variable anlegen (je 8 Byte Array)
      Dann mit 1wirecount schauen, ob alle Sensoren da sind

      Dann mit 1wiresearchfirst / next die IDs auslesen
      Und im Programm entsprechend die IDs verifizieren

      Bei den Lesefunktionen statt des 1wwrite &HCC ein eintsprechendes 1wverify(ID-Array) und if Err = 0, dann können die restlichen Routinen so weiter gehen.


      Die IDs können auch fest im Code hinterlegt werden, wenn sie vorher bekannt sind.