Forum: Mikrocontroller und Digitale Elektronik BME280 T zu hoch. Was mache ich falsch?


von Tobias S. (herrgesangsverein)


Lesenswert?

Hallo,

ich lese einen BME mit einem PIC18 über SPI aus.
Leider ist die Temperatur immer ca. 1,2K±0,6K zu hoch. Die Abweichung zu 
meinem Referenzthermometer ist nicht linear. Eigentlich dachte ich, dass 
der Sensor genauer ist.

Das Setup liegt aktuell offen auf meinem Tisch. Konvektion ist möglich.

Ich benutze den "Forced Mode", bei dem genau eine Messung gemacht wird, 
dazwischen schläft der Sensor. Die Messintervale sind 1 Minute. Ich will 
damit Eigenerwärmung auschließen.

Der BME hat eine recht komplizierte Kalibrierkurve. Ich befürchte, ich 
habe hier einen Fehler gemacht und kann ihn nicht finden.

Die Kalibrierwerte lese ich so aus:
1
void bme280_GetCalibParms() {
2
    char v;
3
    compParms.dig_T1=(unsigned short)read16LE(BME280_CAL_T1_16);
4
    compParms.dig_T2=read16LE(BME280_CAL_T2_16);
5
    compParms.dig_T3=read16LE(BME280_CAL_T3_16);
6
    compParms.dig_P1=(unsigned short)read16LE(BME280_CAL_P1_16);
7
    compParms.dig_P2=read16LE(BME280_CAL_P2_16);
8
    compParms.dig_P3=read16LE(BME280_CAL_P3_16);
9
    compParms.dig_P4=read16LE(BME280_CAL_P4_16);
10
    compParms.dig_P5=read16LE(BME280_CAL_P5_16);
11
    compParms.dig_P6=read16LE(BME280_CAL_P6_16);
12
    compParms.dig_P7=read16LE(BME280_CAL_P7_16);
13
    compParms.dig_P8=read16LE(BME280_CAL_P8_16);
14
    compParms.dig_P9=read16LE(BME280_CAL_P9_16);
15
    compParms.dig_H1=read8(BME280_CAL_H1_8);
16
    compParms.dig_H2=read16LE(BME280_CAL_H2_16);
17
    compParms.dig_H3=read8(BME280_CAL_H3_8);
18
    
19
    v=read8(BME280_CAL_H4_HI);
20
    compParms.dig_H4=v << 4;
21
    v=read8(BME280_CAL_H5_HI);
22
    compParms.dig_H5=v << 4;
23
    v=read8(BME280_CAL_H4H5);
24
    compParms.dig_H4|=(v & 0x0F);
25
    v>>=4;
26
    compParms.dig_H5|=(v & 0x0F);
27
    
28
    compParms.dig_H6=(signed char)read8(BME280_CAL_H6_8);
29
}

Die Kalibrierfunktion ist geklaut aus dem Datenblatt. Dort sieht sie so 
aus:
1
BME280_S32_t BME280_compensate_T_int32(BME280_S32_t adc_T)
2
{
3
BME280_S32_t var1, var2, T;
4
var1 = ((((adc_T>>3)  ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11;
5
var2 = (((((adc_T>>4)  ((BME280_S32_t)dig_T1)) * ((adc_T>>4)  ((BME280_S32_t)dig_T1)))
6
>> 12) *
7
((BME280_S32_t)dig_T3)) >> 14;
8
t_fine = var1 + var2;
9
T = (t_fine * 5 + 128) >> 8;
10
return T;

Bei mir sieht sie so aus. Ich habe nur die Typen ersetzt und die 
shift-Operationen durch arithmetrische Darstellung:
1
double bme280_CompensateT(long T) {
2
    long var1,var2,Tout;
3
    
4
    var1 = ((((T / 8) - ((int32_t)compParms.dig_T1 * 2))) *
5
         ((int32_t)compParms.dig_T2)) / 2048;
6
7
    var2 = (((((T / 16) - ((int32_t)compParms.dig_T1)) *
8
         ((T / 16) - ((int32_t)compParms.dig_T1))) / 4096) *
9
         ((int32_t)compParms.dig_T3)) / 16384;
10
11
    compParms.tFineTune = var1 + var2;
12
13
    Tout = (compParms.tFineTune * 5 + 128) / 256;
14
    return Tout;

Ist es normal, dass der Sensor solche Abweichungen hat?
Erwärmt er sich doch?
Ist meine Korrekturfunktion falsch?

von Kai B. (kaib) Benutzerseite


Lesenswert?

Das liegt eher am Sensor. Das Thema gab es hier auch schon hin und 
wieder.
Die Seite hat mal diverse Sensoren Verglichen.
https://www.kandrsmith.org/RJS/Misc/Hygrometers/calib_many.html#thermometer
https://www.kandrsmith.org/RJS/Misc/Hygrometers/absolutetemperature.html

Ich hatte vor ein paar Wochen auch mal ein paar Sensoren Verglichen 3x 
TMP117 2x SHT31 und eben BMP280/BME280 (von Digikey) je auf einer 
eigenen Platine. Während die Werte von TMP117 und SHT31 sehr eng 
zusammen lagen waren die Zwei BME280 um mindestens 0.5°C-1°C wärmer.

Das Bosch Datenblatt sagt dazu:
"Its output is used for temperature compensation of the pressure and 
humidity sensors and can also be used for estimation of the ambient 
temperature."
und
"Temperature measured by the internal temperature sensor. This 
temperature value depends on the PCB temperature, sensor element 
self-heating and ambient temperature and is typically above ambient 
temperature."

: Bearbeitet durch User
von Andreas B. (bitverdreher)


Lesenswert?

Tobias S. schrieb:
> Ist es normal, dass der Sensor solche Abweichungen hat?

Ja.

Kai B. schrieb:
> Während die Werte von TMP117 und SHT31 sehr eng
> zusammen lagen waren die Zwei BME280 um mindestens 0.5°C-1°C wärmer.

Kann ich fuer den SHT <-> BMP bestaetigen.
Fuer genaue Temperaturmessungen sind die Bosch absolut nicht zu 
empfehlen.

von Helmut -. (dc3yc)


Lesenswert?

Andreas B. schrieb:
> Fuer genaue Temperaturmessungen sind die Bosch absolut nicht zu
> empfehlen.

Dafür sind sie auch nicht gemacht, siehe Datenblattauszug oben!

von Rainer W. (rawi)


Lesenswert?

Tobias S. schrieb:
> Was mache ich falsch?

Datenblatt nicht gelesen

Andreas B. schrieb:
> Fuer genaue Temperaturmessungen sind die Bosch absolut nicht zu
> empfehlen.

Das ist bei dem Sensor auch nicht der Anspruch von Bosch - wer lesen 
kann, ist klar im Vorteil:
"... estimation of the ambient temperature"
estimation = (engl.) für Abschätzung

: Bearbeitet durch User
von Tobias S. (herrgesangsverein)


Lesenswert?

Vielen Dank für die schnellen Reaktionen.

+-0.3K wären erträglich gewesen. Denn die zu messenden Temperaturen 
bewegen sich zwischen 19-24°C. Ich hatte auch einen Offset-Parameter 
vorgesehen, um Sensor-zu-Sensor-Abweichungen auszugleichen, aber so sind 
sie wirklich nicht zu verwenden.

Ich werde mir mal die genannten Alternativen anschauen.

von Εrnst B. (ernst)


Lesenswert?

Tobias S. schrieb:
> aber so sind
> sie wirklich nicht zu verwenden.

Doch, der Temperaturwert aus dem BME280 ist exakt für einen Zweck zu 
verwenden:
Als Input für die Formeln um Luftdruck und -Feuchtigkeit zu berechnen. 
Dafür ist er da, und wenn du in die Formeln einen anderen (egal ob 
präziser) Temperaturwert von einem Fremd-Sensor einsetzt, erreicht der 
BME nicht mehr die Genauigkeit aus dem Datenblatt...

von Tobias S. (herrgesangsverein)


Lesenswert?

Das habe ich gar nicht gemeint.
Ich werde die Funktion des BME so lassen wie sie ist und zusätzlich 
einen geeigneten T-Sensor einzubauen.

Eigentlich sollte die Schaltung primär die Temperatur in den Räumen 
messen, Luftdruck und Feuchte waren eine nette Zugabe.

Wegen des Displays habe ich mich für SPI entschieden. Entweder ich 
ersetze den BME durch einen besseren T Sensor und verzichte auf die 
anderen Parameter oder ich finde einen, den ich noch dazu einbauen kann.

von Andreas B. (bitverdreher)


Lesenswert?

Tobias S. schrieb:
> Ich werde die Funktion des BME so lassen wie sie ist und zusätzlich
> einen geeigneten T-Sensor einzubauen.

Da wirst Du nicht drumrumkommen.
SHT4x wenn Du auch rH gebrauchen kannst (in Kombination mit dem BMP).

: Bearbeitet durch User
von Tobias S. (herrgesangsverein)


Lesenswert?

Der BME liefert bereits Feuchte. Ich dachte einfach einen DS1820 zu 
nehmen. Das hat für mich einige Vorteile:

Die Schaltung und das Druckteil, wo sie rein soll, ist weitgehend 
fertig.

Eine Bibliothek für Onewire und DS1820 hab ich auch.

Ich muss keine weitere Platine mit mir fast unlötbaren Teilen machen.

Ich weiß nicht, ob es "bequeme" Sensoren für SPI gibt, denn die könnte 
ich recht leicht anschließen.

von Andreas B. (bitverdreher)


Lesenswert?

Tobias S. schrieb:
> Der BME liefert bereits Feuchte.

Stimmt, ich dachte, das macht nur der BMP.

> Ich dachte einfach einen DS1820 zu
> nehmen.

Die Dinger sind gut. Kommen meist auf 0.1 Grad Abweichung (jedenfalls, 
wenn sie richtig angesteuert werden. Da gibt es hier schon einige 
THreads dazu).

> Ich muss keine weitere Platine mit mir fast unlötbaren Teilen machen.

Hmm, dann den BMP/BME auswaehlen? ;-)

von Tobias S. (herrgesangsverein)


Lesenswert?

Andreas B. schrieb:
>
> Hmm, dann den BMP/BME auswaehlen? ;-)

Den gab es beim Chinamann auf einer kleinen Platine. Ich hatte mal ein 
paar einzelne bestellt, aber nicht gelötet bekommen.

von Andreas B. (bitverdreher)


Lesenswert?

Tobias S. schrieb:
> Den gab es beim Chinamann auf einer kleinen Platine. Ich hatte mal ein
> paar einzelne bestellt, aber nicht gelötet bekommen.

Ah, ok. Ich muß zugeben, bei diesen Dingern stoße ich auch ziemlich an 
meine Grenzen. Geht aber gerade noch so (T-962 mit handgeschmierter 
Paste ;-) ).
Es gibt von den SHTs auch Breakoutboards (die würde ich aber nicht in CN 
bestellen), z.B:
https://www.mouser.jp/ProductDetail/DFRobot/SEN0428?qs=Rp5uXu7WBW%252BVV8ZyuS6LxQ%3D%3D
Auch Sensirion selbst hat welche. Nur falls Du mal mit spielen möchtest 
(abgesehen von Deinem aktuellen Projekt).

von Vanye R. (vanye_rijan)


Lesenswert?

> Die Dinger sind gut. Kommen meist auf 0.1 Grad Abweichung (jedenfalls,
> wenn sie richtig angesteuert werden.

Erzaehl mal wie das geht wenn das DAtenblatt auf Seite 1 sagt:

• ±0.5°C accuracy from –10°C to +85°C

Und der 1820 ist deshalb relativ teuer weil er vom Hersteller mit
dem Laser abgeglichen wird. Wenn man glaubhafte Messungen im Bereich 
0.1Grad haben will dann wird das sehr aufwendig und teuer. Und dann 
kommen noch die ganzen Fehler vom Aufbau hinzu. Es macht eigentlich 
keinen Sinn bei den ueblichen Sensoren eine Nachkommastelle anzuzeigen. 
Ich weiss, ist doof weil man das irgendwie gewohnt ist. :)

Vanye

von Andreas B. (bitverdreher)


Lesenswert?

Vanye R. schrieb:
> Erzaehl mal wie das geht wenn das DAtenblatt auf Seite 1 sagt:
>
> • ±0.5°C accuracy from –10°C to +85°C

Das ist die max Abweichung, die garantiert wird!
In der Praxis kommst Du meist auf 0.1°C.

> Wenn man glaubhafte Messungen im Bereich
> 0.1Grad haben will dann wird das sehr aufwendig und teuer.

Das Problem ist generell die Messung in der Luft. Da ist es schon schwer 
1° Abweichung einzuhalten (Konvektion/Wärmestrahlung).

Um die o.a. 0.1°C nachzuweisen, habe ich mal ein 10er Pack Sensoren in 
mehrere Lagen Luftpolsterfolie eingewickelt, in eine Box gestopft und 1h 
gewartet. Dann liegt man bei den meisten Sensoren (ich meine, 7 wären 
das gewesen) bei der gleichen T +/- 0.1°C.

Edit: Ah, ja, wirf mal einen Blick auf Fig. 17 im DB.
Edit 2: Sorry, beim aktuellen DB ist das Figure 1. Typical Performance 
Curve

: Bearbeitet durch User
von Vanye R. (vanye_rijan)


Lesenswert?

> Das ist die max Abweichung, die garantiert wird!

Das ist das einzige was zaehlt. Wirf mal einen Blick auf die
heiligen Woerter von Bob Pease wie man Datenblaetter liesst. :-)

> In der Praxis kommst Du meist auf 0.1°C.

Und ich gehoere zur Gruppe der Menschen die typisch 100m in 10s laufen 
koennen. Es gibt aber Absolutwerte  die ich jetzt nicht definieren will. 
:-D


Aber wenn es nur um die Anzeige der Zimmertemperatur geht dann ist es ja 
egal.

BTW: Bei Sensoren wie den BME280 oder anderen ist schon das erste 
Problem das sie auf einer Platine geloetet werden. Die ist ja fuer 
gewohnlich dann auf einer Platine mit anderen Dingen und 
schlimmstenfalls auch noch in einem Gehaeuse. Danach misst man sowieso 
nur noch hausnummern. Aber wie ja schon jemand sagte, beim BME ist das 
vollkommen egal weil dessen Werte nur zur Berechnung des Luftducks 
gebraucht werden.

Vanye

von Andreas B. (bitverdreher)


Lesenswert?

Vanye R. schrieb:
> Das ist das einzige was zaehlt. Wirf mal einen Blick auf die
> heiligen Woerter von Bob Pease wie man Datenblaetter liesst. :-)

