hi,
der BME280 gibt die Temperatur systematisch um ca. 1 K zu hoch an. Die relative Luftfeuchte wird um ca. 10 % zu gering angegeben. Deswegen bin auf der Suche nach einem Sensor, der die Temperatur und die Luftfeuchte etwas genauer erfassen kann. Folgende habe ich bisher gefunden:
HDC1008 ±4 % & ±0.2 °C
HTU21D-F ±2 % & ±1 °C
Si7021 ±3 % & ±0.4 °C
SHT31-D ±2% & ±0.3 °C
Gibt es noch alternative Vorschläge? Ich tendiere derzeit zum SHT31-D ...
Besten Dank
Du sagst nichts zu Deinem Anwendungsfall... Wenn die Abweichung (gegenüber welcher Referenz? ist die geeicht?) konstant ist, kann man ja auch mit Korrekturfaktoren arbeiten. In ESPeasy kann man die z.B. direkt eintragen. Auch wenn ein anderer Sensor auf dem Datenblatt bessere Werte hat - es gibt immer noch Serienstreuung, insbesondere bei den Sensoren aus Chinaproduktion...
ZitatDu sagst nichts zu Deinem Anwendungsfall...
Ich möchte die Temperatur & Luftfeuchte möglichst genau erfassen.
Zitat
Wenn die Abweichung (gegenüber welcher Referenz? ist die geeicht?)
Ein Vergleich mit einer sehr nah gelegenen offiziellen Wetterstation lässt mich letzteres vermuten. Heute Nacht lag die Luftfeuchte bei der offiziellen Station beispielsweise bei maximal 96 %. Ich habe lediglich einen Wert von 85 % gemessen. Im ganzen Februar habe ich nie einen Wert von > 90 % nachweisen können.
Mir ist nicht bekannt, ob es sich um einen konstanten offset handelt. Die Sensoren & das Gateway habe ich selber gebaut.
Zitat von: Persuasiv am 08 März 2018, 09:42:42
hi,
der BME280 gibt die Temperatur systematisch um ca. 1 K zu hoch an. Die relative Luftfeuchte wird um ca. 10 % zu gering angegeben. Deswegen bin auf der Suche nach einem Sensor, der die Temperatur und die Luftfeuchte etwas genauer erfassen kann. Folgende habe ich bisher gefunden:
HDC1008 ±4 % & ±0.2 °C
HTU21D-F ±2 % & ±1 °C
Si7021 ±3 % & ±0.4 °C
SHT31-D ±2% & ±0.3 °C
Gibt es noch alternative Vorschläge? Ich tendiere derzeit zum SHT31-D ...
Besten Dank
Dass BME280 1 Grad zu viel anzeigt hab ich auch bei mehreren.
Mein Setup
1) SHT31 ... läuft, ist genau, keine Probleme in Innenräumen. Hohe Genauigkeit nur ab 0 Grad gegeben, lt. Datasheet. Habe im Außeneinsatz nicth getestet
2) BME280 + DS18B20 für außen, Temperatur über DS1820, Luftfeuchteberechnung vom BME280 um 1 Grad korrigiert, Luftdruck passt. Läuft auch
3) DHT22 verbannt, zeigen zu Beginn korrekte Werte an, nach ein paar Monaten sind die Werte weit außerhalb der Spezifikation. Zumindest die im Einsatz waren
Definition von genau:
- mehrere Sensoren außen aufgestellt, mit naheliegener Wetterstation verglichen, wer abweicht ist ungenau.
- Sensoren in Eiswasser gelegt, Temperatur sollte ca. 0 Grad sein ... Details Google befragen :)
- Luftfeuchte mit Salzwasser testen --> 75% OK ... Details Google befragen :)
ZitatLuftfeuchteberechnung vom BME280 um 1 Grad korrigiert
Wie hast du das gemacht?
float Adafruit_BME280::readTemperature(void)
{
int32_t var1, var2;
int32_t adc_T = read24(BME280_REGISTER_TEMPDATA);
if (adc_T == 0x800000) // value in case temp measurement was disabled
return NAN;
adc_T >>= 4;
var1 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) *
((int32_t)_bme280_calib.dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) *
((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) *
((int32_t)_bme280_calib.dig_T3)) >> 14;
t_fine = var1 + var2;
float T = (t_fine * 5 + 128) >> 8;
return T/100;
}
/**************************************************************************/
/*!
@brief Returns the humidity from the sensor
*/
/**************************************************************************/
float Adafruit_BME280::readHumidity(void) {
readTemperature(); // must be done first to get t_fine
int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA);
if (adc_H == 0x8000) // value in case humidity measurement was disabled
return NAN;
int32_t v_x1_u32r;
v_x1_u32r = (t_fine - ((int32_t)76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) -
(((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
(((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
((int32_t)2097152)) * ((int32_t)_bme280_calib.dig_H2) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
((int32_t)_bme280_calib.dig_H1)) >> 4));
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
float h = (v_x1_u32r>>12);
return h / 1024.0;
}
Scheinbar muss der Wert t_fine irgendwie angepasst werden.
Zitat von: kadettilac89 am 08 März 2018, 10:40:44
- Sensoren in Eiswasser gelegt, Temperatur sollte ca. 0 Grad sein ... Details Google befragen :)
https://wiki.fhem.de/wiki/Eichung_von_1-Wire_Temperatursensoren
Das ist mir klar. Mein offset beträgt 0,68 °C ... Nur wie setzte ich das in der library um? Folgendes würde mir zwar die richtige Temperatur liefern, aber intern wir ja mit t_fine weiter gerechnet.
t_fine = var1 + var2;
float T = (t_fine * 5 + 128) >> 8;
T = T/100 - 0,68;
return T;
D.h. ich muss t_fine irgendwie umbiegen, um die Berechnung der Luftfeuchte beeinflussen zu können. Nur weiß ich nicht was t_fine überhaupt ist ^^ Den Operator ">> 8" verstehe ich auch nicht. Wozu dient der?
Zitat von: Persuasiv am 08 März 2018, 12:28:16
Wie hast du das gemacht?
Korrektur der Luftfeuchte war etwas komplizierter. t_fine hab ich nicht angefasst.
Habe mir zusätzliche Funktionen gebaut. Die vom BME280 gelieferte Temperatur und Luftfeuchte liegt ja vor. Ich habe zusätzlich einen DB18B20 Temperatursensor der genau misst.
1) Relative Luftfeuchte auf absoltute Luftfeuchte umrechnen ... hier ist die Temperatur vom BME280 zu verwenden
2) aus der berechneten absoluten Luftfeuchte und der Temperatur vom DS18B20 die "genauere" relative Luftfeuchte berechnen.
Ich habe den Sensor schon lange im Einsatz und nur einmal gebaut. Ich schau mal nach, ob ich den Sourcecode noch finde, weiß aber aktuell nicht ob ich da noch was hab. Läuft bei mir in einen HM-Sensor Nachbau.
Wenn du mathematisch ein bischen fit bist (Formeln umstellen und so) ... und fähig das auch in C++ umzusetzen kannst du dir von Wikipedia oder Google die Formeln suchen und umstellen. Es gibt hier im Forum auch Posts die sich mit Lüftersteuerung befassen, ich denke dort könntest auch Codefragmente finden, da geht es auch um Feuchte in abhängigkeit zu Temperatur.
Alternativ einen SHT31 für 4 Euro kaufen und zusammen mit einem BME280 verbauen. Der BME280 liefert dann nur noch Luftdruck.
Nachtrag:
hier hast ein Python-Script in dem die Konvertierung in beide Richtungen enthalten ist. Wie genau die ist, weiß ich nicht, aber du kannst ggf. die Berechnung übernehmen.
https://github.com/OzFlux/OzFluxQC/blob/master/scripts/meteorologicalfunctions.py
Besten Dank für den Hinweis. Mit folgender Formel kann man es korrigieren:
ZitatAbsolute Humidity (grams/m3) = 6.112 x e^[(17.67 x T)/(T+243.5)] x rh x 2.1674 x (273.15+T)^-1
Ich hatte gehofft mit der library arbeiten zu können. Da reichen aber meine rudimentären Programmierkenntnisse nicht hin.