Relative Luftfeuchte und Meteorologischer Luftdruck mit BME280

   IoT BME280 ESP8266 Arduino

Der BME280 misst neben der Temperatur auch den Absoluten Luftdruck und die Absolute Luftfeuchtigkeit. Benötigt werden aber die Relative Luftfeuchtigkeit und der Meteorologische Luftdruck. Diese Werte müssen berechnet werden.

Hier ein Codeschnipsel für die Arduino IDE um mit einem ESP8266 (hier ein Wemos D1 Mini) und einem BME280 beide Werte und den Taupunkt zu berechnen.

// ############################################

// Globale Konstanten
const float TempOffset (-1.0);       // der BME280 misst immer ca 1 Grad zuviel
const float HoeheAmMessort = 200.0;  // Hoehe des Messpunktes in Meter ueber NN

// Globale Variablen
float varTemp = 0.0;          // Variable zum lesen der Temperatur
float varFeuchteAbs = 0.0;    // Variable zum lesen der absoluten Luftfeuchte
float varDruckAbs = 0.0;      // Variable zum lesen des absoluten Luftdrucks
float varRelFeuchte = 0.0;    // Berechnete relative Luftfeuchte
float varTaupunkt = 0.0;      // Berechneter Taupunkt
float varMeteoDruck = 0.0;    // Berechneter meteorologischer Druck bezogen auf Meereshoehe

void LeseWerte() {
    
    // Konstanten fuer die Berechnungen
    const float SEALEVELPRESSURE_HPA = 1013.25;   // Normaldruck in hPa auf Meereshoehe
    const float TEMPGRADIENT = 0.0065;            // Temperaturgradient Celsius/Meter
    const float mw = 18.01534;                    // Molare Masse von Wasser g/mol
    const float r = 8.31447215;                   // Universelle Gas Konstante J/mol/K
    
    varTemp = bme.readTemperature();    // Temperatur einlesen
    varTemp = varTemp + TempOffset;     // Korrekturfaktor einrechnen
    varFeuchteAbs = bme.readHumidity(); // absolute Luftfeuchte einlesen
    varDruckAbs = bme.readPressure();   // absoluter Luftdruck einlesen
    varDruckAbs = varDruckAbs / 100;    // umrechnen in HektoPascal
    
    // Berechnung des Taupunktes
    varTaupunkt = (243.5 * (log(varFeuchteAbs/100) + ((17.67 * varTemp) / (243.5 + varTemp))) / (17.67 - log(varFeuchteAbs/100) - ((17.67 * varTemp) / (243.5 + varTemp))));
    
    // Berechnung der relativen Luftfeuchte
    varRelFeuchte = (6.112 * powf(2.718281828, (17.67 * varTemp) / (varTemp + 243.5)) * varFeuchteAbs * mw) / ((273.15 + varTemp) * r);
    
    // Berechnung des Luftdrucks bezogen auf Meereshoehe = Meteorologischer Luftdruck
    // erst Temperatur auf Meereshoehe = Temperatur in Kelvin + (Temperaturgradient * Hoehe)
    float varTempMeerK;
    varTempMeerK = varTemp + 273.15 + (TEMPGRADIENT * HoeheAmMessort);
    // dann Luftdruck auf Meereshoehe = AbsoluterLuftdruck / (1-((Temperaturgradient*Hoehe)/Temperatur auf Meereshoehe in Kelvin))^(0.03416/Temperaturgradient)
    varMeteoDruck = varDruckAbs / powf((1 - ((TEMPGRADIENT * HoeheAmMessort) / varTempMeerK)), (0.03416 / TEMPGRADIENT));

}

// ############################################