Wenn Du was verkaufen willst, ja, da stimme ich Dir zu.
Hier geht es aber um Eigenbau und einer gewünschten Abweichung von 0.3°C 
Zimmertemperatur, die in der realen Messung eh nicht realisierbar ist, 
egal mit welchem Sensor.
Wenn Du Dir die Typical performance curve mal angeschaut hättest, 
würdest Du feststellen, daß innerhalb des vom TO gewünschten 
Temperaturbereiches die Abweichung (mit 3 sigma) etwa -0.45 + 0.05 
beträgt. Jetzt noch 0.2 °C zu den gemessenen Wert addieren und Du bist 
auch lt. DB schon recht nahe an der 0.1 °C Abweichung dran.
Typisch ok und nicht garantiert. Das habe ich schon verstanden. Und wie 
ich oben festgestellt hatte, lagen 7 von 10 Sensoren auf der gleichen T 
+/- 0.1°C.

> Bei Sensoren wie den BME280 oder anderen ist schon das erste
> Problem das sie auf einer Platine geloetet werden.

Bosch nennt auch die Abweichungen/Drift nach 5 Reflow Zyklen im DB. Also 
so völlig zufällig sind die Ergebnisse dann nicht.
Und was den Montageort betrifft: Natürlich misst man die Chiptemperatur 
und nicht irgendeine gewünschte Aussentemperatur. Die spukhafte 
Fernwirkung gibt es hier wirklich nicht. ;-) Ich gehe mal davon aus, daß 
dies auch dem TO bekannt ist.

