Alternative zum BME280 gesucht

Begonnen von Persuasiv, 08 März 2018, 09:42:42

Vorheriges Thema - Nächstes Thema

Persuasiv

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

dkreutz

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...
Raspberry Pi3B+ (Bullseye) / JeeLink868v3c (LaCrosse), nanoCUL433 (a-culfw V1.24.02), HM-MOD-UART (1.4.1), TEK603, MapleCUL / diverse Sensoren/Sender/Aktoren von Technoline, Intertechno, Shelly, Homematic und MAX!, Froggit Wetterstation, Luftdaten.info / Autor des fhem-skill für Mycroft.ai

Persuasiv

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.

kadettilac89

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 :)

Persuasiv

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.

Frank_Huber


Persuasiv

#6
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?

kadettilac89

#7
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


Persuasiv

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.