Temperaturmessung mit DS18B20 und Dimmung der LCD Hintergrund-LED

Hallo Robin !

Nun ist es leider schon ein wenig spät, um mir deinen Code mal genauer anzusehen....
Ich versuche aber morgen mal, einen längeren Blick darauf zu werfen. :)

Deinen Programmcode habe ich zur besseren Lesbarkeit mal wieder mit den Highlights für BASCOM versehen..... auch wenn deine farblichen Änderungen nun "falsch" im Code dargestellt werden. ;)


Ich denke mal, wir sind nun wieder am Anfang angekommen.....
Die Struktur deines Programmcodes.

Durch Änderungen und Erweiterungen im Programm und dessen Ablauf kommt es nun zu Problemen.

Es hilft wohl nichts..... du musst an die Struktur noch mal ran.
Wenn ich mehr Zeit hätte, dann würde ich dir gern ein "Grundschema" zur groben Übersicht zeichnen.... aber leider fehlt mir momentan einfach die Zeit dafür.
Ich vergesse dich aber schon nicht!

Gruß,
Cassio
 
Hallo Robin!

Ich hatte eben mal wieder einige freie Minuten und habe mir dein Programm noch mal angesehen....

Mir sind es aber zu viele Punkte, die mich stutzig machen. :hmmmm:

Das "Loop" am Ende des Programms.... (Zeile 208)
Das Return kurz davor.... (Zeile 206)
Das "End IF".... (Zeile 201)
Das "Next" in Zeile 199
und die "For / Next Schleife" in Zeile 155 / 157

Dann gibt es in der (scheinbaren) Hauptschleife einige "Wait 5"... :eek:

Obendrein sind mir deine Variablen, speziell die ganzen "Arrays" ein Rätsel.
Ich kann mir auch nicht vorstellen, dass BASCOM den Code ohne Fehlermeldungen kompilieren würde. :hmmmm:


Wir kommen so einfach nicht weiter!
Ich würde es für sinnvoll halten, wenn du dein Programm erst einmal zerlegst.
Nimm z.B. erst mal nur die 1-Wire Komponenten und das Display.
Du musst also das Programm so umbauen, dass du eine Hauptschleife hast in der das Display angesteuert wird (Ausgabe der Variablen) und die Sub für den Scan des 1-Wire-Bus aufgerufen wird und danach die Sub für die Temperaturmessung.

Wenn das alles funktioniert und der Code gut "strukturiert" ist, dann geht es weiter.

Zur Zeit bin ich einfach nur der Meinung, dass dein Prgramm momentan doch noch etwas "groß" für dich ist. ;)
Das ist natürlich nicht schlimm.... aber kann dich zu Beginn auch ein wenig deprimieren, weil die Erfolge ausbleiben.
Dann lieber schrittweise vorgehen und später das Programm zusammenführen. :)

Schöne Grüße,
Cassio
 
Hallo Cassio,

ersteinmal vielen Dank, dass Du trotz mangelnder Zeit noch mal auf mein "Programm" geschaut hattest! Ich habe momentan ebenfalls sehr wenig Zeit und kann mich nicht so in die Sache 'reinhängen, wie ich es gerne machen würde:(

Nun hatte ich mir die letzte Nacht um die Ohren geschlagen und dieses Programm geschrieben, funktioniert recht zufriedenstellend und ist m. E. nun deutlich besser strukturiert. Ich hatte versucht, die Fehlermeldung bezüglich nicht angeschlossener / defekter Sensoren einzubauen - die Abfrage If Err = 0 ist ja schon vorhanden, aber die Weiterleitung, wenn Err=1 ist, zum nächsten Sensor, das hat noch nicht funktioniert. Mit den "wait 3 oder vorher 5 sec. lasse ich die Anzeige stehen, bevor sie geändert wird.

Ansonsten gibt's nuuuur noch eine Hauptschleife und ein Minimum an Arrays:D , wie ich finde.

Ich stelle die neue "Variante" mal ein.

Schöne Grüße

robin


Code:
$regfile "m8def.dat"
$crystal = 1000000
$hwstack = 82
$framesize = 68
$swstack = 68
        '
Initlcd
Cursor Off



Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32

Cls

Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Config Lcd = 20 * 4
Config Lcdbus = 4
Config Portb.2 = Input
Config 1wire = Portb.2