Eigentlich sind wir ja einer Meinung. Ich sehe es halt für diesen 
Anwendungfall aus o.g. Gründen etwas lockerer.

von Tobias S. (herrgesangsverein)


Lesenswert?

Ich möchte diesen Thread nochmal aufwärmen.

Ich habe jetzt einen DS1820 verbaut. Und ich habe wieder das Problem, 
dass er um 1-3K über meiner Referenz liegt. Und das nicht mit einem 
konstanten Offset.

Dabei habe ich ihn schon 10mm von der Leiterkarte abgesetzt. Er sitzt in 
einer Fassung unten in der Frontblende und hat ein 2mm Loch zum Raum 
hin.
Die Schaltung sitzt in der UP-Dose und braucht sicher nicht mehr als 
100mW.

Wie kann denn das sein? Muss ich den Sensor immer von der Versorgung 
trennen damit er sich nicht erwärmt? Ich frage ihn nur einmal pro Minute 
ab.

Wie macht ihr das denn?

von Andreas B. (bitverdreher)


Lesenswert?

Tobias S. schrieb:
>
> Wie macht ihr das denn?

Die Referenz thermisch mit dem Sensor koppeln. Du wirst naemlich 
feststellen, dass die Raumtemperatur sich ganz erheblich aendert, je 
nachdem wo Du misst. Und die T in irgendeiner Unterputzdose hat mit der 
RT nun mal recht wenig zu tun.
20cm Abstand koennen schon locker 1 Grad Differenz bringen. Nicht 
umsonst sind die Wetterstationen einheitlich aufgebaut, um die an 
verschiedenen  Standorten gemessenen T vergleichen zu koennen.

