Soweit ich des seh, werden da anscheinend beide Sensoren mit der gleichen Adresse aufgerufen, d.h. der 2. Sensor wird garnicht abgefragt; der erste dafür 2x...
Hallo,
ich probiere zur Zeit mit den Tempsensoren DS18S20 rum und habe auch schon einen am laufen.
Nun möchte ich noch einen 2.Sensor mit einbinden, aber es wird mir immer bei beiden Sensoren das gleiche angezeigt.
Hier mal mein Codebeispiel:
Warum läuft das nicht so? Was muß ich ändern?Code:$regfile = "m16def.dat" $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.4 , Db7 = Portd.3 , E = Portb.7 , Rs = Portb.6 Config Lcd = 16 * 2 Config Lcdbus = 4 Cursor Off Cls Config 1wire = Portb.1 Declare Sub Messung1 Declare Sub Messung2 Dim Sensor1(9) As Byte Dim Sensor2(9) As Byte Dim T As Integer Dim Temp As Single Dim T1 As Integer Dim Temp1 As Single Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32 Locate 1 , 1 : Lcd "Sensor 1: " Locate 2 , 1 : Lcd "Sensor 2: " Do Messung1 Messung2 Loop End Sub Messung1 1wwrite &HCC 1wwrite &H44 Waitms 300 1wreset 1wwrite &HCC 1wwrite &HBE Sensor1(1) = 1wread(9) 1wreset Decr Sensor1(1) T = Makeint(sensor1(1) , Sensor1(2)) T = T / 2 Temp = Sensor1(8) - Sensor1(7) Temp = Temp / Sensor1(8) Temp = T + Temp Temp = Temp - 2.3 Locate 1 , 11 : Lcd Fusing(temp , "#.##") ; Chr(0) End Sub Sub Messung2 1wwrite &HCC 1wwrite &H44 Waitms 300 1wreset 1wwrite &HCC 1wwrite &HBE Sensor2(1) = 1wread(9) 1wreset Decr Sensor2(1) T1 = Makeint(sensor2(1) , Sensor2(2)) T1 = T1 / 2 Temp1 = Sensor2(8) - Sensor2(7) Temp1 = Temp1 / Sensor2(8) Temp1 = T1 + Temp1 Temp1 = Temp1 - 2.3 Locate 2 , 11 : Lcd Fusing(temp1 , "#.##") ; Chr(0) End Sub
Soweit ich des seh, werden da anscheinend beide Sensoren mit der gleichen Adresse aufgerufen, d.h. der 2. Sensor wird garnicht abgefragt; der erste dafür 2x...
Ich hab, ehrlich gesagt nicht viel Ahnung von 1wire. Aber könnte es sein, das unterschiedliche Geräte unterschiedliche Geräteadressen haben müssen?
Deine Subs Messung1 und Messung2 schicken beide die selben Daten raus, warum sollte jedes Mal ein anderer Sensor abgefragt werden?
Vielleicht hilft dir diese Seite weiter
http://www.pirnaer.de/bascom_fuer_my...ur_ds1820.html
Gruß MeckPommER
Mein Hexapod im Detail auf www.vreal.de
Hallo,
du musst jetzt den Sensor identifizieren, der antworten soll.
Dies geht über die eingebrannte Nr.
Schau dir mal die 1wsearchfirst und 1wsearchnext Befehle an.
Wenn du die Nummern hast, dann gibst du anstelle des skip_rom Befehls ein Match_rom aus und anschließend überträgst du die Nummer (8byte).
Dann kommt der read_scratchpad Befehl wie gewohnt.
Gruß
Rolf
Hallo
hier ist ein code der Dir weiterhelfen sollte. Dieser funktioniert bei mir ohne Probleme. Das sind Teile eines Programs von mir. Nicht grad schoen aber es geht.
Code:Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC Dim Dsid2(8) As Byte Dim Dsid3(8) As Byte Dim Dsid4(8) As Byte Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20 Cls Setfont Font8x8 W = 1wirecount() Dsid1(1) = 1wsearchfirst() Dsid2(1) = 1wsearchnext() Dsid3(1) = 1wsearchnext() Dsid4(1) = 1wsearchnext() If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated Lcdat 1 , 1 , "CRC OK Sensor 1" Wait 1 Lcdat 2 , 1 , Hex(dsid1(1)) For B = 2 To 8 Lcd Hex(dsid1(b)) Next End If If Dsid2(8) = Crc8(dsid2(1) , 7) Then Lcdat 3 , 1 , "CRC OK Sensor 2" Wait 1 Lcdat 4 , 1 , Hex(dsid2(1)) For B = 2 To 8 Lcd Hex(dsid2(b)) Next End If If Dsid3(8) = Crc8(dsid3(1) , 7) Then Lcdat 5 , 1 , "CRC OK Sensor 3" Wait 1 Lcdat 6 , 1 , Hex(dsid3(1)) For B = 2 To 8 Lcd Hex(dsid3(b)) Next End If If Dsid4(8) = Crc8(dsid4(1) , 7) Then Lcdat 7 , 1 , "CRC OK Sensor 4" Wait 1 Lcdat 8 , 1 , Hex(dsid4(1)) For B = 2 To 8 Lcd Hex(dsid4(b)) Next End If Wait 5 Cls Call Init ' Main loop Do Call Convallt ' "Convert ALL T on the 1w-bus" 'Waitus 100 : 1wverify Dsid1(1) 'Issues the "Match ROM " Locate 1 , 1 If Err = 1 Then Lcdat 9 , 1 , "Err " , 0 'Err = 1 if something is wrong, Elseif Err = 0 Then 'lcd " Sensor found" 1wwrite &HBE Sc(1) = 1wread(9) 'read bytes into array If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) If Min1 > Dg Then Min1 = Dg Emin1 = Min1 End If If Max1 < Dg Then Max1 = Dg Emax1 = Max1 End If Lcdat 1 , 1 , Dg , 0 : Lcd " " : Lcd Min1 : Lcd " " : Lcd Max1 Print Date$ ; "-" ; Time$ ; "-" ; "S1" ; Dg End If End If 1wverify Dsid2(1) Locate 2 , 1 If Err = 1 Then Lcd "DsId2 not on bus " Elseif Err = 0 Then 1wwrite &HBE Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) Dg = Dg - 3 If Min2 > Dg Then Min2 = Dg Emin2 = Min2 End If If Max2 < Dg Then Max2 = Dg Emax2 = Max2 End If Lcdat 2 , 1 , Dg , 0 : Lcd " " : Lcd Min2 : Lcd " " : Lcd Max2 Print Date$ ; "-" ; Time$ ; "-" ; "S2" ; Dg End If End If 1wverify Dsid3(1) Locate 3 , 1 If Err = 1 Then Lcd "DsId3 not on bus " Elseif Err = 0 Then 1wwrite &HBE Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) Dg = Dg - 2 If Min3 > Dg Then Min3 = Dg Emin3 = Min3 End If If Max3 < Dg Then Max3 = Dg Emax3 = Max3 End If Lcdat 3 , 1 , Dg , 0 : Lcd " " : Lcd Min3 : Lcd " " : Lcd Max3 Print Date$ ; "-" ; Time$ ; "-" ; "S3" ; Dg End If End If 1wverify Dsid4(1) Locate 4 , 1 If Err = 1 Then Lcd "DsId4 not on bus " Elseif Err = 0 Then 1wwrite &HBE Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) If Min4 > Dg Then Min4 = Dg Emin4 = Min4 End If If Max4 < Dg Then Max4 = Dg Emax4 = Max4 End If Lcdat 4 , 1 , Dg , 0 : Lcd " " : Lcd Min4 : Lcd " " : Lcd Max4 Print Date$ ; "-" ; Time$ ; "-" ; "S4" ; Dg End If End If For I = 1 To 10 Test = 11 - I If Test < 10 Then Lcdat 6 , 1 , "0" , 0 Lcd Test Else Lcdat 6 , 1 , Test , 0 End If Wait 1 Next I Loop End Sub Init Cls Min1 = Emin1 ' to get a real value from start Min2 = Emin2 Max1 = Emax1 Max2 = Emax2 Min3 = Emin3 ' to get a real value from start Min4 = Emin4 Max3 = Emax3 Max4 = Emax4 End Sub Sub Convallt 1wreset ' reset the bus 1wwrite &HCC ' skip rom 1wwrite &H44 Set Portb.3 Waitms 800 Reset Portb.3 ' Convert T End Sub Function Decigrades(byval Sc(9) As Byte) Dim Tmp As Byte , T As Integer , T1 As Integer Tmp = Sc(1) And 1 ' 0.1C precision If Tmp = 1 Then Decr Sc(1) T = Makeint(sc(1) , Sc(2)) T = T * 50 'here we calculate the 1/10 precision like T = T - 25 'DS18S20 data sheet T1 = Sc(8) - Sc(7) T1 = T1 * 100 T1 = T1 / Sc(8) T = T + T1 Decigrades = T / 10 End Function
Danke fürs Beispiel, das ist mir aber ehrlich gesagt zuviel, da ich noch nicht mal richtig durch meinen Code durchblicke.
Dieses Ganze 1wirezeugs ist neu für mich, den Rest habe ich scho fertig(Menüsteuerung, DCF usw.) Mir fehlt nur noch die Temp auf 0.1° genau...
PS
Gibt es noch Alternativen zum DS18S20 (Preislich gesehen, weil ich mehre brauche...)
Hei
mir sind keine anderen Senoren bekannt. Zmindest nicht Preislich. Ich habe bis jetzt immer die DS18S20 genommen. Mit der 0,1° nimm das nicht zu eng. Ich habe 8 Senosren am Bus und alle zum testen auf ein Stueck Metall geklebt. Alle 8 Sensoren schwanken ein wenig. Die max. differenz die ich zwischen 2 Sensoren hab sind 0,8° Damit ich zumindest von einem "Startpunkt" ausgehen kann hab ich das Mittel der Temperaturen genommen und alle Senoren durch addition oder subtraktion auf einen Wert gebracht. Aber die Sensoren sind sehr einfach zu nutzen deswegen probier ich auch nicht mit was neuem rum. Probier einfach mal meinen code aus und spiele damit herum.
Hi Papsi,
schau mal hier rein: https://www.roboternetz.de/phpBB2/viewtopic.php?t=35075
Ich habe mich lange damit rumgeschlagen und jetzt läuft es gut! (1x DS1820 und DCF)
für einen zweiten.... dritten Sensor musst Du dann nur noch folgendes einfügen und schau mal in diesen Trade:
https://www.roboternetz.de/phpBB2/ze...ghlight=ds1820
Wenns dann noch nicht klappt dann meld Dich einfach!
Gruß MAT
Lesezeichen