Config Portd.7 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Portb.0 = Output

Dim Frost As Single                                         'Variable für den Soll-Abgleich <=1°C
Dim Kalt As Single                                          'Variable für den Soll-Abgleich >=60°C
Dim Warm As Single                                          'Variable für den Soll-Abgleich >=70°C

Frost = 22
Kalt = 25
Warm = 28


Dim Celsius As Integer

Dim T1 As Single
Dim T2 As Single
Dim Ar1 As Single                                           '1. 1wire
Dim Ar2 As single                                          '2. 1wire

Dim Min1 As Single
Dim Min2 As Single                                          'minimal Temperatur Wert
Dim Max1 As Single
Dim Max2 As Single                                          'maximal Temperatur Wert

Dim I As Byte
Dim W As Word
Dim Sp(12) As Byte

Wait 1


If Err = 0 Then
Ar1 = 1wsearchfirst()

End If


If Err = 0 Then                                             'Sensorabfrage
Ar2 = 1wsearchnext()
End If

W = 1wirecount()
Locate 1 , 1
Lcd "Anzahl nutzbarer"
Locate 2 , 1
Lcd "Sensoren: " ; W                                        'Anzahl der Themperatursensoren werden angezeigt
Waitms 1500
Cls


Min1 = 999
Min2 = 999

Max1 = 000
Max2 = 000


Do

    1wreset
    1wwrite &HCC
    1wwrite &H44                                            ' Temperatur konvertieren

Waitms 100


Sp(1) = 1wread(12)                                          '12-bit Genauigkeit

Wait 1


If Err = 0 Then
    1wverify Ar1
        1wwrite &HBE                                        'Scratchpad auslesen
        Sp(1) = 1wread(12)

        Celsius = Makeint(sp(1) , Sp(2))
        Celsius = Celsius * 10
         Celsius = Celsius / 16

        T1 = Celsius
        T1 = T1 / 10

If T1 < Frost Then
Portd.7 = 1
Else
Portd.7 = 0
End If

    Locate 1 , 1
        Lcd "Aussen : " ; Fusing(t1 , "#.#") ; Chr(0) ; "C   "

        If Min1 > T1 Then Min1 = T1
        If Max1 < T1 Then Max1 = T1


    Locate 3 , 1
        Lcd "Min: " ; Fusing(min1 , "#.#") ; Chr(0) ; "C   "

    Locate 4 , 1
        Lcd "Max: " ; Fusing(max1 , "#.#") ; Chr(0) ; "C   "

End If

1wreset

Wait 3


If W >= 2 Then
    1wverify Ar2

        1wwrite &HBE

        Sp(1) = 1wread(12)

        Celsius = Makeint(sp(1) , Sp(2))
        Celsius = Celsius * 10
        Celsius = Celsius / 16
         Print Celsius
        T2 = Celsius
        T2 = T2 / 10

  If T2 > Kalt Then
Portd.6 = 1
Else
Portd.6 = 0
End If

If T2 > Warm Then
Portd.5 = 1
Else
Portd.5 = 0
End If

  Locate 1 , 1
        Lcd "Innen  : " ; Fusing(t2 , "#.#") ; Chr(0) ; "C   "

        If Min2 > T2 Then Min2 = T2
         If Max2 < T2 Then Max2 = T2
  Locate 3 , 1
        Lcd "Min: " ; Fusing(min2 , "#.#") ; Chr(0) ; "C   "
  Locate 4 , 1
        Lcd "Max: " ; Fusing(max2 , "#.#") ; Chr(0) ; "C   "

End If
       1wreset

       Wait 3

Loop
End
 
Hallo,

ich bin ganz neu hier und habe einmal eine Fage zu diesem DS1820.

Ich habe mehrere solcher Sensoren im Einsatz, allerdings an einem Mini-Board (Brian Lane) das mit dem COM-Port am PC verbunden ist.
Mit der Uralt-Version von Digitemp (DOS) werden die Sensoren (aktuell 4) ausgelesen und die Temperaturen in einer Datei geloggt.
So weit, so gut.

Nun habe ich auf dem Dachboden noch ein Eval-Board von Achatz gefunden (schon ein paar Jahre alt) mit einem AT90S8515.
Ich habe ein GLCD 240x128 (t6963c) angeschlossen und kann das auch ansprechen.

Nun bin ich -angeregt durch diesen Thread- auch "heiss" drauf die über den AT einzulesen.

Ich probiere schon einige Tage mit allen möglichen Codes herum, abe rnichts will funktionieren.
Der einzige Code, der HALBWEGS was ÄHNLICHES (erstmal nur im Terminalfenster) anzeigt ist dieser (LCD wie gesat erstmal auskommentiert):

Code:
'------------------------------------------------------------------------------
' LCD:  Db4-Db7 = Portd.4-Portd.7 E = Portd.3 Rs = Portd.2 Backlight = Portb.1
' I2C:  Sda = Portc.4 Scl = Portc.5
' UART: RxD = Portd.0 TxD = Portd.1
' 1wire Portb.0
' Frei: Portb.2-Portb.5 Portc.0-Portc.3
'------------------------------------------------------------------------------
$regfile = "8515def.dat"
$crystal = 8000000
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
'DdrD = &HFF
'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
'Config Lcd = 16 * 2
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5
Dim Ar(2) As Byte
Cls
Do
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitms 200
 1wreset
 1wwrite &HCC
 1wwrite &HBE
 Ar(1) = 1wread(2)
 Waitms 500
 'Locate 1 , 1
 'Lcd Hex(ar(2)) ; Hex(ar(1))
 Print Hex(ar(2)) ; Hex(ar(1))
 'Locate 2 , 1
 Shift Ar(1) , Right , 1
 Print Ar(1)
 Wait 2
Loop
End

Ausgabe sieht folgendermassen aus:

1. Zeichen: das "mü"-Zeichen
2. Zeichen: ein C mit so einem komischen Haken unten dran
3. Zeichen: ein Ypsilon mit Ü-Stricheln
danach folgt x0x0x0x0
dann nochmal wie oben, also 1-3
dann ein "PIK".Zeichen
dann ein Pfeil nach oben
dann ein x

Ich habe den DS1820 mit GND an Ground, DQ ist an PortC.5 und von da über einen 47 K-WS an Strom
Vdd liegt dort ebenfalls an.

Was ist wohl verkehrt ? Kann da mal jemand drauf schauen ? :adore:

Danke schon mal im Vorraus und Gruss
Franky
 
Hallo Franky,
du hast im Programm keine Baudrate angegeben. Welche ist eingestellt?
Ich würde die immer explizit im Programm aufführen.
Jedenfals musst du im Programm und im Terminalfenster die gleichen Werte eingestellt haben. Außerdem muss die Frequenz vom 8515 mit der Crystal Angabe übereinstimmen.

HBA
 
Hallo HBA,

Vielen Dank erstmal für diesen Hinweis - tatsächlich habe ich die vergessen anzugeben. :vroam:
Nach Festlegung auf 19200 kommt nun folgendes:

0000
0

Auch bei allen anderen Beispielen kommt immer Null.

Der Sensor selbst funktioniert nach wie vor am Win-PC.

Habe eine externe Stromquelle mit 5V= angeschlossen:

Gnd an Minus Netzteil
Vdd an Plus Netzteil
DQ an PortC.5

Auch bei parasitärer Stromversorgung mit 4,7K Widerstand immer dasselbe.

Der 8515 hat doch 8 Mhz, also muss doch Chrystal auch auf 8000000 stehen - oder ?

Gruss
Franky
 
Hallo,

habe mal einen anderen Code probiert und bekomme folgendes im Terminalfenster:


This is a 2sensor DS18B20 thermometer
by gote@sys-op.com
CRC OK Sensor 1 ID
10
5F
18
33
00
08
00
05
CRC OK Sensor 2 ID
10
5F
18
33
00
08
00
05
Min Max
Min Max
850
850
850
850
850
850
850

Seltsam ist nur, dass ich Plus gemeinsam mit Minus an GND angeschlossen habe, den Sensor an PortC.5 und R 4,7K auf VCC.

Der Code des Sensors stimmt schon mal, auch wenn nur immer 85 Grad angezeigt wird.
Kann mal jemand sagen woran DAS nun liegen könnte ?
Laut Datenblatt muss der Anschluss ja wie oben beschrieben sein ?

Bn total ratlos...werkel schon tagelang mit diesem bl.... :p Sensor rum und komme einfach nicht weiter.

Gruss
Franky
 
JabbadabbaDuuuh !!!!

Mit folgendem Code bekomme ich Ergebnisse:

Code:
$regfile = "8515def.dat"
$crystal = 8000000
$baud = 19200
Config 1wire = Portc.5
Dim Ar(2) As Byte
Cls
Do
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitms 800
 1wreset
 1wwrite &HCC
 1wwrite &HBE
 Ar(1) = 1wread(2)
 Waitms 800
 Print Hex(ar(2)) ; Hex(ar(1))
 Shift Ar(1) , Right , 1
 Print Ar(1)
 Wait 2
Loop
End

Das Ergbnis sieht so aus:

002F
23
002C
22
002B
21

die 2.stellige Zahl ist die Temperatur die sich verändert (ebenso der Wert darüber)

Habe aber -wie gesagt- folgendermassen angeschlossen:
Sensor GND auf GND
Sensor Vdd auf GND
Sensor DQ auf PortC.5, von da aus mit R 4,7k auf +Volt

Warum das anders ist als im Datasheet beschrieben weiss der Deibel :)

Hauptsache es funzt jetzt :pleasantry:

Gruss
Franky
 
Hallo Franky!

Ich habe leider momentan wenig Zeit, um hier helfend mitzuwirken.... :eek:
Trotzdem möchte ich kurz etwas dazu schreiben. ;)


Zum Einen :
Das Ergbnis sieht so aus:

002F
23
002C
22
002B
21

Bist du sicher, dass die Temperaturwerte mit der Reaität übereinstimmen?
Du fragst zwar den Sensor in deinem Programm ab, aber berechnest die wirkliche Temperatur nicht. ;)
Schau noch mal ins Datenblatt! Dort werden min. zwei Formeln angegeben, wie du die Temperatur berechnen musst..... ob nun mit 0,5°C oder 0,1°C Auflösung.



Zum Anderen:
Habe aber -wie gesagt- folgendermassen angeschlossen:
Sensor GND auf GND
Sensor Vdd auf GND
Sensor DQ auf PortC.5, von da aus mit R 5,7k auf +Volt

Warum das anders ist als im Datasheet beschrieben weiss der Deibel :)

Auch dies müsste im Datenblatt beschrieben sein.
Wenn du den Sensor nicht mit einer separaten Spannung versorgen möchtest bzw. kannst, dann musst du ihn im "Parasit Power Modus" betreiben und dazu MUSS Vdd mit GND verbunden werden!

Seltsam ist nur, dass er mit separater Versorgungsspannung nicht funktionieren soll. :hmmmm:
Ich hätte dazu nur zwei Vermutungen....
Entweder ist die Versorgungsspannung nicht genug geglättet und die GND-Leitung ist nicht mit dem GND des Mikroconrollers verbunden.
Oder der Sensor hat einen Defekt..... ggf. duch kurzes Vertauschen der Anschlüsse.


Ich würde also vorschlagen:
Schau dir hier im Forum noch mal einige Beispiele zum Thema 1Wire-Temperatursensoren an (Suche ggf. mal mit Stichwort: DS18S20)....
und wirf noch mal den dritten oder vierten Blick ins Datenblatt zum Sensor! ;)

Gutes Gelingen weiterhin,
Cassio
 
Hallo Cassio,

habe jetzt einen Code der in 0,1-Schritten misst - funktioniert prima.

Die Temperatur stimmt, habe ja noch dieses PC-Board mit einem Sensor direkt neben dem anderen und stimmt bis auf ca. 0,2 Grad.

Hatte mir das Datenblatt nochmal vorgenommen und bestätigt gefunden, was Du geschrieben hast.
Bei non-paraite Power muss GND noch zsätzlich mit GND des Board verbunden sein - logischerweise :cool:
Aber wenn man so im "Fieber" ist übersieht man schon mal das eine oder andere :cool:

Hier der Beispielcode der bis auf einen Punkt funktioniert:
es wird immer "Steigend" angezeigt, niemals "Fallend".

Vielleicht kannst Du diesen Fehler ja noch finden :rolleyes:

Code:
$regfile = "8515def.dat"
$crystal = 8000000
$baud = 19200
' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
'Ddrc = &HFF
'Config Graphlcd = 240 * 128
'Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Porta , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 4 , Mode = 8
'Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Porta.3 , Rs = Porta.4
'Config Lcd = 16 * 2
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5
' Die Variablen:
Dim Dsid1(8) As Byte
Dim I1(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Integer
Dim Ia As String * 4
'----------------------Messung der Temperatur-----------------------------------
Do
  1wreset
   1wwrite &H44
   1wverify Dsid1(1)
   1wwrite &HBE
   I1(1) = 1wread(9)
 Wait 1
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Wait 1
   1wwrite &HBE
Wait 1
'Do
If I1(8) = Crc8(i1(1) , 7) Then
Crc = 0
End If
   If Crc = 0 Then
   Tmp = I1(1) And 1
   If Tmp = 1 Then Decr I1(1)
   T = Makeint(i1(1) , I1(2))
   T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
   T1 = T1 / I1(8) : T = T + T1 : T = T / 10
   End If
      If Crc = 1 Then
      'Cls
      'Locate 4 , 1 : Lcd " Sensor Error! "
      Print " Sensor Error! "
      Else
      'Locate 4 , 1
      Print "Temperatur:"
      If Crc = 0 Then
      'Locate 4 , 12
      Ia = Str(t)
      Print Left(ia , 2) ; "." ; Mid(ia , 3 , 1) ; Chr(0) ; " C"
'      Print "." ; Mid(ia , 3 , 1)
     ' Print Chr(0) ; "C"
      'End If
'-------------------------------------------------------------------------------
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist
If T < T1 Then
Print "Fallend"
Else
'If T = T1 Then
'Print "Konstant"
'Else
If T > T1 Then
Print "Steigend"
End If
End If
End If
End If
'End If
Wait 4
Loop
End
Return

Hatte auch (auskommentiert) Konstant eingefügt, geht aber genau so wenig wie Fallend.

Das Ergebnis ist Folgendes:
Temperatur:
20.9 C (ändert sich natürlich)
Steigend


Gruss
Franky
 
Hallo Franky!

Ich müsste zwar seit einer Stunde schon im Bett liegen, aber OK... ;)


Deinen Code habe ich mir nicht vollständig angesehen, aber der untere Teil wird so wohl auch nicht funktionieren.

Code:
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist 
If T < T1 Then 
Print "Fallend" 
Else 
'If T = T1 Then 
'Print "Konstant" 
'Else If T > T1 Then 
Print "Steigend" 
End If 
End If 
End If 
End If 
'End If 
Wait 4 
Loop 
End 
Return


Für große Erklärungen habe ich nun leider keine Zeit, aber versuch doch mal folgendes:
Code:
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist 
If T < T1 Then 
Print "Fallend" 
Elseif T = T1 Then 
'Print "Konstant" 
Elseif T > T1 Then 
Print "Steigend" 
Else
End If  
Return

Wie du siehst, liegt der "Trick" in "Elseif", dass nun wie ein "Oder" funktioniert.
Es kann beim Durchlaufen der IF-Else Schleife also immer nur EINE Wahrheit geben...... danach wir die Schleife sofort beendet.

Ich denke, es sollte funktionieren! ;)

Viel Spaß beim Ausprobieren!
Cassio
 
Hallo Cassio,

jepp - das war's.
Kenne mich im BASCOM nochnicht SOO gut aus, programmiere aber schon seit ca. 1983 in den unterschiedlichsten Basic's - aktuuel Visual Basic Express 2008, da kenne ich solche Befehle natürlich.

Nun gut, werde mir also beim nächsten Mal erstmal die Ref anschauen :D

Thx & gn8

Franky
 
Hallo Cassio,

jepp - das war's.
Kenne mich im BASCOM nochnicht SOO gut aus....

Hi!

Macht ja nichts!
Dafür sind wir ja da. ;)


Dann kann ich ja nun beruhigt zu Bett gehen! :boring: :sleep:

Gruß,
Cassio
 
Hallo Franky,

Deinen Code habe ich mir nicht vollständig angesehen, aber der untere Teil wird so wohl auch nicht funktionieren.

Code:
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist 
If T < T1 Then 
Print "Fallend" 
Else 
'If T = T1 Then 
'Print "Konstant" 
'Else If T > T1 Then 
Print "Steigend" 
End If 
End If 
End If 
End If 
'End If 
Wait 4 
Loop 
End 
Return
Aaahhhhh !!! Spaghetti-Code !! Und das ohne Ketchup :p
Code:
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist 
       If T < T1 Then 
         Print "Fallend" 
       Else 
         'If T = T1 Then 
           'Print "Konstant" 
         'Else If T > T1 Then 
            Print "Steigend" 
          End If 
        End If 
      End If 
    End If 
  'End If 
  Wait 4 