von Helmut -. (dc3yc)


Lesenswert?

Tobias S. schrieb:
> Dabei habe ich ihn schon 10mm von der Leiterkarte abgesetzt. Er sitzt in
> einer Fassung unten in der Frontblende und hat ein 2mm Loch zum Raum
> hin.
> Die Schaltung sitzt in der UP-Dose und braucht sicher nicht mehr als
> 100mW.
>
> Wie kann denn das sein?

Deine Mauer speichert ja Wärme. Lange mal an eine Außenmauer in deinem 
Zimmer und dann an eine Innenmauer. Da wirst du momentan ganz schöne 
Unterschiede merken. Außer du hast so stark gedämmte Außenwände, dass 
kein Luftaustausch stattfindet. Oder du misst am Fußboden und an der 
Decke. Auch da gibt's beträchtliche Unterschiede, da warme Luft nach 
oben steigt.
Als Abhilfe könntest du hinter das Loch einen kleinen Lüfter setzen, der 
die Raumluft ANsaugt und auf den Fühler bläst.

von Tobias S. (herrgesangsverein)


Lesenswert?

Ich messe an einer Innenwand auf 1,5m, wo normalerweise die Thermostate 
angebracht sind. Ja, wir haben sehr gut gedämmte Wände und eine aktive 
Belüftung. Die Raumtemperatur schwankt um max. +-1K. Ich gehe davon aus, 
dass Wand und Raum nahe dem thermischen Gleichgewicht sind. Die 
Luftfeuchtigkeit ist aktuell auch niedrig.

Meine "Referenz" ist ein kleines Batteriethermometer. Wenn ich das in 
die UP-Dose stelle, ändert sich dessen Temperatur gar nicht (20.9°C). 
Die Schaltung hängt jetzt am Kabel vor der Dose und misst 22,1°C.

von Helmut -. (dc3yc)


Lesenswert?

Tobias S. schrieb:
> Meine "Referenz" ist ein kleines Batteriethermometer. Wenn ich das in
> die UP-Dose stelle, ändert sich dessen Temperatur gar nicht (20.9°C).

Wenn du sowas als Referenz nimmst, kannst du deine weiteren "Messungen" 
vergessen.

von Tobias S. (herrgesangsverein)


Lesenswert?

> Wenn du sowas als Referenz nimmst, kannst du deine weiteren "Messungen"
> vergessen.
Mag sein, aber kalibrierte Thermometer sind mir zu teuer. Die 
Absolutgenauigkeit muss ja nicht 0,1 sein. Es wäre doch aber schön, wenn 
sich beide Messungen annähernd gleich verhalten würden. Wir haben es 
sicher nicht 24-25°C zuhause, sondern eher die 21C.

von Rainer W. (rawi)


Lesenswert?

Vanye R. schrieb:
> . Es macht eigentlich keinen Sinn bei den ueblichen Sensoren eine
> Nachkommastelle anzuzeigen. Ich weiss, ist doof weil man das irgendwie
> gewohnt ist. :)

Das kommt immer noch drauf an, ob man am absoluten Wert oder an 
Änderungen interessiert ist.

von 900ss (900ss)


Lesenswert?

Tobias S. schrieb:
> Meine "Referenz" ist ein kleines Batteriethermometer.

Nimm einen SHT4x Sensor als Referenz. Einem unbekannten 
Batteriethermometer würde ich nicht trauen.

Und die Boschsensoren als Feuchtemesser sind auch nicht das wahre. Ich 
habe ein paar verglichen in einem geschlossenen Gehäuse mit Salzlösung. 
Nur die Boschsensoren Wochen ca. 7% von den anderen an. Ich habe mehrere 
probiert.
Und ähnliches haben auch schon andere Leute heraus gefunden.

: Bearbeitet durch User
von Michael L. (nanu)


Lesenswert?

Tobias S. schrieb:
> Ich habe jetzt einen DS1820 verbaut. Und ich habe wieder das Problem,

Wo gekauft? Was hat er gekostet?

> dass er um 1-3K über meiner Referenz liegt. Und das nicht mit einem
> konstanten Offset.

Fake? Schlechte Kopie?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.