Hallihallo zusammen,
zu Testzwecken habe ich meinen Temperaturlogger für 24h ins Tiefkühlfach des Kühlschrankes befördert. Ich wollte sehen, ob er negative Temperaturen sauber und ohne Fehler misst.
Dies tut er jedoch nicht so recht zu meiner Zufriedenheit.
Der Sensor ist ein DS1631. Er kommuniziert per I2C mit einem AVR und überträgt so die Temperaturdaten.
Die Folgende Datenreihe(Ausschnitt) soll nun das Problem zeigen:
-9.875
-9.875
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.0
-9.9375
-9.0
-9.9375
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-10.0625
-10.0625
-10.0625
-9.0
-10.0625
-10.0625
-10.0625
Wie man sieht, tritt das Problem beim Wechsel der Einer auf. Dies ist auch bei allen anderen Wechseln so, also auch beim Wechsel von
-1.9375 auf -2 etc. (-1.9375 ==> -1.0 ==> -2.0625)
Hier am Beispiel wird anstelle von -10.0 eine -9.0 angezeigt... Der Logger liegt im Kühlfach und kühlt sich stetig ab. nach den -9.9375 sollte logischerweise die -10°C kommen... Doch es kommt eine -9.0, was ja nicht sein kann.
Auch nachher, als er von -10.0625 wieder auf -10 wechseln will, zeigt er eine -9 an...
Zum System: Die Daten werden auf einer SD-Karte gespeichert und per UART ans Terminal geschickt.
Der Sensor sendet zwei Bytes für einen Temperaturwert. Das erste Byte beinhaltet den Kram links vom Komma, das zweite Byte beinhaltet die Nachkommastellen.
Ist die Temperatur negativ, werden die Bytes vom Thermometer invertiert und dann ausgegeben.
Nun frage ich mich, wo der Fehler liegt. Bei meiner Software oder beim Sensor. Ich verdächtige irgendwie die Software, da dieses Problem nur bei negativen Zahlen auftritt. Allerdings wandelt meine Software den Wert des Thermometers eigentlich korrekt um.
Für eine -9.9375 werden vom Thermometer folgende zwei Bytes übertragen:
0b11110110 für die -9
und
0b00010000 für die 0.9375
Wechselt die Temperatur auf -10°, so kommen vom Thermometer folgende Werte:
0b11110110 für die -9 (NICHT -10° wie es sollte..)
und
0b00000000 für die 0.0
Diese Werte habe ich mir zu Testzwecken auch per UART ausgeben lassen. Dies weist ja eigentlich darauf hin, dass der Fehler beim Thermometer liegt und mein "Umwandlungsalgorithmus" funktioniert...
Hier der Code, der aus den zwei Thermometer-Bytes die Temperatur zusammenfrickelt:
| Code : |
Twidaten1 = Karte(zähler) 'erstes Thermo-Byte aus der SD
Incr Zähler
Twidaten2 = Karte(zähler) 'zweites Thermo-Byte aus der SD 'twidaten2 = nachkommastelle, twidaten1 = vorkomma
Incr Zähler
'für negative Temperaturen:
If Twidaten1 > 127 Then ' Dann ist die Sache negativ
Twidaten1 = 255 - Twidaten1
Temp1 = Str(twidaten1)
Temp1 = "-" + Temp1 'für den Minus-Strich
Rotate Twidaten2 , Right , 4 ' Die Nachkommastelle bearbeiten
Temperatur = 16 - Twidaten2
Temperatur = 0.0625 * Temperatur
Temp2 = Str(temperatur)
Temp2 = Mid(temp2 , 2 , 5) 'schneidet das "0." ab.
Print Temp1 ; Temp2 'Die Vor- und Nachkommastellen ausgeben
Elseif Twidaten1 <= 127 Then ' für positive temperaturen
Rotate Twidaten2 , Right , 4 'Nur Nachkommastelle bearbeiten
Temperatur = Twidaten2
Temperatur = 0.0625 * Temperatur 'Nachkommastelle
Temp2 = Str(temperatur) 'schneidet das "0" ab.
Temp2 = Mid(temp2 , 2 , 5)
Print Twidaten1 ; Temp2
End If
|
|
Wie gesagt, für positive Temperaturen funktioniert alles tipptopp, nur bei negativen Temperaturen klappt der Wechsel auf den nächsten Einer nicht wie er soll. Anscheinend kommen vom Temperatursensor falsche Daten...
Oder liegt der Fehler beim Programmcode?
Sieht jemand auf den ersten Blick einen groben Fehler oder weiss Rat?
Im Prinzip funktioniert die Sache ja...
Herzlichen Gruss
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com