- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: DS18B20 auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    DS18B20 auslesen

    Anzeige

    Praxistest und DIY Projekte
    Guten Abend,

    irgendwie bekomme ich es nicht mehr hin!

    Hier der Code. Im Moment habe ich nur die ersten 2 Sensoren angeschlossen

    Auf dem Display wird 155,1 Grad und 155,2 angezeigt. Wenn ich die Sensoren anfasse steigt auch die angezeigte Temperatur. Das ergebnis ist aber viel zu groß. Was ist denn in meinem Code falsch?

    Code:
    $regfile = "m8def.dat"
    $crystal = 4000000                                          '3686400
    $hwstack = 46
    $swstack = 40
    $framesize = 40
    
    '**************************Funktionen LCD-Display*******************************
    Config Lcd = 40 * 4
    Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
    Config Lcdbus = 4
    Config Lcdmode = Port
    
    
    Dim ___lcdno As Byte
    
    ___lcdno = 0
     Initlcd
     Cursor Off
     Cls
    
    ___lcdno = 1
    Initlcd
    Cursor Off
    Cls
    '**************************Def. allgemeiner Variabeln***************************
    Dim Tempmessstelle(8) As Single
    
    
    Waitms 60
    
    '***************************Config 1Wire****************************************
    
    Config 1wire = Portc.1                                      'DS1820
    
    Match_rom Alias &H55
    Read_scratchpad Alias &HBE
    Start_conversion Alias &H44
    
    Innen Alias 0
    Vorlauf Alias 1
    Rücklauf Alias 2
    Aussen Alias 3
    Kessel Alias 4
    Boiler Alias 5
    
    
    Dim Read_temp As Integer
    Dim Sensor_ids(48) As Byte
    Dim Id As Byte
    Dim Offset As Byte
    Dim Ds_array(7) As Byte
    Dim Bruchteil As Single
    Dim Temperatur As Single
    Dim I As Integer
    '***************************ID 1Wire configurieren******************************
    For Id = 1 To 40                                            'Einlesen der 5 Sensoren IDs (5*8 Byte)
       I = Id - 1
       Readeeprom Sensor_ids(id) , I
    Next Id
    '***********************************Hauptprogramm*******************************
    Do
       Gosub 1wire
    Loop
    End
    '**********************************1Wire****************************************
    1wire:
    
       Wait 1
       For Id = Innen To Kessel
          Offset = Id * 8
          Offset = Offset + 1                                   'Offset geht auf 1, 9, 17, 25 und 33
          1wreset                                               'hier wird der Temperaturwert eingelesen
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8                        '8 Byte ID wird übertragen
          1wwrite Read_scratchpad
          For I = 1 To 7                                        'nur bis 7, weil 8 und 9 uninteressant
             Ds_array(i) = 1wread()
          Next I
          Read_temp = Makeint(ds_array(1) , Ds_array(2))
          1wreset                                               'jetzt wird wieder die Konvertierung gestartet
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8
          1wwrite Start_conversion
          Shift Read_temp , Right
          'If 127 < Read_temp Then Read_temp = Read_temp - 32768
          Bruchteil = 16 - Ds_array(7)
          Bruchteil = Bruchteil / 16
          Bruchteil = Bruchteil - 0.25
    
    
          Temperatur = Read_temp + Bruchteil
          Tempmessstelle(id + 1) = Temperatur
    
          If Temperatur <> 85.0 Then                            ' < 80.0 And Temperatur > -20.0 Then
            Tempmessstelle(id + 1) = Temperatur
          End If
    
                              'Innen Alias 0
                              'Vorlauf Alias 1
                              'Rücklauf Alias 2
                              'Aussen Alias 3
                              'Kessel Alias 4
                              'Boiler Alias 5
          ___lcdno = 0
          Select Case Id
          Case Innen:
             Locate 1 , 1 : Lcd "WZ:       "
             Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
          Case Aussen:
             Locate 1 , 11 : Lcd "AT:       "
             Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
          Case Vorlauf:                                         'ausgabe im Display ist dann z.B.
             Locate 2 , 1 : Lcd "VL:       "
             Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" )     '  Inn  Auss  Kess Rück Vorl
          Case Rücklauf:                                        ' 14.4  52.4 67.3 43.0 62.8
             Locate 2 , 11 : Lcd "RL:       "
             Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
          End Select
    
          ___lcdno = 1
          Select Case Id
          Case Kessel:
             Locate 1 , 11 : Lcd "KE:     "
             Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
          End Select
    
         Cursor Off
       Next Id
    Return
    '-----------------------------------------
    
    $eeprom
    
    Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55
    Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5
    Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11
    Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67
    Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF  '
    Geändert von radbruch (08.12.2012 um 23:36 Uhr) Grund: Code-Tag eingefügt

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Martin,
    das Motto "Viel hilft viel" gilt sicherlich nicht für die Anzahl Threads zu einem Thema. Warum führst du nicht einen weiter?
    Zu deinem Problem: Du hast offensichtlich andere Sensoren erwischt. Früher hattest du die DS18(S)20 mit dem Family Code &H10, jetzt sind es DS18B20 mit dem Family Code &H28. Schau mal ins Datenblatt, die funktionieren ganz anders.
    Du kannst bei denen einfach die ersten beiden Byte auslesen und in eine Integer stecken.
    Read_temp = Makeint(ds_array(1) , Ds_array(2))
    Das ist dann deine Temperatur * 16. Dann teilst du entweder in eine Single
    Read_Single = Read_temp/16
    und lässt sie dir anzeigen (Vorsicht: das könnten einige Stellen hinter dem Komma werden)
    oder du nimmst die Bits 4-11 als ganzzahlige Temperatur und die Bits 0-3 als Bruchteil hinter dem Komma.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Vielen Dank für die Hilfe!

    Es hat geklappt!

    Wegen dem 2-ten Beitrag. Ich dachte, es ist besser einen neuen zu starten, da ich gesehen hatte, dass ich einen DS18B20 habe.

    Das war dann wohl dann nicht so gut. Sorry

    Martin

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Muss leider noch eine Frage nachlegen!

    Nun habe ich noch 2 weitere DS18B20 engeschlossen und die entsprechenden SN (3 und 4te Zeile der SN) eingetragen. Doch es werden nur die ersten beiden ausgelesen. Was mache ich denn schon wieder falsch!? Kannst du mir bitte noch einmal helfen.

    Hier der Code mit den 4 Sensoren wobei nur die ersten beiden funktionieren.

    Ach so. Den MC habe ich noch ausgetauscht. Mit dem neuen funktionieren die beiden ersten.

    Code:
    $regfile = "m168def.dat"
    $crystal = 4000000                                          '3686400
    $hwstack = 46
    $swstack = 40
    $framesize = 40
    
    '**************************Funktionen LCD-Display*******************************
    Config Lcd = 40 * 4
    Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
    Config Lcdbus = 4
    Config Lcdmode = Port
    
    Dim ___lcdno As Byte
    
    ___lcdno = 0
     Initlcd
     Cursor Off
     Cls
    
    ___lcdno = 1
    Initlcd
    Cursor Off
    Cls
    '**************************Def. allgemeiner Variabeln***************************
    
    $baud = 19200
    
    Match_rom Alias &H55
    Skip_rom Alias &HCC
    Read_scratchpad Alias &HBE
    Write_scratchpad Alias &H4E
    Copy_scratchpad Alias &H48
    Start_conversion Alias &H44
    
    ' Pin für 1wire Schnittstelle festlegen. => DS1820 am Port C.1
    Config 1wire = Portc.1
    Dim Ds1820id(32) As Byte
    Dim Sc(9) As Byte                                           '????
    Dim T As Integer
    Dim I As Byte
    Dim Id As Byte
    Dim T_mess As Single
    
    
    'Die Adresse aller meiner DS1820 die ich vorher ausgelesen habe:
    Restore Sensor_ids
    For I = 1 To 32
       Read Ds1820id(i)
    Next I
    1wreset
    1wwrite Skip_rom
    1wwrite Start_conversion                                    'Alle angeschlossenen DS1820 zum Messen veranlassen
    Waitms 500                                                  'Ausgabe alle 0,5 Sekunden
    Do
       For Id = 1 To 25 Step 8                                  'ID für alle 4 DS1820 1,9,17,25
          Incr I
          1wreset                                               '1Wire Reseten
          1wwrite &H55                                          'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
          1wwrite Ds1820id(id) , 8                              '8 Byte ID wird uebertragen
          1wwrite &HBE                                          'READ SCATCHPAD => Liest alle Bytes des SP Memorys
          Sc(1) = 1wread(9)
          T = Sc(1)
          T = Makeint(sc(1) , Sc(2))                            'komprimiert zwei Bytes in die Integervariable T
          T_mess = T / 16                                       'Die Nachkommastelle entfernen
          Locate I , 11                                         'Temperatur in ganzen Grad ausgeben
          Lcd Fusing(t_mess , "#.#" )
       Next Id
       I = 0
       1wreset
       1wwrite Skip_rom
       1wwrite Start_conversion                                 'Alle angeschlossenen DS1820 zum Messen veranlassen
       Waitms 500                                               'Ausgabe alle 0,5 Sekunden
    Loop
    
    End
    
    Sensor_ids:
    
    Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55
    Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5
    Data &H28 , &HA7 , &H64 , &HAA , &H03 , &H00 , &H00 , &H9F
    Data &H28 , &HE6 , &H63 , &HAA , &H03 , &H00 , &H00 , &H8C
    Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF
    Geändert von radbruch (09.12.2012 um 15:35 Uhr)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Habs gefunden. Die Ausgabe der Messwerte de 3. und 4-ten Sensors war nicht mehr auf dem Display.

    Habe folgendes ersetzt:

    'Locate I , 11
    Spalte = I * 6
    Spalte = Spalte - 5
    Locate 1 , Spalte 'Temperatur in ganzen Grad ausgeben
    Lcd Fusing(t_mess , "#.#" )

    Danke an dieser Stelle für die Hilfe
    Martin

Ähnliche Themen

  1. Mehrere DS18B20 Auslesen
    Von Felix H. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.04.2010, 17:30
  2. Frage: Temperatursensor DS18B20
    Von pod32 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 03.01.2006, 12:54
  3. 1-Wire Temperatursensor DS18B20
    Von LuK-AS im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 02.12.2005, 18:32
  4. DS18B20
    Von x-ryder im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 14.05.2005, 22:52
  5. DS18B20
    Von MAxK im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 25.04.2005, 13:37

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen