Nabend Wir haben ein merkwürdiges Problem. Unser Messaufbau besteht aus DS18b20 Temperatursensoren, ATtiny84 und RFM12b Modulen. Jetzt haben wir festgestellt, dass Temperaturen über 32°C als negative Werte ausgegeben werden. Und es ist nicht einfach nur ein Minus vor dem Wert! An den Sensoren selbst kann es nicht liegen, denn wenn diese direkt am PC angeschlossen sind, messen sie ganz normal (bis 100°C getestet). Unser einziger Verdacht ist das es was mit der Anzahl der Stellen bei der Integer Variable zu tun hat. Gesendet werden die Werte ohne Kommata, d.h. 32000 sind 32,00°C. Und die Integerlänge bei 32Bit sind genau das doppelte. Sind wir auf der richtigen Spur, oder hat unsere Vermutung damit nix zu tun? Gruß Kolja
Kolja L. schrieb: > Unser einziger Verdacht ist das es was mit der Anzahl der Stellen bei > der Integer Variable zu tun hat. > Gesendet werden die Werte ohne Kommata, d.h. 32000 sind 32,00°C. 3 Nachkommastellen? Welchen Sinn soll das haben? > Und die Integerlänge bei 32Bit sind genau das doppelte. Kopfschüttel. 32 Bit für einen popeligen Temperaturwert, der sowieso nicht genauer als ein halbes Grad ist. Oder meintest du nicht eher 16 Bit? > oder hat unsere Vermutung damit nix zu tun? Code zeigen.
Kolja L. schrieb: > 32000 sind 32,00°C. > Und die Integerlänge bei 32Bit sind genau das doppelte. 16bit wolltest Du sagen. Google mal nach dem Wertebereich von int16_t und wie da die negativen Werte dargestellt werden. Stell stattdessen alles auf int32_t um oder (besser) verzichte stattdessen einfach auf eine Nachkommastelle, wahrscheinlich kannst Du sogar auf 2 Nachkommastellen verzichten für ein gewöhnliches Außenthermometer, genauer wirds eh kaum sein. 32,0°C wären dann 320, das ist wahrscheinlich genau genug.
Gast
#3987796
http://www.forum-raspberrypi.de/Thread-ds18b20-negative-werte-nach-temperaturanstieg ... und da auch nur eine vage beschreibung....
Ich würde zu eurem Projekt einen Programmierer hinzuziehen wenn da Programmiertätigkeiten anfallen. Der findet den Fehler, dafür ist er da.
x-post schrieb: > http://www.forum-raspberrypi.de/Thread-ds18b20-negative-werte-nach-temperaturanstieg > > ... und da auch nur eine vage beschreibung.... Na ja. Es ist aber klar was hier passiert. Eine signed 16 Bit Berechnung läuft irgendwo über. Die einzige offene Frage lautet: wo im Code ist die bewusste Stelle? Ohne Code allerdings schwer zu raten. Mit Code eine Sache auf ein paar Minuten.
Ich bin zumindest kein Programmierer :-) Hier mal unser Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
189 | |
190 | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
199 | |
200 | |
201 | |
202 | |
203 | |
204 | |
205 | |
206 | |
207 | |
208 | |
209 | |
210 | |
211 | |
212 | |
213 | |
214 | |
215 | |
216 | |
217 | |
218 | |
219 | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 | |
227 | |
228 | |
229 | |
Danke fürs Anschauen! Kolja
Gast
#3987814
Karl Heinz schrieb: > Na ja. > Es ist aber klar was hier passiert. Eine signed 16 Bit Berechnung läuft > irgendwo über. > Die einzige offene Frage lautet: wo im Code ist die bewusste Stelle? des wegen ja "vage" - kein aufbau - kein code - d18b20 einfach so in wasser stecken... vielleicht wäre für den ts besser mal eine genaue projektbeschreibung zu veröffentlichen, statt hinz und kunz mit seiner vagen definition über foren (x+n) an zu triggern. ich mag so was nicht!
Bingo
1 | |
sobald die Temperatur 32.767 Grad übersteigt, ergibt das einen satten Überlauf. Lasst doch den Blödsinn mit 3 Nachkommastellen! Mindestens 2 davon sind doch sowieso gelogen! 1 Nachkommastelle, die dafür gerundet, reicht völlig für den Hausgebrauch. Denn ob diese 1 überhaupt irgendwas mit der Realität zu tun hat, steht mehr als nur in den Sternen. Der Hersteller gibt selber an, dass die Sensoren nicht genauer als +-0.5°C sind. Was ihr hier betreibt sind Taschenspielertricks. Vortäuschen einer höheren Genauigkeit.
Hallo! Das sieht so aus, als wenn Du den float -Wert mit der Temperatur in einen int hineinschreibst; der ist nur 16 bit groß und damit bist Du bei Temperaturen > 32 Grad automatisch in den dann negativen Bereich gerutscht. mit uint32_t funktioniert es (ich habe ein ähnliches Modul hier laufen) VG Joachim
int Na also. Auf dem Arduino ist das nämlich, man höre und staune: 16bit! Auf dem Arm und dem x68 wäre er 32 Bit aber hier ist er eben nur 16 bit. Zielstrebig in die Falle getappt. wenn ihr 32 bit wollt dann nehmt explizit einen 32 bit Datentyp, nehmt int32_t und meidet diese mal-so-mal-so-weiis-nicht-genau-kommt-drauf-an typen wie int wie der Teufel das Weihwasser. nehmt von nun an nur noch diese hier: int32_t uint32_t int16_t uint16_t int8_t uint8_t und und lasst die Finger von dem eingebauten platformabhängigen C-Fossil int, das bringt nur Unglück. Nur Unglück. Finger weg davon.
Ups, da war karl heinz mal wieder schneller..... Ansonsten pflichte ich ihm bei: Nachkommastellen höchstens in den Bereich der Meßgenauigkeit legen. Alles andere ist sinnfrei
Gast
#3987835
Karl Heinz schrieb: > Lasst doch den Blödsinn mit 3 Nachkommastellen! Mindestens 2 davon sind > doch sowieso gelogen! Dann guck dir mal Temperaturverläufe an, die mit dem DS18B20 gemessen wurden. Die Auflösung des Sensor beträgt 1/16°C und die Standardabweichung des Rauschens der Rohdaten im Sensor liegt deutlich darunter. Da sind im Dezimalsystem zwei Nachkommastellen doch wohl angemessen, um die Daten zu übertragen. Bei Fixkommaübertragung bräuchte man allerdings nur vier "Nachkomma"-Bits.
Wolfgang A. schrieb: > Karl Heinz schrieb: >> Lasst doch den Blödsinn mit 3 Nachkommastellen! Mindestens 2 davon sind >> doch sowieso gelogen! > > Dann guck dir mal Temperaturverläufe an, die mit dem DS18B20 gemessen > wurden. Die Auflösung des Sensor beträgt 1/16°C Du kennst den Unterschied zwischen Auflösung und Genauigkeit? Der Hersteller gibt SELBST an, dass die Sensoren nicht genauer als plus minus ein HALBES GRAD sind! Auflösung hin oder her. Edit: zum mitmeisseln. Wenn dann am Display steht 23.458°C, dann könnten das auch 22.97° sein, wenn man mit einem geeichtem Präzisionsthermometer nachmisst. Es könnten aber auch 23.8° sein. Oder 23.95°. Oder irgendein anderer Wert dazwischen. Sehr sinnvoll, dann 3 Nachkommastellen auszugeben. Mal ganz davon abgesehen, das sich bezweifle, dass die Wassertemperatur am Ort des Sensors bis auf die 3. Nachkommstelle mit der Wassertemperatur 3 Zentimeter davon entfernt übereinstimmt.
Heijeijei, was ist denn hier los:-) Danke erstmal für den Hinweis mit den 3 Nachkommastellen. Werds aber erst morgen ändern können. Zur Genauigkeit: Uns reicht locker ein halbes Grad. Eigentlich auch ein Grad. Aber weil die "Dinger" das können, haben wir die 3. Nachkommastelle bis in die Datenbank gerettet. Um dort zu runden <- ist Quatsch, wissen wir jetzt auch. Wir hatten die Sensoren aber auch schon bei uns im Uni-Labor im Kallibrator (Venus irgendwas..). Und aus der Messreihe wissen wir, wenn ein plausibler Wert übertragen wird (damals nur über Kabel an GPIO) ist der bis 80°C auf 0,5°C genau. Im Bereich bis 50°C sogar noch genauer. Wenn ich mal Zeit habe, kann ich ja nochmal ne Messreihe durchfahren lassen. Das Ergebnis poste ich dann hier. Ist aber nicht wirklich interessant, steht ja schon im Datenblatt. Gruß Kolja
Gast
#3987915
Karl Heinz schrieb: > Du kennst den Unterschied zwischen Auflösung und Genauigkeit? Deswegen habe ich geschrieben Auflösung ;-) Ich habe hier genug von den DS18B20 für Differenzmessungen laufen. Nach eigener Kalibrierung ist es ziemlich egal, was der Hersteller als garantierte Genauigkeit über seinen Prozess angibt, solange die Sensoren stabil genug arbeiten, i.e. kalibrierfähig sind. > Mal ganz davon abgesehen, das sich bezweifle, dass die Wassertemperatur > am Ort des Sensors bis auf die 3. Nachkommstelle mit der > Wassertemperatur 3 Zentimeter davon entfernt übereinstimmt. Dann guck dir mal an, wie Temperatursensoren für die Ozeanographie kalibriert werden - und da sind mK gefragt. SBE verspricht für sein Kalibrierbad eine Homogenität auf 0.2mK
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.