Loop 

End 
Return
Wenn du Einrückungen oder Tabulatoren verwendet hättest, wäre es
wesentlich übersichtlicher und man findet Fehler schneller.

Gruß
Dino
 
Hallo Franky!

Ich war in der Nacht bzw. am frühen Morgen wohl auch nicht mehr ganz bei der Sache.
Darum nun hier noch mal die überarbeitete (und sinnvollere) Version... ;)

Code:
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist 

[B]If[/B] T < T1 Then 
   Print "Fallend" 
[B]Elseif[/B] T > T1 Then 
   Print "Steigend" 
[B]Else[/B] 
   Print "Konstant" 
End If 
Return

Gruß,
Cassio
 
Hallo Cassio & Dino,

da war ich wohl zu voreilig, hatte das gepostet weil es mir logisch vorkam ohne es zu testen.
Habe sowohl das eine wie das Andere probiert, steht aber immer Steigend (habe das jetzt als +) angezeigt.

Hier der Code dazu:
Code:
Do
Dim Steuernvariable As Integer
' Temperatur einlesen von 1-wire Sensor(en)
   1wreset
   1wwrite &H44
   1wverify Dsid1(1)
   1wwrite &HBE
   I1(1) = 1wread(9)
 Wait 1
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Wait 1
   1wwrite &HBE
Wait 1
   If I1(8) = Crc8(i1(1) , 7) Then
   Crc = 0
   End If
   ' Schleife 1 START
   If Crc = 0 Then
      Tmp = I1(1) And 1
         ' Schleife 2 START
         If Tmp = 1 Then Decr I1(1)
         T = Makeint(i1(1) , I1(2))
         T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
         T1 = T1 / I1(8) : T = T + T1 : T = T / 10
         ' Schleife 2 ENDE
         End If
         ' Schleife 3 START
         If Crc = 1 Then
         Cls
         Locate 4 , 2 : Lcd " Sensorfehler ! "
            Else
               Locate 4 , 3 : Lcd "Temperatur:"
                  ' Schleife 4 START
                  If Crc = 0 Then
                  Locate 3 , 1 : Lcd "                                "
                  Locate 4 , 15
                  Ia = Str(t)
                  Lcd Left(ia , 2) ; "." ; Mid(ia , 3 , 1) ; " Celsius"
                  ' Schleife 4 ENDE
                  ' Schleife 5 START
                  If T < T1 Then
                  Locate 4 , 28 : Lcd "-"
                  Elseif T > T1 Then
                  Locate 4 , 28 : Lcd "+"
                  Else
                  Locate 4 , 28 : Lcd "="
                  ' Schleife 5 ENDE
                  End If
           ' Schleife 3 ENDE
           End If
    ' Schleife 1 ENDE
    End If
Wait 2
' Und wieder von vorne...
Loop
End

Habe auch schon verschiedene Positionen innerhalb DO...LOOP probiert, immer dasselbe.

Gruss
Franky
 
Hallo Franky!

Ich dachte mir schon, dass soetwas in der Art kommt. ;)

Die Auswertung von T und T1 haben wir ja nun schon angepasst.
Code:
If T < T1 Then 
  Print "Fallend" 
Elseif T > T1 Then 
  Print "Steigend" 
Else 
  Print "Konstant" 
End If 
Return

Allerdings werde ich aus deiner Rechnung nicht schlau. :hmmmm:
Ich habe sie mal zur besseren Übersicht untereinander gestellt:
Code:
T = Makeint(i1(1) , I1(2)) 
T = T * 50 
T = T - 25 
T1 = I1(8) - I1(7) 
T1 = T1 * 100 
T1 = T1 / I1(8)
[B]T = T + T1 
T = T / 10 [/B]

Also mich wundert es nicht, dass immer "steigend" ausgegeben wird.
Du addierst T und T1......anschließend wird T auf ein Zehntel "verkleinert".

Hast du dir die einzelnen Werte von T und T1 mal ausgeben lassen?
Ich bin der Meinung, dass T1 immer größer sein wird als T. :hmmmm:

Deine Temperaturrechnung zum DS1820 verstehe ich sowieso nicht so ganz, aber das nur nebenbei. ;)

Ach so....
Wenn du T und T1 vergleichen möchtest, um eine Tendenz zu erhalten, dann kannst du doch nicht beide Werte jedesmal neu berechnen.
Wozu soll der Vergleich bei dir denn eigentlich gut sein?


Gruß,
Cassio
 
Hallo Cassio,

den Teil habe ich aus einem beispielcode entnommen - aber auch dort hatte er nicht funktioniert.

Der Verfasser allerdings schrieb dass ein entsprechendes Symbol bei ihm angezeigt wird.

Wirklich verstanden habe ich den Abschnitt auch nicht, und nachgerechnet schon gar nicht :cool:

Nach Anzeige der beiden Parameter ergibt T 226 (bei 22.6 Grad) und T1 87
T1 verändert sich ja nach T-wert (ist klar), aber ist IMMER niedriger :confused:

Der Vergleich ist da, weil ich ja irgendwie feststellen muss ob sich T (zumindest hatte ich das so gedacht) gegenüber T1 verändert, um dann die If-Abfrage zu machen und die tendenz anzeigen zu lassen.

Gruss
Franky
 
den Teil habe ich aus einem beispielcode entnommen - aber auch dort hatte er nicht funktioniert.

Hallo Franky!

Na, da lag meine Vermutung doch richtig.... ;)
Irgendein kopierter Code, den man selber nicht versteht und daher auch keine Fehler finden kann. :cool:

Wie schon gesagt.... die Temperaturberechnung kann ich so nicht nachvollziehen.
Ich persönlich mache das nach Datenblatt und Lehrbuch. :)

Wie du aber auf die Werte von T und T1 kommst, kann ich auch nicht nachvollziehen. :hmmmm:
In deiner Formerl steht der Reihe nach:
T = T + T1
T = T / 10

Wenn T1 nun 87
und T angeblich 226 ist....

Dann wäre T vorher ja:
(T)226 x 10 = (T)2260
(T)2260 - (T1)87 = (T)2173

Vor deiner Berechung hatte T also den Wert von 2173 !
Was soll das sein? :hmmmm:

Ich habe hier bestimmt schon zig mal meine Temperaturberechnung ins Forum eigestellt..... aber OK, hier noch mal:



CodeBox bascom

'Variablen Dimensionierung
Config 1wire = Pinb.X
Config Single = Scientific , Digits = 1 ' Eine Stelle hinter Komma
Dim Ist_temp As Single ' Ist-Temperatur

Dim Temp As Word
Dim Temp1 As Integer
Dim Scratch(9) As Byte ' Array für Scratchpadrom
Dim I1w As Byte 'Schleifenzäher für 1Wire-Routine


.....
' 1Wire-Routine zum Abfragen und Berechnen
1wreset
1wwrite &HCC
1wwrite &H44

Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9 'Scratchpad in Array einlesen
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2) 'ab hier Temperatur berechnen
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25




Damit hast du als Ausgabe die richtig berechnete Temperaur als Single-Wert, mit einer Stelle nach dem Komma. ;)
Zum Beispiel: 22.6

Als nächstest musst du prüfen, ob T1 kleiner oder größer als Ist_temp ist.
Wenn das so ist, kannst du dir daraufhin die Tendenz anzeigen lassen und must gleich noch den Wert von Ist_temp in T1 übergeben.
Bei der nächsten Auswertung von Ist_temp beginnt dann das Spielchen von vorn. :)

Also so:
Code:
If Ist_temp < T1 Then 
   Print "Fallend"
   T1 = Ist_temp
Elseif Ist_temp > T1 Then 
   Print "Steigend" 
   T1 = Ist_temp
Else 
   Print "Konstant" 
End If

Kannst es ja mal ausprobieren und ggf. deinem Code anpassen.....

Gruß,
Cassio
 
Hallo Cassio,

das war die Lösung :)

Habe den ganzen anderen "Müll" entfernt - und nochmal in der Doku des Ur-Codes nachgeschaut:
der war gedacht um verschiedene Sensoren zu überwachen und deren Differenzen zu berechnen - aber speziell angepasst (wegen der "wilden" Berechnung).

Gruss
Franky
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)